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?
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?
Antworten:
1
, weil es eine Zeile wie USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
für die Tabellenüberschrift druckt .
wc
wenn Sie es gerade könnten ps -o thcount <pid>
? Siehe diese Antwort .
So ermitteln Sie die Anzahl der Threads für eine bestimmte PID:
$ ps -o nlwp <pid>
Wo nlwp
steht für Anzahl der Leichtbauprozesse (Fäden) . Also ps
Aliase nlwp
zu 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 }'
watch
Befehl. Beachten Sie jedoch, dass die Verwendung thcount
für einige (Red Hat ...) fehlschlagen kann, obwohl dies nlwp
für mich funktioniert hat.
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.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Ersetzen Sie einfach die <PID> durch Ihre Prozess-ID, die Sie erhalten top
oder verwenden könnenps
ps -eLf
Auf der Shell erhalten Sie eine Liste aller Threads und Prozesse, die derzeit auf dem System ausgeführt werden. Oder Sie können den top
Befehl ausführen und dann 'H' drücken, um die Thread-Listen umzuschalten.
-p
bei Bedarf ein oder etwas anderes hinzuzufügen . Dies ist das Minimum, das Sie benötigen, um die Thread-Liste anzuzeigen.
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.
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.
ps
als einen der Threads zählen.
$ 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
jvmtop kann neben anderen Metriken die aktuelle Anzahl der jvm-Threads anzeigen.
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 .
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
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 jstack
und 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.
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.