Proceso 'amabilidad' versus 'prioridad'

104

Al ejecutar top, puedo ver este resultado de ejemplo (acortado):

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4586 ipc-adm+  20   0 1303900 605152  92844 S  30,6 29,3   3:52.88 firefox
 3985 ipc-adm+  20   0  258588 124508  63072 S  12,2  6,0   0:40.04 compiz
 3092 root      20   0  172392  56164  25980 S   6,1  2,7   0:30.13 Xorg

Hay dos valores que me interesan: PR(Prioridad) y NI(Bondad).

Si entendí lo que ya descubrí correctamente, ambos determinan cuánto tiempo de CPU tendrá un proceso en contraste con otros procesos. Pero, ¿cuál es la diferencia entre esos valores entonces?

¿Podría también describir cómo manipular esos valores de un proceso y en qué circunstancias esto podría ser útil?

Byte Commander
fuente

Respuestas:

103

Un buen valor es un espacio de usuario y la prioridad PR es la prioridad real del proceso que utiliza el kernel de Linux. En Linux, las prioridades del sistema son de 0 a 139 en las que 0 a 99 en tiempo real y 100 a 139 para los usuarios. El rango de valores agradable es de -20 a +19 donde -20 es el más alto, 0 predeterminado y +19 es el más bajo. La relación entre valor agradable y prioridad es:

PR = 20 + NI

entonces, el valor de PR = 20 + (-20 to +19)es de 0 a 39 que asigna de 100 a 139.

Según el manual superior:

PR - Prioridad La prioridad de programación de la tarea. Si ve 'rt' en este campo, significa que la tarea se está ejecutando bajo la prioridad de programación 'en tiempo real'.

NI es un buen valor de tarea.

NI - Buen valor El buen valor de la tarea. Un valor positivo negativo significa mayor prioridad, mientras que un valor positivo positivo significa menor prioridad. Cero en este campo simplemente significa que la prioridad no se ajustará para determinar la capacidad de despacho de una tarea

Editar: de manera predeterminada, cuando se inicia un programa en Linux, se inicia con la prioridad de '0'. Sin embargo, puede cambiar la prioridad de sus programas mediante cualquiera de los siguientes métodos.

  1. Puede iniciar un programa con su prioridad requerida usando

    nice -n nice_value program_name
    
  2. También puede cambiar la prioridad de un proceso que ya se está ejecutando usando

    renice -n nice_value -p process_id
    
pl_rock
fuente
1
¿Estás diciendo que son casi lo mismo a la inversa (ambos representan prioridad) PERO nicenessse pueden usar para dar una prioridad negativa para que la tarea nicenessse salga del camino de las tareas de alta prioridad? (es decir, ¿es nicey permite que otros recursos de acceso? ¿O esto me confundió?
Mark Kirby
1
Un ejemplo de lo que quiero decir, dos tareas, ambas tienen pr20, por lo tanto, la tarea uno tiene un ni0 y la tarea dos tiene un ni20, entonces, esto significaría que la tarea dos cedería recursos para la tarea uno porque esnicer
Mark Kirby
1
Como sé, la prioridad calculada como PR = 20 + NI. entonces tarea una prioridad = 20 +0. valor máximo de buena voluntad +19
pl_rock
3
PR = 20 + NI el valor máximo puede ser 39. En realidad, en el sistema Linux hay una prioridad 139 en la que 0 a 99 es prioridad en tiempo real y para el usuario hay 100 a 139. entonces, NI valora -20 a +19 mapas a prioridad 100 a 139. que puedes ajustar. pero aún no está seguro si cambia el valor de NI, entonces cambiará la prioridad, el valor de NI es solo una sugerencia para el kernel. kernel alguna vez
ignórelo
1
Entonces, ¿PR y NI son realmente equivalentes, ya que tienen un desplazamiento diferente? ¿Por qué tenemos ambos valores entonces? Y podría agregar que la configuración agradable de un proceso <0 requiere derechos de root.
Byte Commander
26

¿Qué es prioridad y por qué debería importarme?

Cuando se habla de procesos, la prioridad se trata de administrar el tiempo del procesador. El procesador o CPU es como un humano haciendo malabares con múltiples tareas al mismo tiempo. A veces podemos tener suficiente espacio para asumir múltiples proyectos. A veces solo podemos enfocarnos en una cosa a la vez. Otras veces aparece algo importante y queremos dedicar toda nuestra energía a resolver ese problema mientras ponemos las tareas menos importantes en un segundo plano.

En Linux podemos establecer pautas para que la CPU siga cuando está mirando todas las tareas que tiene que hacer. Estas pautas se llaman amabilidad o buen valor. La escala de simplicidad de Linux va de -20 a 19. Cuanto menor sea el número, más prioridad tendrá esa tarea. Si el valor de niceness es un número alto como 19, la tarea se establecerá en la prioridad más baja y la CPU la procesará cada vez que tenga la oportunidad. El buen valor predeterminado es cero.

Al usar esta escala, podemos asignar nuestros recursos de CPU de manera más adecuada. Los programas de menor prioridad que no son importantes se pueden establecer en un valor agradable más alto, mientras que los programas de alta prioridad como demonios y servicios se pueden configurar para recibir más atención de la CPU. Incluso puede darle a un usuario específico un valor agradable más bajo para todos sus procesos para que pueda limitar su capacidad de ralentizar los servicios centrales de la computadora.

Fuente

Establecer la prioridad para nuevos procesos con nice, p. Ej.

nice -n 10 firefox

para procesos existentes

renice 10 -p $(pgrep firefox)

Para establecer la prioridad <0que necesita sudo, por ejemplo:

renice -1 -p $(pgrep firefox)
renice: failed to set priority for 2769 (process ID): Permission denied

pero no por prioridad >=0


Ejemplo

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          19   0

% renice 10 -p 2769     # note, we don't need sudo here
2769 (process ID) old priority 0, new priority 10

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox           9  10

% sudo renice -19 -p 2769                    
 2769 (process ID) old priority 10, new priority -19

% ps -o pid,comm,pri,nice -p $(pgrep firefox)
  PID COMMAND         PRI  NI
 2769 firefox          38 -19

Otro ejemplo

Para renice todos los procesos en ejecución para un usuario específico

renice 20 -u user_name
AB
fuente
En su ejemplo, el renice 10también funcionaría sin sudo, ¿verdad? ¿Y podría agregar un ejemplo para que todos los procesos de un usuario específico sean más agradables? Eso sería realmente bastante útil si alguien más inicia sesión al mismo tiempo y tiene algunos procesos innecesarios pero que consumen recursos (como un juego flash en pausa en Firefox, los hermanos pequeños hacen esas cosas ...: - /)
Byte Comandante
@ByteCommander hecho =)
AB
¿Cómo restauro los viejos valores de amabilidad de ese usuario después de un tiempo? ¿Poniéndolo de nuevo a 0? Eso no tendrá en cuenta que algunos procesos podrían haber tenido un valor de simpatía diferente antes. ¿Hay alguna posibilidad simple de hacer esto?
Byte Commander
@ByteCommander No, no es simple. O usas 0o ... ahí está el problema;)
AB
2
Después de renice -19, el resultado con pses: PRI: 38, NI: -19sin embargo, con topeso es PR:1, NI -19¿por qué?
Despertar
14

Respuesta corta

PR es el nivel de prioridad. Cuanto menor sea el PR, mayor será la prioridad del proceso.

PR se calcula de la siguiente manera:

  • para procesos normales: PR = 20 + NI (NI es agradable y varía de -20 a 19)
  • para procesos en tiempo real: PR = - 1 - real_time_priority (real_time_priority varía de 1 a 99)

Respuesta larga

Hay 2 tipos de procesos, los normales y el tiempo real. Para los normales (y solo para esos), nice se aplica de la siguiente manera:

agradable

La escala de "amabilidad" va de -20 a 19, mientras que -20 es la prioridad más alta y 19 la prioridad más baja. El nivel de prioridad se calcula de la siguiente manera:

PR = 20 + NI

Donde NI es el nivel agradable y PR es el nivel de prioridad. Como podemos ver, el -20 en realidad se asigna a 0, mientras que el 19 se asigna a 39.

De forma predeterminada, el valor agradable de un programa es 0, pero es posible que el usuario root inicie programas con un valor agradable especificado utilizando el siguiente comando:

nice -n <nice_value> ./myProgram 

Tiempo real

Podríamos ir aún más lejos. La buena prioridad se usa realmente para los programas de usuario. Mientras que la prioridad general de UNIX / LINUX tiene un rango de 140 valores, el valor agradable permite que el proceso se asigne a la última parte del rango (de 100 a 139). Esta ecuación deja inalcanzables los valores de 0 a 99, lo que corresponderá a un nivel PR negativo (de -100 a -1). Para poder acceder a esos valores, el proceso debe establecerse como "en tiempo real".

Hay 5 políticas de programación en un entorno LINUX que se pueden mostrar con el siguiente comando:

chrt -m 

Que mostrará la siguiente lista:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Los procesos de programación podrían dividirse en 2 grupos, las políticas de programación normales (1 a 3) y las políticas de programación en tiempo real (4 y 5). Los procesos en tiempo real siempre tendrán prioridad sobre los procesos normales. Se puede llamar a un proceso en tiempo real utilizando el siguiente comando (el ejemplo es cómo declarar una política SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Para obtener el valor PR para un proceso en tiempo real, se aplica la siguiente ecuación:

PR = -1 - rt_prior

Donde rt_prior corresponde a la prioridad entre 1 y 99. Por esa razón, el proceso que tendrá mayor prioridad sobre otros procesos será el llamado con el número 99.

Es importante tener en cuenta que para los procesos en tiempo real, no se utiliza el valor agradable.

Para ver la "simpatía" actual y el valor de PR de un proceso, se puede ejecutar el siguiente comando:

top

Que muestra el siguiente resultado:

ingrese la descripción de la imagen aquí

En la figura se muestran los valores PR y NI. Es bueno observar el proceso con el valor PR -51 que corresponde a un valor en tiempo real. También hay algunos procesos cuyo valor PR se indica como "rt". Este valor en realidad corresponde a un valor PR de -100.

Agustín Barrachina
fuente