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?
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?
Risposte:
1
perché stampa una riga come USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
per l'intestazione della tabella.
wc
quando potresti semplicemente ps -o thcount <pid>
? Vedere questa risposta .
Per ottenere il numero di thread per un determinato pid:
$ ps -o nlwp <pid>
Dove nlwp
sta per Numero di processi leggeri (thread) . Così ps
alias nlwp
a 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 }'
watch
comando. Tuttavia, si noti che l'utilizzo thcount
può fallire per alcuni (Red Hat ...), sebbene abbia nlwp
funzionato per me.
Ogni thread in un processo crea una directory in /proc/<pid>/task
. Conta il numero di directory e hai 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 top
o utilizzareps
ps -eLf
sulla shell ti darà un elenco di tutti i thread e processi attualmente in esecuzione sul sistema. In alternativa, è possibile eseguire il top
comando, quindi premere "H" per attivare o disattivare la visualizzazione dei thread.
-p
se necessario, o qualsiasi altra cosa. Questo è il minimo necessario per visualizzare l'elenco dei thread.
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.
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".
ps
come uno dei thread.
$ 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
jvmtop può mostrare il conteggio dei thread jvm corrente accanto ad altre metriche.
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 .
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
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 jstack
quindi 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.
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.