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.
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."
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
|
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
|
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.
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
pspuede mostrar la prioridad (nivel de cortesía, o NI, por ejemplo) usando la opción-l. - El comando
nicemuestra 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.
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.
Aprender
- Use el mapa de ruta developerWorks para LPIC-1
para encontrar los artículos developerWorks que le ayudarán a estudiar para la certificación LPIC-1 basada en los objetivos de abril del 2009.
- En el sitio del LPIC
Program
, encuentre objetivos detallados, listas de tareas y preguntas de muestra para los t res niveles de la certificación en administración de sistema Linux del Linux Professional Institute. Particularmente, consulte sus objetivos a abril del 2009 para el examen LPI 101
y el examen LPI 102.
Consulte siempre el sitio del LPIC Program para conocer los objetivos más recientes.
- Revise toda la serie de preparación para el examen LPI
en
developerWorks para aprender los fundamentos Linux y prepararse para la certificación como administrador de sistema con base en objetivos de examen LPI previos, anteriores a abril del 2009.
- En "Basic tasks for new Linux
developers" (developerWorks, marzo del 2005), aprenda cómo abrir una ventana de terminal o prompt de comandos shell.
- El Linux
Documentation Project
cuanta con una variedad de documentos útiles, especialmente sus HOWTOs.
-
En la zona Linux de developerWorks, encuentre más recursos para desarrolladores Linux y recorra nuestros
artículos y tutoriales más populares.
-
Vea todos los
tutoriales Linux
y los
consejos Linux en developerWorks.
-
Permanezca actualizado(a) con los eventos técnicos y Webcasts developerWorks.
- Siga a developerWorks en Twitter.
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
- Participar en el foro de debate.
- Participe en la Comunidad My developerWorks.
Conéctese con otros usuarios developerWorks mientras explora los blogs, foros, grupos y wikis dirigidos a desarrolladores.
Ian 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.