Linux no sigue (todavía) el estándar POSIX.1 que dice que un renice
proceso afecta a "todos los hilos del alcance del sistema en el proceso", porque de acuerdo con el documento pthreads (7) "los hilos no comparten un valor agradable común".
Sin embargo, a veces, puede ser conveniente renice
"todo" relacionado con un proceso dado (un ejemplo sería procesos hijos de Apache y todos sus hilos). Asi que,
- ¿Cómo puedo
renice
todos los hilos que pertenecen a un proceso dado? - ¿Cómo puedo
renice
todos los procesos secundarios que pertenecen a un proceso dado?
Estoy buscando una solución bastante fácil.
Sé que los grupos de procesos a veces pueden ser útiles, sin embargo, no siempre coinciden con lo que quiero hacer: pueden incluir un conjunto de procesos más amplio o diferente.
Usar un cgroup
administrado por systemd
también podría ser útil, pero incluso si estoy interesado en escucharlo, en su mayoría busco una solución "estándar".
EDITAR: también, man (7) pthreads
dice "todos los hilos en un proceso se colocan en el mismo grupo de hilos; todos los miembros de un grupo de hilos comparten el mismo PID". Entonces, ¿es posible incluso renice
algo que no tenga su propio PID?
man (7) pthreads
dice acerca de la implementación actual (NPTL): "todos los subprocesos en un proceso se colocan en el mismo grupo de subprocesos; todos los miembros de un grupo de subprocesos comparten el mismo PID" y "Los subprocesos no comparten un valor agradable común". Entonces, ¿cómo puede cambiar el tamaño de un hilo que no tiene su propio PID, cuandorenice
utiliza un PID para hacerlo?24995 (process ID) old priority 0, new priority -10
. 24995 no aparece enps
, por lo que no es un proceso. ¿Tal vez el cambio de hilos realmente funciona?Buen valor o acciones de CPU?
Tenga en cuenta que hoy en día, los valores agradables pueden no ser tan relevantes "en todo el sistema", debido a la agrupación automática de tareas, espacialmente cuando se usa systemd . Por favor vea esta respuesta para más detalles.
Diferencia entre hilos y procesos
Pregunta importante sobre Linux, porque la documentación perpetúa dudas (sobre hilos que no tienen su propio PID, por ejemplo).
Nota: esta respuesta explica los hilos de Linux con precisión.
En resumen: el núcleo solo maneja "entidades ejecutables", es decir, algo que se puede ejecutar y programar . Kernel sabio, estas entidades se llaman procesos. Un hilo es solo un tipo de proceso que comparte (al menos) espacio de memoria y manejadores de señal con otro.
Cada uno de estos procesos tiene un identificador único en todo el sistema: el PID (ID del proceso). Para los llamados subprocesos, a veces se llama TID (ID de subproceso), pero desde el punto de vista sysadmin (y kernel!), TID y PID son lo mismo (comparten el mismo espacio de nombres).
Como resultado, puede
renice
"enhebrar" individualmente porque tienen su propio PID 1 .Encontrar todos los PIDs
renice
recursivamenteNecesitamos obtener los PID de todos los procesos ("normales" o "hilo") que son descendientes (hijos o en el grupo de hilos) del proceso a ser percibido. Esto debería ser recursivo (teniendo en cuenta los hijos de los niños).
La respuesta de Anton Leontiev da la pista para hacerlo: todos los nombres de carpetas
/proc/$PID/task/
son PID de hilos que contienen unchildren
archivo que enumera los posibles procesos secundarios.Sin embargo, carece de recursividad, por lo que aquí hay un script de shell rápido y sucio para encontrarlos:
Si el proceso PID 1234 es el que desea que sea recursivamente agradable, ahora puede hacer:
1 Tenga en cuenta que, para el cumplimiento de POSIX, llamar
getpid(2)
dentro de un subproceso no le dará el ID único (PID) de todo el sistema de esta entidad ejecutable, sino el PID del proceso principal dentro del "grupo de subprocesos". Tendría que llamar en sugettid(2)
lugar. Vea esta respuesta para más información.fuente
No debemos confundir el PID del proceso y la identificación del hilo alguna vez escrito TID o en el comando ps LPW. El
s
comando tiene opciones para mostrar subprocesos, y debajotop
ohtop
puede cambiar entre subprocesos y procesar porH
letra. Como dijo anteriormente @Totor, con NPTL, que es la implementación actual con kernel> 2.6, todos los subprocesos tienen el mismo pid, pero tienen un tid distinto. Muestra todos los hilos de un proceso:Estos tid son los nombres de los directorios debajo
/proc/<pid>/task
, e incluso si renice (1) dice que su argumento predeterminado es un pid cuando se aplica a un pid, renice solo el hilo principal (esto es un error en la implementación de Linux como está escrito en setpriority (2) ) ), también se puede aplicar a un tid y renice el hilo. Es por eso que la respuesta de @Anton es válida.Pero la mayoría de las veces hay una manera más fácil de lograr el resultado deseado, todos estos hilos comparten el mismo pgid que es el pid del líder del grupo; Puedes cambiar el tamaño por pgid emitiendo:
Si no desea cambiar el proceso de otro proceso que depende del mismo líder del grupo, debe usar la receta de @ Anton:
o:
También es posible que desee saber cuáles son los otros procesos del mismo grupo que el proceso que desea cambiar, es decir, los procesos que comparten tienen el mismo pgid. Puede usar ps (1) ,
ps
no permite seleccionar procesos por líder de grupo, pero puedeps
hacer un grep para hacerlo. Los procesos con pgid1908
serán dados por el comando:o si prefieres awk a sed:
fuente
$ renice -n 18 -g 8524 renice: failed to get priority for 8524 (process group ID): No such process $ ps --no-header axo pid,pgid|awk '{if ($2=="8524") print $1;}'
Considerando que el método de Totor funciona / todavía funciona:$ /bin/ls /proc/8524/task | /usr/bin/xargs renice 19 2739 (process ID) old priority 19, new priority 19 2740 (process ID) old priority 19, new priority 19 ...
he confirmado con / proc, htop, pstree, etc. que tengo el top- correcto nivel PID. Tal vez algo ha cambiado en el último año./proc/8524/task
perorenice -g
fallará. Cuando observa un árbol de procesos, una rama está en el mismo grupo de procesos, no solo un proceso enhebrado. Intente nuevamente verificando el resultado deps -Ljf
.Me gustaría recomendar el uso del argumento -g (grupos de procesos) en lugar de -p (id del proceso) mientras utilizo renice. Hace lo mismo sin el bash-foo.
es decir
fuente
Aquí hay un guión mío:
fuente