Comment puis-je surveiller le nombre de threads d'un processus sous Linux?


135

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?


Et si le processus d'une application ne s'exécute que pendant une courte période? (Dites 2 secondes.)
user2023370

Réponses:


152

essayer

ps huH p <PID_OF_U_PROCESS> | wc -l

ou htop


3
Je pense que vous devriez en soustraire 1car il imprime une ligne comme USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDpour l'en-tête de tableau.
AhmetB - Google

2
Le «h» masque l'en-tête.
thinkmassive

11
-1 Pourquoi diriger la sortie vers wcalors que vous le pouviez ps -o thcount <pid>? Voyez cette réponse .
Débit

73

Pour obtenir le nombre de threads pour un pid donné:

$ ps -o nlwp <pid>

nlwpreprésente le nombre de processus légers (threads) . Donc psalias 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 }'

2
Réponse la plus utile ici. Surtout la watchcommande. Cependant, notez que l'utilisation thcountpeut échouer pour certains (Red Hat ...), même si cela a nlwpfonctionné pour moi.
Joshua Detwiler

50

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.


1
Pour ajouter au commentaire ci-dessus. Vous pouvez utiliser cette commande pour trouver 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 topou en utilisantps
Navigatron


21

ps -eLfsur 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 topcommande puis appuyer sur «H» pour basculer les listes de threads.


C'est la sauce pour moi. Je ne veux pas le limiter à un seul processus. Il est facile d'ajouter un -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.
Erick Robertson le

6

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é.


6

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".


Bienvenue dans StackOverflow. Sans doute, cela devrait être un commentaire à la réponse de slav0nic. Cependant, si je comprends bien, lorsque vous rejoignez SO pour la première fois, vous ne pouvez (toujours) pas commenter les réponses avant d'avoir acquis une certaine réputation, donc ajouter une réponse est tout ce que vous pouvez faire. Vous avez raison; vous ne devez pas compter la ligne d' psen- tête comme l'un des threads.
Jonathan Leffler

6

Voici une commande qui affiche le nombre de threads d'un processus donné:

ps -L -o pid= -p <pid> | wc -l

Contrairement aux autres psréponses basées, il n'y a ici pas besoin de soustraire 1de sa sortie car il n'y a pas de psligne d'en-tête grâce à l' -o pid=option.


5

$ 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

4

Les nouvelles distributions JDK sont livrées avec JConsole et VisualVM. Les deux sont des outils fantastiques pour obtenir les détails sales d'un processus Java en cours d'exécution. Si vous devez le faire par programme, examinez JMX.



2

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 .


1

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

0

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 jstackpuis 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.



0

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é.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.