Wie kann ich die Thread-Anzahl eines Prozesses unter Linux überwachen?

135

Ich möchte die Anzahl der Threads überwachen, die von einem bestimmten Prozess unter Linux verwendet werden. Gibt es eine einfache Möglichkeit, diese Informationen abzurufen, ohne die Leistung des Prozesses zu beeinträchtigen?

Fließen
quelle
Wie wäre es, wenn der Prozess einer Anwendung nur für kurze Zeit ausgeführt wird? (Sagen Sie 2 Sekunden.)
user2023370

Antworten:

152

Versuchen

ps huH p <PID_OF_U_PROCESS> | wc -l

oder htop

slav0nic
quelle
3
Ich glaube, Sie sollten davon subtrahieren 1, weil es eine Zeile wie USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDfür die Tabellenüberschrift druckt .
AhmetB - Google
2
Das 'h' verbirgt den Header.
thinkmassive
11
-1 Warum die Ausgabe weiterleiten, wcwenn Sie es gerade könnten ps -o thcount <pid>? Siehe diese Antwort .
Flow
73

So ermitteln Sie die Anzahl der Threads für eine bestimmte PID:

$ ps -o nlwp <pid>

Wo nlwpsteht für Anzahl der Leichtbauprozesse (Fäden) . Also psAliase nlwpzu thcount, was bedeutet, dass

$ ps -o thcount <pid>

funktioniert auch.

Wenn Sie die Threadanzahl überwachen möchten, verwenden Sie einfach watch:

$ watch ps -o thcount <pid>

So erhalten Sie die Summe aller im System ausgeführten Threads:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
Thejaswi R.
quelle
2
Die nützlichste Antwort hier. Besonders der watchBefehl. Beachten Sie jedoch, dass die Verwendung thcountfür einige (Red Hat ...) fehlschlagen kann, obwohl dies nlwpfür mich funktioniert hat.
Joshua Detwiler
50

Jeder Thread in einem Prozess erstellt ein Verzeichnis unter /proc/<pid>/task. Zählen Sie die Anzahl der Verzeichnisse und Sie haben die Anzahl der Threads.

bdonlan
quelle
1
Zum obigen Kommentar hinzufügen. Mit diesem Befehl können Sie die Anzahl der Threads ermitteln : find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Ersetzen Sie einfach die <PID> durch Ihre Prozess-ID, die Sie erhalten topoder verwenden könnenps
Navigatron
33
cat /proc/<PROCESS_PID>/status | grep Threads
PbxMan
quelle
21

ps -eLfAuf der Shell erhalten Sie eine Liste aller Threads und Prozesse, die derzeit auf dem System ausgeführt werden. Oder Sie können den topBefehl ausführen und dann 'H' drücken, um die Thread-Listen umzuschalten.


quelle
Das ist die Sauce für mich. Ich möchte es nicht nur auf einen Prozess beschränken. Es ist einfach, -pbei Bedarf ein oder etwas anderes hinzuzufügen . Dies ist das Minimum, das Sie benötigen, um die Thread-Liste anzuzeigen.
Erick Robertson
6

JStack ist recht kostengünstig - eine Option wäre, die Ausgabe durch grep zu leiten, um aktive Threads zu finden, und dann durch wc -l zu leiten.

Grafischer ist JConsole, das die Thread-Anzahl für einen bestimmten Prozess anzeigt.

Rhys Keepence
quelle
6

Wenn du benutzt:

ps uH p <PID_OF_U_PROCESS> | wc -l

Sie müssen 1 vom Ergebnis abziehen, da eine der Zeilen, die "wc" zählt, die Überschriften des Befehls "ps" sind.

Flexodruck
quelle
Willkommen bei StackOverflow. Dies sollte wohl ein Kommentar zur Antwort von slav0nic sein. Soweit ich weiß, können Sie beim ersten Beitritt zu SO (noch) keine Kommentare zu Antworten abgeben, bis Sie einen guten Ruf erlangt haben. Das Hinzufügen einer Antwort ist also alles, was Sie tun können. Du hast Recht; Sie sollten die Kopfzeile nicht psals einen der Threads zählen.
Jonathan Leffler
6

Hier ist ein Befehl, der die Anzahl der Threads eines bestimmten Prozesses anzeigt:

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

Im Gegensatz zu den anderen psAntworten besteht hier keine Notwendigkeit, 1von der Ausgabe abzuziehen, da psdank der -o pid=Option keine Kopfzeile vorhanden ist .

jlliagre
quelle
5

$ ps H p pid-id

H - Listet alle einzelnen Threads in einem Prozess auf

oder

$cat /proc/pid-id/status

pid-id ist die Prozess-ID

zB .. (Die folgende Ausgabe abgeschnitten)

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
quelle
4

Neuere JDK-Distributionen werden mit JConsole und VisualVM geliefert. Beide sind fantastische Tools, um die schmutzigen Details eines laufenden Java-Prozesses abzurufen. Wenn Sie dies programmgesteuert tun müssen, untersuchen Sie JMX.

Basszero
quelle
2

jvmtop kann neben anderen Metriken die aktuelle Anzahl der jvm-Threads anzeigen.

MRalwasser
quelle
2

Der einfachste Weg ist die Verwendung von "htop". Sie können "htop" (eine schickere Version von top) installieren, die Ihnen alle Ihre Kerne, Prozesse und Speichernutzung anzeigt.

Drücken Sie "Umschalt + H", um alle Vorgänge anzuzeigen, oder drücken Sie erneut, um sie auszublenden. Drücken Sie die Taste "F4", um Ihren Prozessnamen zu suchen.

Installation unter Ubuntu oder Debian:

sudo apt-get install htop

Installation unter Redhat oder CentOS:

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

Wenn Sie "htop" aus dem Quellcode kompilieren möchten, finden Sie es hier .

Saeed Zahedian Abroodi
quelle
1

Wenn Sie versuchen, die Anzahl der Threads mit CPU für eine bestimmte PID herauszufinden, würde ich verwenden:

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

Wenn Sie an solchen Threads interessiert sind, die wirklich aktiv sind - wie etwas zu tun (nicht blockiert, nicht timed_waiting, kein "Thread läuft", sondern wirklich darauf zu warten, dass ein Stream Daten liefert), anstatt im Leerlauf herumzusitzen, aber live - - Dann könnten Sie an jstack-active interessiert sein .

Dieses einfache Bash-Skript wird ausgeführt jstackund filtert dann alle Threads heraus, die nach Heuristiken im Leerlauf zu sein scheinen. Es zeigt Ihnen Stapelspuren für die Threads, die tatsächlich CPU-Zyklen verbrauchen.

Teilweise wolkig
quelle
0

VisualVM kann eindeutige Status von Threads eines bestimmten JVM-Prozesses anzeigen

Geben Sie hier die Bildbeschreibung ein

Eintauchen in
quelle
1
selbstinduziertes Thrashing? Mist!
Andrew Scott Evans
0

Wenn Sie die Anzahl der Threads pro Benutzer in einem Linux-System möchten, sollten Sie Folgendes verwenden:

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

wo als den gewünschten Benutzernamen verwenden.

Andreas Foteas
quelle