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?

Couler
la source
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

slav0nic
la source
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 }'
Thejaswi R
la source
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.

bdonlan
la source
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
33
cat /proc/<PROCESS_PID>/status | grep Threads
PbxMan
la source
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.


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

rhys keepence
la source
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".

flexo
la source
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.

jlliagre
la source
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
Avinash Reddy
la source
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.

basszero
la source
2

jvmtop peut afficher le nombre de threads jvm actuel à côté d'autres métriques.

MRalwasser
la source
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 .

Saeed Zahedian Abroodi
la source
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
Manuel Mndza Bañs
la source
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.

Partiellement nuageux
la source
0

VisualVM peut afficher des états clairs des threads d'un processus JVM donné

entrez la description de l'image ici

Plonger dans
la source
1
battage auto-induit? dang!
Andrew Scott Evans
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é.

Andreas Foteas
la source