Um die Gesamt-CPU-Zeit eines Benutzers zu messen, verwende ich das Feld "utime" aus /proc/[pid]/stat
:
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(von man proc (5) )
Meine "Benutzerzeit" ist also die Summe utime
aller PIDs, die dieser Benutzer ausführt.
Ich hoffe, dies gibt mir einen genauen Wert für die Anzahl der CPU-Sekunden, die dieser Benutzer verbracht hat. Bin ich auf dem richtigen Weg?
Einige der Dinge, die ich noch nicht verstehe oder berücksichtige:
- Jede PID hat auch eine übergeordnete PID (oder Null). Aber ich zähle jede PID, nicht nur die mit einer ppid von 0. Ist das richtig?
- Es gibt neben utime auch stime, cutime und cstime. Muss ich mir darüber Sorgen machen? Ich gehe davon aus, dass utime die Gesamtzahl der CPU-Sekunden für eine PID ist, ohne die übergeordnete.
Wenn ich die Gesamt-CPU-Zeit des Systems mit berechne /proc/uptime
, liegt dieser Wert für alle Benutzer ziemlich nahe an meiner Summe, aber der Unterschied ist erheblich. Zum Beispiel (in Minuten):
system cpu_time: 96.13
sum of users_cputime: 111.45
Korrektur:
Ich bekomme "vernünftig aussehende" Werte für alle möglichen Dinge. Im Moment verwende ich die Summe aus Utime, Stime, Cutime und Cstime. Und es werden Werte gemeldet, die, obwohl ich sie nicht verstehe, sehr gut mit Messungen von korrelieren time
.
Wenn ich völlig auf dem falschen Weg bin, gibt es eine andere Frage:
- Was ist der fairste Weg, um die gesamte CPU-Zeit zu überwachen - pro Benutzer? (+500 Kopfgeld) auf Ask Ubuntu
/proc/cputime
Ich habe keine Informationen über die Zeit, die die CPUs für die Ausführung von Prozessen aufgewendet haben. Daher bin ich verwirrt, wie hoch Ihre Berechnung für die System-CPU-Zeit ist. Wenn Sie etwas mit der zweiten Nummer tun, ist dies die Zeit, die für die Leerlaufaufgabe aufgewendet wird . Ich weiß nicht genau, was das in der Praxis bedeutet./proc/uptime
? Dann würde die E / A, die der Leerlaufaufgabe zugeordnet ist, den Unterschied erklären. Ich weiß nichts über das Thema, daher vermute ich, dass mir etwas Wichtiges fehlt: Ich würde nicht erwarten, dass bei der Leerlaufaufgabe so viel passiert, insbesondere wenn man bedenkt, dass Ihrer Cputime-Summe der Benutzer wahrscheinlich viel Kurzzeit fehlt. gelebte Prozesse.Antworten:
Die traditionelle Methode zum Protokollieren und Verfolgen der CPU-Zeit des Benutzers ist die Prozessabrechnung . Installieren Sie unter Linux die GNU-Kontoführungsdienstprogramme , die normalerweise von einem Paket namens bereitgestellt werden
acct
. Ich bin mir nicht sicher, wie genau es sein wird, die Zeit zu verfolgen, die in sehr kurzlebigen Prozessen verbracht wird, aber es werden zumindest alle Prozesse aufgelistet, die jemals ausgeführt wurden.Führen Sie
lastcomm
diese Option aus , um eine Liste aller von einem Benutzer ausgeführten Befehle und die jeweils aufgewendete Zeit abzurufen (gerundet auf ~ 10 ms für kurzlebige Prozesse, erwarten Sie viele0.00
). Ausführensa
, um verschiedene Summen und Statistiken anzuzeigen. Zeigt insbesondere diesa -m
Gesamtsummen pro Benutzer an. Die Statistiken, die durchsa
Ausführen der letzten Rotation der Abrechnungsprotokolle (normalerweise in/var/log/account/
) gesammelt wurden .Beachten Sie, dass Sie nicht alle Prozesse durch Stichproben in Intervallen erfassen werden, bei weitem nicht. Sie werden fast alle kurzlebigen Prozesse und die letzten Sekunden langer Prozesse vermissen. In der Prozessabrechnung werden alle vergangenen Prozesse aufgelistet.
In
/proc/$pid/stat
ist die Benutzerzeit die Zeit, die für die Berechnung aufgewendet wird, im Gegensatz zur Systemzeit, die für die E / A aufgewendet wird. Welche zu zählen ist, hängt davon ab, was Sie mit den Informationen tun möchten.Das Zählen aller PIDs ist richtig. Ich weiß nicht, was die übergeordnete PID damit zu tun hat.
Auf der Systemseite
/proc/uptime
scheint Ihre Beschreibung von falsch zu sein. Wikipedia hat es richtig, während ich schreibe. Das erste Feld ist die Echtzeit, die seit dem Start des Systems vergangen ist, abzüglich der Zeit, die für das Anhalten oder den Ruhezustand aufgewendet wurde. Das zweite Feld ist die kumulierte Zeit, die in der Leerlaufaufgabe auf allen CPUs verbracht wurde. Ich bin mir nicht sicher, was das wirklich bedeutet. Es ist sicherlich nicht die gesamte Leerlaufzeit auf meiner Maschine. Im Kernel wird der Wert aus Variablen summiert, die inuptime_proc_show
aktualisiert wurdenaccount_idle_time
.quelle
sa
Warten auf den Prozess zu beenden , bevor es der CPU - Zeit berichten?