Belle valeur ou parts de CPU?
Veuillez noter que de nos jours, les bonnes valeurs peuvent ne pas être aussi pertinentes "à l'échelle du système", en raison du regroupement automatique des tâches, surtout lorsque vous utilisez systemd . Veuillez consulter cette réponse pour plus de détails.
Différence entre les threads et les processus
Question importante sous Linux, car la documentation perpétue les doutes (sur les threads n'ayant pas leur propre PID par exemple).
Remarque: cette réponse explique précisément les threads Linux.
En bref: le noyau ne gère que les "entités exécutables", c'est-à-dire quelque chose qui peut être exécuté et planifié . Du point de vue du noyau, ces entités sont appelées processus. Un thread, est juste une sorte de processus qui partage (au moins) l'espace mémoire et les gestionnaires de signaux avec un autre.
Chacun de ces processus possède un identifiant unique à l'échelle du système: le PID (Process ID). Pour les soi-disant threads, il est parfois appelé TID (Thread ID), mais du point de vue sysadmin (et du noyau!), TID et PID sont la même chose (ils partagent le même espace de noms).
En conséquence, vous pouvez renice
chaque "thread" individuellement car ils ont leur propre PID 1 .
Recherche de tous les PID à renice
récursive de
Nous devons obtenir les PID de tous les processus ("normaux" ou "thread") qui sont descendants (enfants ou dans le groupe de threads) du processus à mettre en réseau. Cela devrait être récursif (compte tenu des enfants des enfants).
La réponse d' Anton Leontiev donne l'astuce pour le faire: tous les noms de dossiers /proc/$PID/task/
sont des PID de threads contenant un children
fichier répertoriant les processus enfants potentiels.
Cependant, il manque de récursivité, alors voici un script shell rapide et sale pour les trouver:
#!/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 le processus PID 1234 est celui que vous souhaitez utiliser de manière récursive, vous pouvez maintenant faire:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1 Notez que, pour la conformité POSIX, l'appel getpid(2)
dans un thread ne vous donnera pas l'ID unique (PID) à l'échelle du système de cette entité exécutable, mais plutôt le PID du processus principal dans le "groupe de threads". Vous auriez besoin d'appeler à la gettid(2)
place. Voir cette réponse pour plus d'informations.
man (7) pthreads
dit à propos de l'implémentation actuelle (NPTL): "tous les threads d'un processus sont placés dans le même groupe de threads; tous les membres d'un groupe de threads partagent le même PID" et "Les threads ne partagent pas une valeur commune". Alors, comment pouvez-vous retailler un thread qui n'a pas son propre PID, quandrenice
utilise un PID pour le faire?