El comportamiento que está viendo es casi seguro debido a la función de autogrupo que se agregó en Linux 2.6.38 (en 2010). Presumiblemente cuando describió la ejecución de los dos comandos, se ejecutaron en ventanas de terminal diferentes. Si los había ejecutado en la misma ventana del terminal , entonces debería haber visto que el buen valor tiene un efecto. El resto de esta respuesta elabora la historia.
El núcleo proporciona una característica conocida como autoagrupar para mejorar el rendimiento escritorio interactivo en la cara de multiproceso, las cargas de trabajo intensivas de la CPU como la construcción del núcleo de Linux con un gran número de procesos de construcción paralelas (es decir, la bandera make(1) -j
).
Se crea un nuevo autogrupo cuando se crea una nueva sesión a través de setsid(2)
; esto sucede, por ejemplo, cuando se inicia una nueva ventana de terminal. Un nuevo proceso creado por fork(2)
hereda la membresía de autogrupo del padre . Por lo tanto, todos los procesos en una sesión son miembros del mismo autogrupo.
Cuando se habilita la agrupación automática, todos los miembros de un autogrupo se colocan en el mismo "grupo de tareas" del planificador de kernels. El programador del kernel de Linux emplea un algoritmo que iguala la distribución de los ciclos de CPU en los grupos de tareas. Los beneficios de esto para el rendimiento de escritorio interactivo se pueden describir a través del siguiente ejemplo.
Supongamos que hay dos autogroups que compiten por la misma CPU (es decir, suponer o bien un sistema de CPU solo o el uso de taskset(1)
para confinar todos los procesos a la misma CPU en un sistema SMP). El primer grupo contiene diez procesos vinculados a la CPU de una creación de kernel comenzada con make -j10
. El otro contiene un solo proceso de CPU : un reproductor de video. El efecto de la autoagrupación es que los dos grupos recibirán la mitad de los ciclos de la CPU. Es decir, , el reproductor de video recibirá el 50% de los ciclos de la CPU, en lugar de solo el 9% de los ciclos, lo que probablemente ocasione una reproducción de video degradado .La situación en un sistema SMP es más compleja, pero el efecto general es el mismo: el planificador distribuye ciclos de CPU entre grupos de tareas, de forma que un autogrupo que contiene un gran número de procesos vinculados a CPU no termina acaparando ciclos de CPU a expensas de los otros trabajos en el sistema.
El valor agradable y programación de grupos
Al programar los procesos en tiempo no real (por ejemplo, aquellos que está previsto bajo la política predeterminada SCHED_OTHER
), el programador emplea una técnica conocida como "programación de grupos", bajo qué hilos están programados en "grupos de tareas". Los grupos de tareas se forman en las diversas circunstancias, con el caso relevante aquí se autoagrupa.
Si se habilita el autoagrupar, entonces todos los hilos que son (implícitamente) colocados en un Autogroup (es decir, la misma sesión, como creado por setsid(2)
) forman un grupo de tareas. Cada nuevo autogrupo es , por lo tanto, un grupo de tareas por separado.
Bajo programación de grupos, buen valor de un hilo tiene un efecto para decisiones de planificación sólo en relación con otros hilos en el grupo de tarea misma . Esto tiene algunas consecuencias sorprendentes en términos de la semántica tradicional del buen valor en los sistemas UNIX. En particular, si está habilitada la autoagrupación (que es la predeterminada en varias distribuciones de Linux), entonces empleando nice(1)
en un proceso tiene un efecto solo para la programación relativa a otros procesos ejecutados en la misma sesión (típicamente: la misma ventana de terminal) .
el contrario, para dos procesos que son (por ejemplo) los únicos procesos vinculados a la CPU en diferentes sesiones (por ejemplo, diferentes terminales ventanas, cada uno de cuyos puestos de trabajo están vinculados a diferentes autogroups), modificando el valor agradable de el proceso en una de las sesiones tiene sin efecto en términos de las decisiones del planificador en relación con el proceso en la otra sesión. Presumiblemente, este es el escenario que vio, aunque no menciona explícitamente el uso de dos ventanas de terminal.
Si desea evitar que autoagrupar interferir con el comportamiento tradicional nice
como se describe aquí, se puede desactivar la función de
echo 0 > /proc/sys/kernel/sched_autogroup_enabled
Ten en cuenta que esto también tendrá el efecto de desactivación de los beneficios para la interactividad de escritorio que la función de autogrupo estaba destinada a proporcionar (ver arriba).
El buen valor Autogroup
membresía Autogroup de un proceso puede ser visto a través de el archivo /proc/[pid]/autogroup
:
$ cat /proc/1/autogroup
/autogroup-1 nice 0
Este archivo también se puede utilizar para modificar el ancho de banda de la CPU asignada a un Autogroup . Esto se hace escribiendo un número en el rango "bueno" en el archivo para establecer el buen valor del autogrupo. El rango de permitido es de +19 (baja prioridad) a -20 (alta prioridad).entorno agradable
El Autogroup tiene el mismo significado que el valor agradable proceso , pero se aplica a la distribución de ciclos de CPU a la Autogroup como un todo, basado en los valores agradables relativos de otros autogroups. Para un proceso dentro de un autogrupo, la CPU ciclos que recibe será un producto del buen valor del autogrupo (comparado con a otros autogrupos) y el buen valor del proceso (en comparación con otros procesos en el mismo autogrupo).
¿Cuáles fueron los cálculos? Quizás no haya suficiente contención en el procesador para marcar la diferencia – laher
Los cálculos dentro del ciclo son bastante largos. También verifiqué la salida del ensamblador generado y no se optimizó nada (compilado con la configuración de optimización más baja en gcc). –
posible duplicado de [Entender renice] (http://stackoverflow.com/questions/22090126/understanding-renice) – ninjalj