Ich möchte programmgesteuert [in C] die CPU-Auslastung% für eine bestimmte Prozess-ID unter Linux berechnen.
Wie können wir die Echtzeit-CPU-Auslastung% für einen bestimmten Prozess ermitteln?
Um es noch deutlicher zu machen:
- Ich sollte in der Lage sein, die CPU-Auslastung für die bereitgestellte Prozess-ID oder den Prozess zu bestimmen.
- Der Prozess muss nicht der untergeordnete Prozess sein.
- Ich möchte die Lösung in der Sprache 'C'.
Antworten:
Sie müssen die Daten aus analysieren
/proc/<PID>/stat
. Dies sind die ersten Felder (ausDocumentation/filesystems/proc.txt
Ihrer Kernelquelle):Du bist wahrscheinlich hinterher
utime
und / oderstime
. Sie müssen auch diecpu
Zeile lesen/proc/stat
, die wie folgt aussieht:Hier erfahren Sie die kumulierte CPU-Zeit, die in verschiedenen Kategorien verwendet wurde, in Einheiten von Sekundenschnelle. Sie müssen die Summe der Werte in dieser Zeile nehmen, um ein
time_total
Maß zu erhalten.Lesen Sie beide
utime
undstime
den Prozess, an dem Sie interessiert sind, und lesen Sietime_total
aus/proc/stat
. Schlafen Sie dann etwa eine Sekunde und lesen Sie sie alle noch einmal. Sie können jetzt die CPU-Auslastung des Prozesses über die Abtastzeit berechnen mit:Sinn ergeben?
quelle
/proc/stat
Wanduhrzeit entspricht, hängt von der Architektur und der Konfiguration Ihres Kernels ab. Wichtig ist jedoch, dass Sie wissen, wie viele Jiffies die CPU insgesamt ausgeführt hat und/proc/<PID>/stat
wie viele Jiffies von a ausgeführt wurden einzelner Prozess.man proc
ist dein Freund (Suche nach/proc/[pid]/stat
)/proc
Pseudo-Dateisystems: Das Erlernen von Standardfunktionen für den Zugriff auf C-Dateisysteme ist wiefopen()
undscanf()
nebensächlich.getrusage () kann Ihnen dabei helfen, die Verwendung des aktuellen Prozesses oder seines untergeordneten Prozesses zu bestimmen
Update: Ich kann mich nicht an eine API erinnern. Alle Details befinden sich jedoch in / proc / PID / stat. Wenn wir sie also analysieren könnten, könnten wir den Prozentsatz ermitteln.
BEARBEITEN: Da die Berechnung von CPU% nicht einfach ist, können Sie hier Stichproben verwenden. Lesen Sie ctime und utime für eine PID zu einem bestimmten Zeitpunkt und lesen Sie dieselben Werte nach 1 Sekunde erneut. Finde den Unterschied und dividiere durch hundert. Sie erhalten die Nutzung für diesen Prozess für die letzte Sekunde.
(Wird möglicherweise komplexer, wenn viele Prozessoren vorhanden sind.)
quelle
Einfacher Schritt für Schritt für Anfänger wie mich:
/proc/stat
, um zu erhaltentotal_cpu_usage1
./proc/pid/stat
wopid
ist die PID des Prozesses Sie die CPU - Auslastung wissen möchten, wie folgt aus :usertime
undsystemtime
und bekommeproc_times1
total_cpu_usage2
undproc_times2
Die Formel lautet:
Sie können die Anzahl der CPUs von erhalten
/proc/cpuinfo
.quelle
#include <unistd.h>
und nennen Sie diese Methodeint nb = sysconf(_SC_NPROCESSORS_ONLN);
Ich habe zwei kleine C-Funktionen basierend auf der Antwort von cafs geschrieben, um die Benutzer- und Kernel-CPU-Auslastung eines Prozesses zu berechnen: https://github.com/fho/code_snippets/blob/master/c/getusage.c
quelle
Sie können die Manpage für proc für weitere Details lesen, aber zusammenfassend können Sie / proc / [number] / stat lesen, um Informationen über einen Prozess zu erhalten. Dies wird auch vom Befehl 'ps' verwendet.
Alle Felder und ihre Scanf-Formatspezifizierer sind in der Proc-Manpag e dokumentiert .
Hier sind einige Informationen aus der Manpage kopiert (es ist ziemlich lang):
quelle
ps aux
ist besser :)Schauen Sie sich den Befehl "pidstat" an, der genau so klingt, wie Sie es benötigen.
quelle
Das ist meine Lösung ...
quelle
Wenn Sie einen bestimmten Prozess überwachen möchten, erfolgt dies normalerweise per Skript. Hier ist ein Perl-Beispiel. Dadurch werden die Prozentwerte auf die gleiche Weise wie oben angegeben und auf eine CPU verteilt. Wenn dann ein Prozess aktiv ist und mit 2 Threads arbeitet, kann die CPU-Auslastung mehr als 100% betragen. Schauen Sie sich insbesondere an, wie CPU-Kerne gezählt werden: D Lassen Sie mich dann mein Beispiel zeigen:
Ich hoffe, es wird Ihnen bei jeder Überwachung helfen. Natürlich sollten Sie scanf oder andere C-Funktionen verwenden, um alle Perl-Regexpes, die ich verwendet habe, in C-Quellen zu konvertieren. Natürlich ist 1 Sekunde zum Schlafen nicht obligatorisch. Sie können jederzeit verwenden. Der Effekt ist, dass Sie eine durchschnittliche Belastung für den angegebenen Zeitraum erhalten. Wenn Sie es zur Überwachung verwenden, sollten Sie natürlich die letzten Werte außerhalb setzen. Dies ist erforderlich, da die Überwachung normalerweise regelmäßig Skripte aufruft und das Skript seine Arbeit so schnell wie möglich beenden sollte.
quelle
Installieren
psacct
oderacct
verpacken. Verwenden Sie dann densa
Befehl, um die CPU-Zeit anzuzeigen, die für verschiedene Befehle verwendet wird. sa man pageEin schönes Howto von der nixCraft Seite.
quelle
Ich denke, es lohnt sich, den Quellcode des GNU-Befehls "time" zu betrachten. Zeit Gibt die CPU-Zeit des Benutzers / Systems zusammen mit der tatsächlich verstrichenen Zeit aus. Es ruft den Systemaufruf wait3 / wait4 auf (falls verfügbar), andernfalls ruft es den Systemaufruf mal auf. wait * Systemaufruf gibt eine Strukturvariable "rusage" zurück und times Systemaufruf gibt "tms" zurück. Sie können sich auch den getrusage-Systemaufruf ansehen, der auch sehr interessante Timing-Informationen zurückgibt. Zeit
quelle
Anstatt dies aus proc zu analysieren, kann man Funktionen wie getrusage () oder clock_gettime () verwenden und die CPU-Auslastung als Verhältnis oder Wanduhrzeit und -zeit des auf der CPU verwendeten Prozesses / Threads berechnen.
quelle
Use strace hat festgestellt, dass die CPU-Auslastung nach einem bestimmten Zeitraum berechnet werden muss:
quelle