Je voudrais surveiller le nombre de threads utilisés par un processus spécifique sous Linux. Existe-t-il un moyen simple d'obtenir ces informations sans affecter les performances du processus?
Je voudrais surveiller le nombre de threads utilisés par un processus spécifique sous Linux. Existe-t-il un moyen simple d'obtenir ces informations sans affecter les performances du processus?
Réponses:
1
car il imprime une ligne comme USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
pour l'en-tête de tableau.
wc
alors que vous le pouviez ps -o thcount <pid>
? Voyez cette réponse .
Pour obtenir le nombre de threads pour un pid donné:
$ ps -o nlwp <pid>
Où nlwp
représente le nombre de processus légers (threads) . Donc ps
alias nlwp
à thcount
, ce qui signifie que
$ ps -o thcount <pid>
fonctionne aussi.
Si vous souhaitez surveiller le nombre de threads, utilisez simplement watch
:
$ watch ps -o thcount <pid>
Pour obtenir la somme de tous les threads en cours d'exécution dans le système:
$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
watch
commande. Cependant, notez que l'utilisation thcount
peut échouer pour certains (Red Hat ...), même si cela a nlwp
fonctionné pour moi.
Chaque thread d'un processus crée un répertoire sous /proc/<pid>/task
. Comptez le nombre de répertoires et vous avez le nombre de threads.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Remplacez simplement le <PID> par votre ID de processus que vous pouvez obtenir top
ou en utilisantps
ps -eLf
sur le shell vous donnera une liste de tous les threads et processus en cours d'exécution sur le système. Ou, vous pouvez exécuter la top
commande puis appuyer sur «H» pour basculer les listes de threads.
-p
à cela si nécessaire, ou quoi que ce soit d'autre. C'est le minimum dont vous avez besoin pour voir la liste des fils.
JStack est assez peu coûteux - une option serait de diriger la sortie via grep pour trouver les threads actifs, puis de passer par wc -l.
Plus graphiquement, JConsole, qui affiche le nombre de threads pour un processus donné.
Si tu utilises:
ps uH p <PID_OF_U_PROCESS> | wc -l
Vous devez soustraire 1 au résultat, car l'une des lignes "wc" compte les en-têtes de la commande "ps".
ps
en- tête comme l'un des threads.
$ ps H p pid-id
H - Répertorie tous les threads individuels d'un processus
ou
$cat /proc/pid-id/status
pid-id est l'ID de processus
par exemple .. (tronqué la sortie ci-dessous)
root@abc:~# cat /proc/8443/status
Name: abcdd
State: S (sleeping)
Tgid: 8443
VmSwap: 0 kB
Threads: 4
SigQ: 0/256556
SigPnd: 0000000000000000
jvmtop peut afficher le nombre de threads jvm actuel à côté d'autres métriques.
Le moyen le plus simple est d'utiliser "htop". Vous pouvez installer "htop" (une version plus sophistiquée de top) qui vous montrera tous vos cœurs, processus et utilisation de la mémoire.
Appuyez sur "Shift + H" pour afficher tout le processus ou appuyez à nouveau pour le masquer. Appuyez sur la touche "F4" pour rechercher le nom de votre processus.
Installation sur Ubuntu ou Debian:
sudo apt-get install htop
Installation sur Redhat ou CentOS:
yum install htop
dnf install htop [On Fedora 22+ releases]
Si vous voulez compiler "htop" à partir du code source, vous le trouverez ici .
Si vous essayez de connaître le nombre de threads utilisant cpu pour un pid donné, j'utiliserais:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Si vous êtes intéressé par ces threads qui sont vraiment actifs - comme faire quelque chose (pas bloqué, pas timed_waiting, ne pas signaler "thread running" mais vraiment attendre qu'un flux donne des données) par opposition à rester inactif mais en direct - - alors vous pourriez être intéressé par jstack-active .
Ce simple script bash s'exécute jstack
puis filtre tous les threads qui, par heuristique, semblent être inactifs, vous montrant des traces de pile pour les threads qui consomment réellement des cycles CPU.
Si vous voulez le nombre de threads par utilisateur dans un système Linux, vous devez utiliser:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
où comme utiliser le nom d'utilisateur souhaité.