prioridades en linux (ii de ii)

24 de junio de 2009

Los comandos nice y renice nos permiten cambiar las prioridades de los procesos. Las prioridades van en un rango entre el -20..0 y el 0..19. El -20 es máxima prioridad y por tanto máxima apropiación de la CPU y el 19 es la mínima apropiación de la CPU. El 0 es la prioridad que se da por defecto a todos los usuarios del sistema. Otra cosa muy importante es que solo root puede dar prioridades negativas.

Para ser más correcto lo que estamos cambiando no es exactamente la prioridad sino "el valor de nice". Como hemos explicado anteriormente la apropiación y tiempo de uso de una CPU se calcula en base a uno o varios algoritmos de planificación y en base a muchos parámetros entre ellos, el valor de nice.

Para lanzar un nuevo proceso con un valor de nice haremos lo siguiente:

# nice -n -15 xeyes (lanzamos xeyes con una prioridad alta)

Si por el contrario queremos cambiar la prioridad a un proceso ya en ejecución, utilizaremos el comando renice:

# renice 10 -p 1967 (lanzamos el proceso con PID 1967 con una prioridad baja)

Para ver que nice tiene asignado cada proceso hay que consultar la columna NI que muestra el comando top:

top - 23:18:30 up 10:52,  5 users,  load average: 0.00, 0.31, 0.40
top - 23:25:57 up 10:59,  5 users,  load average: 0.28, 0.19, 0.28
Tasks: 139 total,   3 running, 136 sleeping,   0 stopped,   0 zombie
Cpu(s): 11.3%us,  3.7%sy,  1.0%ni, 84.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3989648k total,  3425068k used,   564580k free,    97340k buffers
Swap:  4000176k total,        0k used,  4000176k free,  2796996k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                           
 3035 root      20   0  495m  60m  15m R  7.0  1.6   9:37.19 Xorg                                                                                                                                              
 3638 amperis   20 -20  317m  49m  17m S  4.3  1.3   2:42.72 bucle.sh                                                                                                                                       
17023 amperis   39  19  578m 122m  27m S  2.0  3.1   1:05.72 bucle.sh                                                                                                                                           
17067 amperis   20 -15  199m  20m  10m R  1.7  0.5   0:58.31 xeyes                                                                                                                                    
17959 root      20   0 19116 1344  988 R  0.3  0.0   0:02.62 top 
...

Como regla general Linux por si mismo ya es lo suficiente eficiente para mantener el buen uso de la CPU, por tanto, no es necesario ir cambiando los nice. Si este no fuera tú caso, lo normal es cambiarlo o jugar con ellos en aplicaciones como audio, video, diseño, donde los retardos en los resultados es muy apreciable.

Para los que le gusta tunear su Kernel existen parches para compilarlo utilizando opciones de tuning y real-time. Existen proyectos dedicados al real-time del Kernel.

Para hacer notar el poder del nice podéis crear un script con un bucle infinito que vaya mostrando números por pantalla. Lo lanzáis dos veces en dos terminales diferentes. Por defecto, los dos procesos entraran en ejecución con un nice 0. Ahora a uno le ponéis un -20 y al otro un 19. Veréis como uno incrementará su velocidad y el otro irá más lento. En verdad no va más lento, sino que recibe la CPU menos veces por unidad de tiempo.

#!/bin/bash

while [ 1 ] 
do
  echo $RANDOM
done