Wie messe ich die separate CPU-Kernauslastung für einen Prozess?

114

Gibt es eine Möglichkeit, die CPU-Auslastung eines bestimmten Prozesses anhand von Kernen zu messen?

Ich weiß, dass top gut ist, um die CPU-Auslastung des gesamten Systems anhand von Kernen zu messen , und das Task-Set kann Informationen darüber liefern, auf welchem ​​CPU-Kern der Prozess ausgeführt werden darf.

Aber wie messe ich die CPU-Auslastung eines bestimmten Prozesses anhand der CPU-Kerne?

elang
quelle

Antworten:

139

Sie können dies in noch tun oben . Während oben läuft, drücken Sie ‚1‘ auf der Tastatur, wird es dann die CPU - Auslastung pro Kern zeigen.

Begrenzen Sie die angezeigten Prozesse, indem Sie diesen bestimmten Prozess unter einem bestimmten Benutzerkonto ausführen, und verwenden Sie den Typ 'u', um ihn auf diesen Benutzer zu beschränken

abdollar
quelle
3
Sie können auch drücken, Ium den Irix-Modus umzuschalten (im Gegensatz zum Solaris-Modus ). Wenn on, ist der in der Prozessliste angezeigte Prozentsatz relativ zu einem CPU-Thread . Wenn off, wird der Prozentsatz relativ zur CPU-Gesamtkapazität angezeigt (dh ALLE Threads - auch bekannt als alle Kerne).
7heo.tk
8
Dies ist zu einem einzigen Prozess nicht spezifisch, das die CPU - Auslastung aller Prozesse über mehrere Kerne zeigen
m_vitaly
Wie können wir "1" als Argument übergeben top, mansagt Seite, top -1aber es beschwert sich! Es wäre schön top -1 -n 1, eine einzelne Iteration zu erhalten top, bei der jedoch eine separate CPU-Auslastung angezeigt wird.
Quanten
76

Sie können verwenden:

 mpstat -P ALL 1

Es zeigt an, wie viel jeder Kern beschäftigt ist, und es wird automatisch jede Sekunde aktualisiert. Die Ausgabe wäre ungefähr so ​​(auf einem Quad-Core-Prozessor):

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Dieser Befehl beantwortet jedoch nicht die ursprüngliche Frage, dh er zeigt nicht die CPU-Kernauslastung für einen bestimmten Prozess an.

Kamran Bigdely
quelle
3
Ich denke, das beantwortet die Frage nicht wirklich. Dies ist nur dann dasselbe, wenn keine anderen Prozesse ausgeführt werden. Auch dies scheint keine Quad-Core-CPU zu sein, eher wie ein Acht-Kern (möglicherweise Quad mit aktiviertem HT).
das Schwein
1
Es ist ein Quad-Core mit aktiviertem HT.
Kamran Bigdely
Beantwortet die ursprüngliche Frage nicht. Allerdings, weil ich es nicht erwähnt habe (-1).
KGhatak
1
Ich stimme @KGhatak zu, dies beantwortet nicht die ursprüngliche Frage -1
Jodag
41

Sie können verwenden ps.
zB mit Python-Prozess mit zwei ausgelasteten Threads auf Dual-Core-CPU:

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR ist die CPU-ID, der der Thread derzeit zugewiesen ist.)

Sie sehen, dass die Threads auf demselben CPU-Kern laufen (wegen GIL)

Wenn wir dasselbe Python-Skript in Jython ausführen, sehen wir, dass das Skript beide Kerne verwendet (und es gibt viele andere Dienste oder andere Threads, die fast inaktiv sind):

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

Sie können die Ausgabe verarbeiten und die Gesamt-CPU für jeden CPU-Kern berechnen.

Leider scheint dieser Ansatz nicht 100% zuverlässig zu sein. Manchmal sehe ich, dass im ersten Fall die beiden Arbeitsthreads von jedem CPU-Kern getrennt sind, oder im letzteren Fall, dass die beiden Threads eingeschaltet sind der gleiche Kern ..

Mykhal
quelle
13

htop gibt einen schönen Überblick über die individuelle Kernnutzung

WBM
quelle
4

Die psLösung war fast das, was ich brauchte, und mit einigem Bash wird genau das getan, was die ursprüngliche Frage verlangte: die Nutzung bestimmter Prozesse pro Kern zu sehen

Dies zeigt auch die Verwendung von Multithread- Prozessen pro Kern .

Verwenden Sie wie: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Usage: $0 <pid1> [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

Hinweis: Diese Statistiken werden auf Basis von Prozess Lebensdauer , nicht die letzten X Sekunden, so dass Sie Ihren Prozess neu starten müssen , um den Zähler zurückzusetzen.

Nathan Kidd
quelle
Sie können die C lib-Funktionen read () und open () verwenden, um die Pseudodateien unter / proc / pid / * zu öffnen und alle benötigten Daten zu analysieren.
GL2014
2
dstat -C 0,1,2,3 

Gibt Ihnen auch die CPU-Auslastung der ersten 4 Kerne. Wenn Sie 32 Kerne haben, wird dieser Befehl natürlich etwas länger, ist aber nützlich, wenn Sie nur an wenigen Kernen interessiert sind.

Wenn Sie sich beispielsweise nur für Kern 3 und 7 interessieren, können Sie dies tun

dstat -C 3,7
Fragen und lernen
quelle
Wie wird dies für einen einzelnen Prozess relevant sein?
Einpoklum
1

Ich hatte gerade dieses Problem und ich fand eine ähnliche Antwort hier .

Die Methode besteht darin, topdie gewünschte Einstellung festzulegen und dann W(Großbuchstabe W) zu drücken . Dadurch wird topdas aktuelle Layout in einer Konfigurationsdatei in $ HOME / .toprc gespeichert

Dies funktioniert möglicherweise nicht, wenn Sie mehrere topmit unterschiedlichen Konfigurationen ausführen möchten .

Über eine meiner Meinung nach umgehende Lösung können Sie in verschiedene Konfigurationsdateien schreiben / verschiedene Konfigurationsdateien verwenden, indem Sie eine der folgenden Aktionen ausführen ...

1) Benennen Sie die Binärdatei um

  ln -s /usr/bin/top top2
  ./top2

Jetzt .top2rcwird in Ihr $ HOME geschrieben

2) Setzen Sie $ HOME auf einen alternativen Pfad, da die Konfigurationsdatei in die Datei $ HOME / .binary-name.rc geschrieben wird

HOME=./
top

Jetzt .toprcwird in den aktuellen Ordner geschrieben.

Durch die Verwendung von Kommentaren anderer Personen zum Hinzufügen der verschiedenen Verwendungsabrechnungen oben können Sie eine Stapelausgabe für diese Informationen erstellen, wobei letztere die Informationen über ein Skript zusammenführt. Vielleicht nicht ganz so einfach wie Ihr Skript, aber ich fand top, um mir ALLE Prozesse bereitzustellen, damit ich später einen Zustand auf lange Sicht rekapitulieren und erfassen kann, den ich sonst möglicherweise übersehen hätte (unerklärliche plötzliche CPU-Auslastung aufgrund von Streuprozessen).

Lucien Murray-Pitts
quelle
1

Ich dachte, das perf statist was du brauchst.

Es zeigt eine bestimmte Verwendung eines Prozesses, wenn Sie eine --cpu=listOption angeben . Hier ist ein Beispiel für die Überwachung der CPU-Nutzung beim Erstellen eines Projekts mithilfe eines perf stat --cpu=0-7 --no-aggr -- make all -jBefehls. Die Ausgabe ist:

CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

Die linke Spalte ist der spezifische CPU-Index und die rechte Spalte ist die Nutzung der CPU. Wenn Sie die --no-aggrOption nicht angeben , wird das Ergebnis zusammengefasst. Die --pid=pidOption ist hilfreich, wenn Sie einen laufenden Prozess überwachen möchten.

Versuchen Sie es -a --per-coreoder -a perf-socketauch, wodurch mehr Verschlusssachen angezeigt werden.

Mehr über die Nutzung von perf statin diesem Tutorial sehen: Statistik perf cpu , auch perf help statauf die Bedeutung der Optionen helfen.

elinx
quelle