LPIC-1 Tema 103.6: modificar la prioridad de procesos en ejecución

En el anterior artículo de la serie LPIC-1 mostré algunas herramientas para poner en marcha algunos procesos en primera y segundo plano, cómo suspenderlos, reanudarlos, y multitud de herramientas para obtener información sobre los procesos y algunos recursos que ocupaban en el sistema. Este nuevo tema 103.6 para estas certificaciones estará dedicado a ampliar esos conocimientos y dar un paso más.

En las preguntas del examen sobre este tema se te preguntará sobre la gestión de procesos en ejecución, más concretamente sobre cómo modificar su prioridad. Para ello debes saber cuál es su prioridad por defecto cuando se crea un proceso o tarea en el sistema operativo, correr procesos con una prioridad mayor o menor en función de la carga de trabajo y necesidades, así como cambiar la prioridad de un proceso que ya está en marcha.

Herramientas para modificar la prioridad de procesos

Como sysadmin debes conocer algunas herramientas básicas para conocer y modificar la prioridad de procesos. para que el scheduler o planificador del kernel los trate con mayor o menor preeminencia.

ps y top

Con ps, top y htop se pueden conocer las prioridades que tienen los procesos. Puedes usar esos comandos como especifiqué en ese artículo anterior o afinar un poco más y que muestren solo la información que estás buscando.

Lo que sí debes diferenciar es entre la columna NI y la columna PRI. En Linux existen 140 valores de prioridad, pero se dividen en dos tipos de rangos distintos:

  • NI (Niceness): es el nivel de cortesía o amabilidad que se le da a nivel de espacio de usuario (user-space). Puede ir de -20 (valor de prioridad más alta) a 19 (valor de prioridad más baja), siendo el valor predeterminado 0.
  • PR o PRI (Priority): a esos valores se les suma los valores de prioridad en tiempo real que oscilan desde 1 a 99 (siendo el valor más bajo el de prioridad más alta). En este caso a nivel del espacio del kernel o modo privilegiado. En la mayoría de los casos, para calcular PR se puede usar la fórmula PR=20+NI. El estándar es PR=20, ya que NI por defecto es 0. Es decir, si NI fuesen 3, entonces PR serían 23 para ese proceso. Si fuese -7, entonces PR sería 13. Esto se debe a que, aunque el usuario especifique un valor de amabilidad para un proceso, el planificador no está forzado a usar ese valor, puede variarlo en función de la carga o prioridades en ese momento, aunque lo tendrá en cuenta…

Debes saber que para procesos no root, puedes configurar el valor NI y PR por defecto en /etc/security/limits.conf. Recuerda que, teóricamente, el kernel puede cambiar el valor PR por sí mismo, pero no puede alterar el valor NI. Por ejemplo, si el planificador del kernel comprueba que un proceso está consumiendo demasiado tiempo de CPU, podría reducir su PR para equilibrar la carga en favor de otros procesos a la espera. En esos casos PR será modificado y NI seguirá igual, y en esos casos PR=20+NI no será correcta, ya que PR habrá variado el valor por defecto 20 a otros valores por encima o por debajo según necesite quitar o dar prioridad respectivamente.

Para alterar limits.conf podrás usar una línea como <dominio> <tipo> <item> <valor>. Como por ejemplo:

@users      -       priority        10
pepito    -       priority        19
iceman     hard     priority     1
@migrupo     soft    priority    -10
ejemplo    -      nice    14

Por ejemplo:

#Mostrar prioridad de un proceso y otras columnas de información de procesos básicas. Por ejemplo estos dos:
ps -eo pid, ppid, ni, com
ps ax -o pid,ni,com

#Con top o ps debes ejecutarlo y fijarte en la columna NI y PRI
top
ps -fl -c

#O puedes filtrar por un nombre o proceso concreto
top | grep firefox
ps -fl -c | grep firefox

#Con htop es algo diferente. NI es la columna de amabilidad o cortesía, mientras que PR o PRI es  la prioridad real
htop

nice

Es la herramienta con la que puedes lanzar un proceso asignándole un valor NI concreto. Si ejecutases es comando o programa normalmente, ya sabes que su NI sería 0. Pero para cambiarlo:

#Por ejemplo, si quiero lanzar un script con una prioridad muy baja de 19
nice -n 19 ./miscript.sh

#Importante, si lanzas un comando mediante nice y no le asignas prioridad, no será 0, sino 10:
nice du -h

#Importante también, para prioridades más altas, es decir, por debajo de 0, necesitarás privilegios
sudo nice -n -4 htop

#Te aconsejo ver más opciones e información de nice desde el manual
man nice

renice

Ahora bien, si el programa o proceso está en marcha, podrás modificar su valor NI con renice. Linux permite esta planificación dinámica de procesos, por lo que es posible incluso si el proceso ya está corriendo. La sintaxis es similar a nice, y lo dicho anteriormente también valdría aquí. Por ejemplo:

#Por ejemplo, para poner el valor NI=19 al proceso con PID=250
renice -n 19 -p 250

ionice

Con esta otra herramienta se pueden controlar las prioridades para E/S. Ideal para aquellos procesos que demandan muchos recursos de entrada y salida del hardware de tu máquina.

#La sintaxis no básica aquí es:
ionice [-c class] [-n level] [-t] -p PID...
ionice [-c class] [-n level] [-t] -P PGID...
ionice [-c class] [-n level] [-t] -u UID...

Es decir, primero deberías especificar la clase, luego es posible también agregar un nivel dentro de la clase intermedia, y con -p, -P o -u se puede especificar el PID de un proceso que queramos alterar, de un grupo de procesos (PGID) o un ID para alterar todos los procesos de un usuario a la vez.

Las clases son:

  • 3-Idle: un proceso solo podrá obtener recursos de E/S cuando ningún otro proceso esté demandando recursos de forma prioritaria. Es decir, cuando el sistema se encuentra ocioso (sin carga de trabajo), se aprovechará para ejecutar el proceso.
  • 2-Best-effort: es la clase intermedia entre IDLE y RealTime.
  • 1-RealTime: en tiempo real o RT, el planificador del kernel dará máxima prioridad al proceso. Por eso necesita usarse con cuidado. Necesitará privilegios.
  • 0-None: no especificado, será lo mismo que Best-effort.

Los niveles:

  • En este caso se aceptan niveles de 0 a 7, siendo el número menor el de mayor prioridad.

Con un ejemplo lo comprenderás todo mejor:

#Obtener el valor de clase y nivel actual para un proceso por su PID
ionice -p 346

#Si el proceso ya tiene una prioridad también se puede modificar, es decir, ionice es como nice y renice en uno
ionice -c 2 -n 3 -p 757

#Por ejemplo, si tienes que empaquetar un directorio que contiene gran cantidad de datos el sistema se puede ralentizar. Para evitarlo puedes usar la clase 3 (IDLE) para que solo se ejecute cuando el sistema esté desocupado:
ionice -c 3 tar -cvvf fichero.tar /var/bbdd

#Otro ejemplo, cuando mueves o copias grandes directorios
sudo ionice -c 3 cp -fr /media/bluray/* .

#Imagina que quieres eliminar un fichero de un medio de forma inmediata. Usa la clase 1 o RT
sudo ionice -c 1 rm /dev/sdb1/borrador.zip

chrt

Aunque no sea necesario para las certificaciones, me gustaría mostrarte esta otra herramienta. Con chrt podrás obtener y modificar los atributos de tiempo real de un proceso. Es decir, podrás alterar las reglas de scheduling o planificación del kernel y prioridades de procesos de forma avanzada. Se puede hacer tanto de procesos ya activos como lanzarlos con unos atributos determinados. Por ejemplo, puedes usar un algoritmo de planificación Round Robin (asigna a cada proceso su tiempo de manera equitativa) con la opción -r, o FIFO (primero en entrar, primero en salir) con la -f, para BATCH con -b, para el tiempo normal con -o.

#Saber la planficiación y prioridad de un proceso por su PID
chrt -p 44

#Arrancar Firefox con prioridad de tiempo real 99
chrt 99 firefox

#O puedes alterar la prioridad de un proceso PID=800 a 20
chrt -p 20 800

#En cuanto a las opciones, van tras chrt, por ejemplo, para especificar BATCH scheduling
chrt -b -p 50 88

#Puedes ver los modos con
chrt -m

time

Es una herramienta capaz de de reportar el tiempo consumido por un programa o proceso lanzado. Muestra tres campos en segundos. Uno es el RealTime, que será el tiempo desde el principio hasta el final (el tiempo que puedes cronometrar en un reloj y que ha pasado desde que se inició la ejecución hasta que terminó), y puede incluir segmentos de tiempo usados por otros procesos que se estaban ejecutando en ese momento y bloqueos de E/S. Otro es UserTime, es decir, el tiempo de CPU consumido en modo usuario. Y el tercero es SysTime, en este caso el tiempo de kernel, como las llamadas al sistema (lib code se contabiliza en user-space). En sistemas con procesamiento paralelo, la suma User+Sys podría ser superior a Real, aunque parezca raro. Y tampoco te extrañes si Real es mucho mayor que la suma de User+Sys, ya que éstos últimos no tienen en cuenta los tiempos en los que un proceso estuvo detendido o dormido por el planificador…

#Puedes saber el tiempo consumido por la orden du -h 
time du -h

#O el tiempo que tarda en ejecutarse un script
time ./miscript.sh

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar