Come posso monitorare il conteggio dei thread di un processo su Linux?


135

Vorrei monitorare il numero di thread utilizzati da un processo specifico su Linux. Esiste un modo semplice per ottenere queste informazioni senza influire sulle prestazioni del processo?


Che ne dite se il processo di un'applicazione viene eseguito solo per un breve periodo? (Pronuncia 2 secondi.)
user2023370

Risposte:


152

provare

ps huH p <PID_OF_U_PROCESS> | wc -l

o htop


3
Credo che dovresti sottrarlo 1perché stampa una riga come USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDper l'intestazione della tabella.
AhmetB - Google

2
La 'h' nasconde l'intestazione.
thinkmassive,

11
-1 Perché reindirizzare l'output a wcquando potresti semplicemente ps -o thcount <pid>? Vedere questa risposta .
Flusso

73

Per ottenere il numero di thread per un determinato pid:

$ ps -o nlwp <pid>

Dove nlwpsta per Numero di processi leggeri (thread) . Così psalias nlwpa thcount, il che significa che

$ ps -o thcount <pid>

funziona anche.

Se vuoi monitorare il conteggio dei thread, usa semplicemente watch:

$ watch ps -o thcount <pid>

Per ottenere la somma di tutti i thread in esecuzione nel sistema:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

2
La risposta più utile qui. Soprattutto il watchcomando. Tuttavia, si noti che l'utilizzo thcountpuò fallire per alcuni (Red Hat ...), sebbene abbia nlwpfunzionato per me.
Joshua Detwiler,

50

Ogni thread in un processo crea una directory in /proc/<pid>/task. Conta il numero di directory e hai il numero di thread.


1
Per aggiungere al commento sopra. È possibile utilizzare questo comando per trovare il numero di thread: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Basta sostituire <PID> con l'ID del processo da cui è possibile ottenere topo utilizzareps
Navigatron

33
cat /proc/<PROCESS_PID>/status | grep Threads

21

ps -eLfsulla shell ti darà un elenco di tutti i thread e processi attualmente in esecuzione sul sistema. In alternativa, è possibile eseguire il topcomando, quindi premere "H" per attivare o disattivare la visualizzazione dei thread.


Questa è la salsa per me. Non voglio limitarlo a un solo processo. È facile aggiungerne uno -pse necessario, o qualsiasi altra cosa. Questo è il minimo necessario per visualizzare l'elenco dei thread.
Erick Robertson,

6

JStack è abbastanza economico - un'opzione sarebbe quella di reindirizzare l'output attraverso grep per trovare thread attivi e quindi passare attraverso wc -l.

Più graficamente è JConsole, che mostra il conteggio dei thread per un determinato processo.


6

Se usi:

ps uH p <PID_OF_U_PROCESS> | wc -l

Devi sottrarre 1 al risultato, poiché una delle righe che "wc" sta contando sono le intestazioni del comando "ps".


Benvenuto in StackOverflow. Probabilmente, questo dovrebbe essere un commento alla risposta di slav0nic. Tuttavia, a quanto ho capito, quando ti iscrivi per la prima volta a SO, non puoi (ancora) commentare le risposte fino a quando non avrai guadagnato una certa reputazione, quindi aggiungere una risposta è tutto ciò che puoi fare. Hai ragione; non dovresti contare la riga di intestazione pscome uno dei thread.
Jonathan Leffler,

6

Ecco un comando che visualizza il numero di thread di un determinato processo:

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

A differenza delle altre psrisposte basate, qui non è necessario sottrarre 1dal suo output in quanto non vi è alcuna psriga di intestazione grazie -o pid=all'opzione.


5

$ ps H p pid-id

H: elenca tutti i singoli thread in un processo

o

$cat /proc/pid-id/status

pid-id è l'ID processo

es. (troncato l'output di seguito)

root@abc:~# cat /proc/8443/status
Name:   abcdd
State:  S (sleeping)
Tgid:   8443
VmSwap:        0 kB
Threads:    4
SigQ:   0/256556
SigPnd: 0000000000000000

4

Le nuove distribuzioni JDK vengono fornite con JConsole e VisualVM. Entrambi sono strumenti fantastici per ottenere i dettagli sporchi da un processo Java in esecuzione. Se devi farlo a livello di codice, controlla JMX.



2

Il modo più semplice è usare "htop". Puoi installare "htop" (una versione più elaborata di top) che ti mostrerà tutti i tuoi core, processo e utilizzo della memoria.

Premi "Maiusc + H" per mostrare tutto il processo o premi di nuovo per nasconderlo. Premere il tasto "F4" per cercare il nome del processo.

Installazione su Ubuntu o Debian:

sudo apt-get install htop

Installazione su Redhat o CentOS:

yum install htop
dnf install htop      [On Fedora 22+ releases]

Se vuoi compilare "htop" dal codice sorgente, lo troverai qui .


1

Se stai cercando di scoprire il numero di thread usando cpu per un determinato pid, userei:

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l

0

Se sei interessato a quei thread che sono veramente attivi - come nel fare qualcosa (non bloccato, non timed_waiting, non riportando "thread in esecuzione" ma aspettando davvero che uno stream fornisca dati) invece di rimanere inattivo ma in diretta - - allora potresti essere interessato a jstack-active .

Questo semplice script bash esegue jstackquindi il filtro di tutti i thread che per euristica sembrano essere inattivi, mostrandoti le tracce dello stack per quei thread che stanno effettivamente consumando cicli di CPU.



0

Se si desidera il numero di thread per utente in un sistema Linux, è necessario utilizzare:

ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'

dove come usare il nome utente desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.