Cambiar la prioridad de los procesos en Linux

Si bien es posible lanzar procesos indicando la prioridad en Linux, existen casos en los que necesitamos cambiar la prioridad de un proceso en ejecución. Para eso existe el comando renice.

renice [-n] <niceness> [-p|-g|-u] <identificadores>

donde identificadores se corresponde con:

  • un conjunto de ids de proceso (pid) si no se especifica parámetro o se precede por -p
  • un conjunto de id de grupo de proceso si se precede por -g
  • un conjunto de usuarios si se precede por -u.

Los usuarios que no sean el superusuario sólo pueden bajar la prioridad de sus procesos, es decir, aumentar su niceness (en el rango de 0 a 19). El superusuario (root) puede ajustar la prioridad de cualquier proceso usando un valor nice del rango completo (-20 a 19).

Ejemplo

Suponiendo que se está importando una base de datos y este proceso está consumiendo mucha CPU, obtenemos su PID (process id) mediante top o pgrep, y le bajamos la prioridad ejecutando desde la consola

$ renice +5 2119
2119 (process ID) old priority 0, new priority 5

Podemos repetir la operación, si la prioridad establecida no fuera suficientemente baja:

$ renice +7 2119
2119 (process ID) old priority 5, new priority 7

De esta manera, es posible que el proceso demore un poco más en terminar su ejecución, pero al mismo tiempo, otros tendrán más CPU disponible.


Ahora bien, si después de un rato vemos que no se concretara, podríamos intentar incrementar su prioridad haciendo:

$ renice 0 2119
renice: failed to set priority for 2119 (process ID): Permission denied

Esta acción falla debido a que para bajar el valor nice es necesario ser superusuario:

$ sudo renice 0 2119
2119 (process ID) old priority 10, new priority 0

Solo con el superusuario podemos establecer un niceness < 0:

$ sudo renice -5 2119
2119 (process ID) old priority 0, new priority -5

También te puede interesar:

Cambiar la prioridad de un proceso en Windows

Prioridades en Linux

Cuando ejecutamos un proceso, es el sistema operativo quien determina la planificación y asignación de recursos al mismo, entre ellos, el tiempo de CPU.

Mendiante el comando top podemos ver los procesos en ejecución

 PID USER  PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 838 us1   20   0  479476 117116  56872 S  4,7  5,7   1:02.12 Xorg   
1867 us1   20   0 1808172 255376 129456 S  2,0 12,5   0:11.70 firefox
2211 us1   20   0  751108  45624  30484 S  1,7  2,2   0:00.63 gedit  
 627 root  20   0    4552    840    776 S  0,3  0,0   0:00.01 acpid  
2226 us1   20   0   51184   4232   3604 R  0,3  0,2   0:00.13 top    
   1 root  20   0  159892   8956   6528 S  0,0  0,4   0:01.76 systemd

De toda la información presentada nos enfocamos en 2 columnas:

NI (niceness): valor de prioridad vinculado al usuario. El rango del valor nice comprende desde -20 (el mayor) a +19 (el menor).

  • Cuanto más «nice» sea un proceso, más le da lugar a otro proceso para que se ejecute.
  • El incrementar este valor en 1 otorga al proceso un 10% más de tiempo de CPU, aproximadamente.

PR (priority): prioridad del proceso para el kernel de Linux. El rango de prioridades comprende desde  0 a 139, siendo

  • de 0 a 99 para tiempo real (‘rt’ en la salida de top)
  • de 100 a 139 para los usuarios (rango 0 a 39 en la salida de top)

La relación entre ambos es la siguiente:

PR = 20 + NI

Es por ello que el rango de PR = 20 + (-20 a +19) es 0 a 39.

El valor de nice, por defecto, para un proceso es heredado de su padre, y por lo general, es 0 (la prioridad correspondiente es 20). Es posible especificar un valor de nice para cambiar la prioridad de un proceso en ejecución o bien lanzar un proceso con una prioridad diferente.

Basado en:

https://askubuntu.com/questions/656771/process-niceness-vs-priority

https://peteris.rocks/blog/htop/#process-niceness-and-priority

Ejecutar procesos indicando la prioridad en Windows

Al lanzar un proceso desde la línea de comandos, uno puede indicar su prioridad:

start <prioridad> <comando>

donde <prioridad> es alguno de los siguientes valores:

  • /REALTIME: Tiempo real
  • /HIGH: Alta
  • /ABOVENORMAL: Por encima de lo normal
  • /NORMAL: Normal 😉
  • /BELOWNORMAL: Por debajo de lo normal
  • /LOW: Baja

Ejemplo

start /high /b backup.bat

Se ejecuta el archivo batch con la prioridad alta, sin crear una nueva ventana (/b)

Una vez que el proceso está en ejecución, aún se puede Cambiar la prioridad de un proceso en Windows.

También te puede interesar:

Ejecutar procesos indicando la prioridad en Linux

Cambiar la prioridad de un proceso en Windows

Cuando ya tenemos un proceso en ejecución y notamos que nos está ralentizando el uso de la computadora (por ejemplo, la importación de un respaldo de una base de datos) o necesitamos que termine más rápido (por ejemplo el procesamiento de una cola de mails para enviar) podemos cambiar la prioridad del mismo:

  1. Abrir el Administrador de tareas
  2. Abrir la solapa Procesos
  3. Click derecho sobre el proceso
  4. Elegir la opción «Establecer prioridad» y seleccionar alguna de las disponibles:
    • para mayor prioridad: Por encima de lo normal, Alta o Tiempo Real
    • para menor prioridad: Por debajo de lo normal o Baja

Para futuras ocasiones puede ser práctico Ejecutar el proceso indicando la prioridad en Windows al momento de lanzarlo.

También te puede interesar:

Cambiar la prioridad de un proceso en Linux

Ejecutar procesos indicando la prioridad en Linux

El comando nice nos permite establecer la prioridad de un proceso (Prioridades en Linux) al lanzarlo:

$ nice -n<niceness> <comando>

Los usuarios que no sean el superusuario sólo pueden establecer un niceness en el rango de 0 a 19. El superusuario (root) puede indicar la prioridad mediante cualquier valor nice del rango (-20 a 19)

Para lanzar un proceso con menor prioridad a la establecida por defecto (niceness = 0), un usuario ejecuta:

$ nice -n10 ./prueba.pl

Por otra parte, si quisiera ejecutarlo con mayor prioridad (valores de niceness <0), debería hacerlo como superusuario:

$ sudo nice -n-10 ./test.pl

Una vez en ejecución es posible Cambiar la prioridad de los procesos en Linux

También te puede interesar:

Ejecutar procesos indicando la prioridad en Windows