Aprenda Linux, 101: Prioridades de ejecución de procesos

Esté al tanto de lo que está sucediendo

Aprenda cómo establecer y cambiar prioridades de procesos de manera que las aplicaciones obtengan tanto tiempo de procesamiento como necesitan. Usted puede usar el material de este artículo para el examen LPI® 101 para certificación como administrador de sistema Linux, o simplemente por diversión, para aprender.

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields trabaja en múltiples proyectos Linux para la zona Linux developerWorks. Es programador sénior en IBM en Research Triangle Park, NC. Se unió a IBM en Canberra, Australia, como Ingeniero de Sistemas en 1973 y desde entonces ha trabajado en sistemas de comunicaciones e informática ubicua en Montreal, Canadá, y en el RTP, NC. Cuenta con varias patentes y ha publicado bastantes artículos. Su diploma de pre-grado es en matemática pura y filosofía de la Universidad Nacional de Australia. Tiene una maestría y un doctorado en ciencias de la computación de la Universidad Estatal de Carolina del Norte. Aprenda más sobre Ian en el perfil de Ian en My developerWorks.


Nivel de autor contribuyente en developerWorks

02-01-2012

Sobre esta serie

Esta serie de artículos le ayuda a aprender tareas de administración de sistema Linux. Usted también puede usar el material en estos artículos para prepararse para los exámenes (LPIC-1) de nivel 1 Linux Professional Institute Certification.

Vea nuestro mapa de ruta de la serie para una descripción de un enlace hacia cada artículo de esta serie. El mapa de ruta está en desarrollo y refleja los últimos objetivos (abril del 2009) para los exámenes LPIC-1: a medida que completemos artículos, los añadiremos al mapa de ruta. Mientras tanto, usted puede encontrar versiones anteriores de material similar , que soporta objetivos LPIC-1 anteriores a abril del 2009, en nuestros tutoriales de preparación para el examen de certificación LPI.

Visión General

Este artículo le proporciona las técnicas básicas Linux para administrar prioridades de ejecución de procesos. Aprenda a:

  • Entender prioridades de procesos
  • Establecer prioridades de procesos
  • Cambiar prioridades de procesos

Este artículo le ayuda a prepararse para el Objetivo 103.6 del Tema 103 del examen 101 (LPIC-1) Junior Level Administration del Linux Professional Institute. El objetivo tiene un peso de 2.

Prerrequisitos

Para aprovechar al máximo los artículos de esta serie usted debe contar con conocimientos básicos Linux y un sistema Linux funcional en el cual poder practicar los comandos que se cubren en este artículo. Algunas versiones diferentes del programa darán un formato de resultado diferente, por lo que sus resultados pueden no siempre verse igual a los listados y gráficas mostradas aquí. Los resultados de los ejemplos mostrados aquí se obtuvieron en una distribución Ubuntu 9.10 (Karmic Koala). Este artículo construye sobre los conceptos tratados en el artículo anterior "Aprenda Linux 101: Cree, supervise y elimine procesos."


Conociendo sus prioridades

Conéctese con Ian

Ian es uno de nuestros autores más prolíficos y populares. Navegue todos los artículos de Ian en developerWorks. Visite el perfil de Ian y conéctese con él, con otros autores y con colegas lectores en My developerWorks.

Linux, como la mayoría de sistemas operativos modernos, puede ejecutar múltiples procesos. Esto lo hace compartiendo la CPU y otros recursos entre los procesos. Si un proceso puede usar el 100% de la CPU, entonces otros procesos podrían dejar de responder.

Si usted ejecuta el comando top , su predeterminado es mostrar procesos en orden decreciente de acuerdo a su uso de CPU, como se muestra en el Listado 1. En el artículo anterior, "Aprenda Linux 101: Cree, supervise y elimine procesos," mostramos un script de un Reloj de Hombre Pobre, el cual imprimía la hora en la consola cada 30 segundos y no hacía nada el resto del tiempo. Si ejecutábamos ese proceso, probablemente no llegaría a la lista de resultado desde top porque el proceso para la mayoría del tiempo sin usar la CPU.

Listado 1. Resultado típico de top en una estación de trabajo Linux
top - 08:00:52 up 1 day, 10:20,  5 users,  load average: 0.04, 0.08, 0.04
Tasks: 172 total,   1 running, 171 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.7%us,  0.3%sy,  0.0%ni, 95.6%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   4057976k total,  1777976k used,  2280000k free,   225808k buffers
Swap: 10241428k total,        0k used, 10241428k free,   655796k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
11220 ian       20   0  555m 106m  27m S    8  2.7  36:06.16 firefox            
    7 root      15  -5     0    0    0 S    1  0.0  10:59.36 ksoftirqd/1        
10849 ian       20   0  212m  15m  10m S    0  0.4   0:08.11 gnome-terminal     
    1 root      20   0 19584 1888 1196 S    0  0.0   0:00.83 init               
    2 root      15  -5     0    0    0 S    0  0.0   0:00.01 kthreadd           
    3 root      RT  -5     0    0    0 S    0  0.0   0:00.02 migration/0        
    4 root      15  -5     0    0    0 S    0  0.0   0:01.08 ksoftirqd/0        
    5 root      RT  -5     0    0    0 S    0  0.0   0:00.00 watchdog/0         
    6 root      RT  -5     0    0    0 S    0  0.0   0:00.03 migration/1

Su sistema puede tener muchos comandos que sean capaces de usar cantidades de CPU. Los ejemplos incluyen herramientas de edición de películas, y programas para convertir entre diferentes tipos de imagen o entre diferentes codificaciones de sonido, como de mp3 a ogg.

Cuando usted solo tiene una o un número limitado de CPUS, necesita decidir cómo compartir esos recursos de CPU limitados entre los diferentes procesos que compiten por ellos. Generalmente esto se hace seleccionando un proceso para ejecución y dejándolo ejecutar por un periodo corto(llamado una rebanada de tiempo), o hasta que necesite esperar algún evento, como que se complete una E/S. Para garantizar que procesos importantes no se queden sin recursos a causa de glotones de CPU, la selección de efectúa con base en una prioridad de programación. La columna NI del Listado 1 de arriba muestra la prioridad de programación o cortesía de cada proceso. La cortesía generalmente va de -20 hasta 19, siendo -20 la prioridad más favorable o más alta para programación, y 19 la menos favorable o la más baja.

Usando ps para encontrar cortesía

Además del comando top usted también puede mostrar valores de cortesía usando el comando ps . Usted puede personalizar el resultado como vio en el artículo "Aprenda Linux 101: Cree, supervise y elimine procesos," o simplemente puede usar la opción -l para obtener un listado extenso. El resultado de ps -l se muestra en el Listado 2. Así como con top, busque el valor de cortesía en la columna NI .

Listado 2. Usando para encontrar cortesía
ian@attic4:~$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000 26502 26501  0  80   0 -  5368 wait   pts/4    00:00:00 bash
0 R  1000 27046 26502  0  80   0 -  1684 -      pts/4    00:00:00 ps

Cortesía predeterminada

Tal vez usted haya deducido del Listado 1 o del Listado 2 que la cortesía predeterminada, por lo menos para los procesos iniciados por usuarios regulares, es 0. Este es normalmente el caso en los sistemas Linux actuales. Usted puede verificar el valor de su shell y de sistema ejecutando el comando nice sin parámetros, como se muestra en el Listado 3.

Listado 3. Verificando la cortesía predeterminada
ian@attic4:~$ nice
0

Estableciendo prioridades

Antes de observar cómo configurar o cambiar valores de cortesía, construyamos un poco de script intensivo en CPU que mostrará cómo funciona realmente la cortesía.

Un script intensivo en CPU

Crearemos un pequeño script que solo usa la CPU y no hace mucho más. El script toma dos entradas, un conteo y una etiqueta. Este imprime la etiqueta y la fecha y hora actuales, luego gira, disminuyendo el conteo hasta que llega a 0, y finalmente imprime la etiqueta y la fecha de nuevo. Este script mostrado en el Listado 4 no tiene verificación de error y no es muy sólido, pero ilustra nuestro punto.

Listado 4. Script intensivo en CPU
ian@attic4:~$ echo 'x="$1"'>count1.sh
ian@attic4:~$ echo 'echo "$2" $(date)'>>count1.sh
ian@attic4:~$ echo 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>>count1.sh
ian@attic4:~$ echo 'echo "$2" $(date)'>>count1.sh
ian@attic4:~$ cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do x=$(( x-1 ));done
echo "$2" $(date)

Si usted ejecuta esto en su propio sistema, podrá ver un resultado similar al del Listado 5. Dependiendo de la velocidad de su sistema, tal vez necesite incrementar el valor de conteo para incluso ver una diferencia en las horas. Este script usa grandes cantidades de CPU, como veremos en un momento. Si su shell predeterminado no es Bash, y si el script no funciona para usted, entonces use la segunda forma de llamado mostrada a continuación. Si usted no está usando su propia estación de trabajo, asegúrese de que está bien usar grandes cantidades de CPU antes de ejecutar el script.

Listado 5. Ejecutando count1.sh
ian@attic4:~$ sh count1.sh 10000 A
A Wed Jan 20 08:34:16 EST 2010
A Wed Jan 20 08:34:16 EST 2010
ian@attic4:~$ bash count1.sh 99000 A
A Wed Jan 20 08:34:20 EST 2010
A Wed Jan 20 08:34:22 EST 2010

Hasta ahora todo va bien. Ahora creemos una lista de comandos para ejecutar el script en segundo plano e iniciar el comando top para ver cuánta CPU está utilizando el script. (Vea el artículo previo "Aprenda Linux 101: La línea de comando Linux" para un repaso sobre listas de comandos). La lista de comandos se muestra en el Listado 6 y el resultado de top en el Listado 7.

Listado 6. Ejecutando count1.sh y top
ian@attic4:~$ (sh count1.sh 5000000 A&);top
Listado 7. Usando grandes cantidades de CPU
top - 15:41:15 up 1 day, 17:59,  6 users,  load average: 0.20, 0.06, 0.02
Tasks: 169 total,   2 running, 167 sleeping,   0 stopped,   0 zombie
Cpu(s): 52.1%us,  0.7%sy,  0.0%ni, 47.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4057976k total,  1393772k used,  2664204k free,   235596k buffers
Swap: 10241428k total,        0k used, 10241428k free,   662592k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26756 ian       20   0  4004  588  496 R  100  0.0   0:03.53 sh
11220 ian       20   0  555m 101m  27m S    5  2.6  57:58.07 firefox
26757 ian       20   0 19132 1364  980 R    0  0.0   0:00.03 top
    1 root      20   0 19584 1888 1196 S    0  0.0   0:00.89 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.01 kthreadd

No está mal. Estamos usando el 100% de una de las CPU de este sistema con un script simple. Si usted desea presionar múltiples CPUs, puede añadir una invocación adicional de count1.sh a la lista de comandos. Si tenemos un trabajo de ejecución larga como este, podremos encontrar que interfiere con nuestra capacidad (o la capacidad de otros usuarios) de efectuar otro trabajo en nuestro sistema.

Usando cortesía para establecer prioridades

Ahora que podemos mantener una CPU ocupada por un rato, veremos cómo establecer una prioridad para un proceso. Para resumir, lo que hemos aprendido hasta ahora:

  • Los sistemas Linux y UNIX® usan un sistema de prioridades con 40 prioridades, que van desde -20 (prioridad más alta) hasta 19 (prioridad más baja).
  • Los procesos iniciados por usuarios regulares normalmente tienen una prioridad de 0.
  • El comando ps puede mostrar la prioridad (nivel de cortesía, o NI, por ejemplo) usando la opción -l .
  • El comando nice muestra nuestra prioridad predeterminada.

El comando nice también puede usarse para iniciar un proceso con una prioridad diferente. Usted usa la opción -n o (--adjustment) con un valor positivo para aumentar el valor de prioridad y un valor negativo para disminuirlo. Recuerde que los procesos con el menor valor de prioridad se ejecutan a la prioridad de programación más alta, así que piense en el aumento del valor de prioridad como sercortés con otros procesos. Note que usted normalmente necesita ser el superusuario (raíz) para especificar ajustes de prioridad negativos. En otras palabras, los usuarios regulares usualmente solo pueden hacer que sus procesos sean más corteses.

Para demostrar el uso de nice para establecer prioridades, vamos a iniciar con dos copias del script count1.sh en diferentes subshells al mismo tiempo, pero concediéndole a uno el máximo nivel de cortesía, 19. Después de un momento usaremos ps -l para mostrar el estado de proceso, incluyendo la cortesía. Finalmente, añadiremos un 'sleep' arbitrario de 30 segundos para garantizar que la secuencia de comandos termine después de que los dos subshells lo hagan. De esta forma, no obtendremos un nuevo prompt mientras estamos esperando un resultado. El resultado se muestra en el Listado 8.

Listado 8. Usando 'nice' para establecer prioridades para un par de procesos
ian@attic4:~$ (sh count1.sh 2000000 A&);(nice -n 19 sh count1.sh 2000000 B&);\
> sleep 1;ps -l;sleep 10
A Thu Jan 21 14:38:39 EST 2010
B Thu Jan 21 14:38:39 EST 2010
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1000   946     1 99  80   0 -  1001 -      pts/3    00:00:01 sh
0 R  1000   948     1 99  99  19 -  1001 -      pts/3    00:00:01 sh
0 R  1000   952 32408  0  80   0 -  1684 -      pts/3    00:00:00 ps
0 S  1000 32408 32407  0  80   0 -  5368 wait   pts/3    00:00:02 bash
A Thu Jan 21 14:38:45 EST 2010
B Thu Jan 21 14:38:45 EST 2010

¿Le sorprende que ambos trabajos hayan terminado al mismo tiempo? ¿Qué sucedió con nuestra configuración de prioridad? Recuerde que el script ocupaba una de nuestras CPU. Este sistema en particular se ejecuta en un procesador AMD Athlon™ 7750 de doble núcleo, el cual está cargado muy livianamente por lo que cada núcleo puede ejecutar un proceso y no hubo necesidad de priorizarlos.

Así que vamos a intentar cuatro procesos en cuatro niveles de cortesía diferentes (0, 6, 12 y 18) y veamos qué sucede. Aumentaremos el parámetro de conteo de ocupado para cada uno, de manera que se ejecuten por un poco más de tiempo. Antes de observar el Listado 9, piense en lo que podría esperar, teniendo en cuenta lo que ya ha visto.

Listado 9. Usando 'nice' para establecer prioridades para cuatro procesos
ian@attic4:~$ (sh count1.sh 5000000 A&);(nice -n 6 sh count1.sh 5000000 B&);\
> (nice -n 12 sh count1.sh 5000000 C&);(nice -n 18 sh count1.sh 5000000 D&);\
> sleep 1;ps -l;sleep 30
A Thu Jan 21 16:06:00 EST 2010
C Thu Jan 21 16:06:00 EST 2010
D Thu Jan 21 16:06:00 EST 2010
B Thu Jan 21 16:06:00 EST 2010
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1000  1422     1 94  80   0 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1424     1 42  86   6 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1427     1 56  92  12 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1431     1 14  98  18 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1435 32408  0  80   0 -  1684 -      pts/3    00:00:00 ps
0 S  1000 32408 32407  0  80   0 -  5368 wait   pts/3    00:00:02 bash
A Thu Jan 21 16:06:14 EST 2010
B Thu Jan 21 16:06:17 EST 2010
C Thu Jan 21 16:06:26 EST 2010
D Thu Jan 21 16:06:30 EST 2010

Con cuatro prioridades diferentes, vemos el efecto de los diferentes niveles de cortesía a medida que cada trabajo termina en orden de prioridad. Intente experimentar con diferentes valores de cortesía para demostrar las diferentes posibilidades para usted mismo.

Una nota final sobre el inicio de procesos con nice; así como con el comando nohup , usted no puede usar una lista de comandos ni una interconexión como argumento de nice.


Cambiando prioridades

renice

Si sucede que usted inicia un proceso y nota que este se debe ejecutar a una prioridad diferente, hay una forma para cambiarla después de que ha iniciado, usando el comando renice . Usted especifica una prioridad absoluta (y no un ajuste) para el proceso o procesos a ser cambiados, como se muestra en el Listado 10.

Listado 10. Usando 'renice' para cambiar prioridades
ian@attic4:~$ sh count1.sh 10000000 A&
[1] 1537
ian@attic4:~$ A Thu Jan 21 16:17:16 EST 2010
sh count1.sh 1renice 1 1537;ps -l 1537
1537: old priority 0, new priority 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R  1000  1537 32408 99  81   1 -  1001 -      pts/3      0:13 sh count1.sh 100
ian@attic4:~$ renice +3 1537;ps -l 1537
1537: old priority 1, new priority 3
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R  1000  1537 32408 99  83   3 -  1001 -      pts/3      0:18 sh count1.sh 100

Recuerde que usted debe ser superusuario para dar a sus procesos mayor prioridad de programación y para hacerles menos corteses.

Puede encontrar más información sobre nice y renice en las páginas man.

Recursos

Aprender

Obtener los productos y tecnologías

  • Con el software de prueba IBM, disponible para descarga directamente desde developerWorks, construya su próximo proyecto de desarrollo en Linux.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Linux
ArticleID=783211
ArticleTitle=Aprenda Linux, 101: Prioridades de ejecución de procesos
publish-date=01022012