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
recursivamente
Necesitamos 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 un children
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:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
Si el proceso PID 1234 es el que desea que sea recursivamente agradable, ahora puede hacer:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
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 su gettid(2)
lugar. Vea esta respuesta para más información.
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?