Ist die Summe aller PIDs "utime" die Gesamtsystem-utime?

8

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 utimealler 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:

Stefano Palazzo
quelle
/proc/cputimeIch 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.
Gilles 'SO - hör auf böse zu sein'
Ihre „Benutzerzeit“ müsste auch die Utime-Werte aller toten Prozesse hinzufügen. Wie berücksichtigen Sie diese?
Gilles 'SO - hör auf böse zu sein'
Mhh. Was ich "System-CPU-Zeit" nenne, ist lediglich der erste Wert aus / proc / uptime, "Systemsekunden". Ich hätte gedacht, dass dies zu hoch ist, da es auch Kernel-Threads zählt, aber wie Sie sehen können, ist die Summe aller "utime" -Werte immer noch höher als die Systemzeit von / proc / utime. Ihr Link erklärt, soweit ich das beurteilen kann, warum. Um ganz klar zu sein: Diese Zahl interessiert mich nicht wirklich. Ich interessiere mich für "CPU-Zeit pro Benutzer".
Stefano Palazzo
Zum zweiten Kommentar: Im Moment hatte ich vor, dies regelmäßig (etwa jede Sekunde) zu messen, um kurzlebige Prozesse zu ignorieren.
Stefano Palazzo
Ihre CPU-Zeitberechnung für das System lautet also ($ 1- $ 2 / $ number_of_cups), wobei $ 1 und $ 2 die Werte sind /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.
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

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 lastcommdiese 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 viele 0.00). Ausführen sa, um verschiedene Summen und Statistiken anzuzeigen. Zeigt insbesondere die sa -mGesamtsummen pro Benutzer an. Die Statistiken, die durch saAusfü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/statist 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/uptimescheint 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 .

Gilles 'SO - hör auf böse zu sein'
quelle
Was ist mit sehr langen Prozessen? Hat saWarten auf den Prozess zu beenden , bevor es der CPU - Zeit berichten?
Stefano Palazzo
@StefanoPalazzo Ja, Buchhaltungsdaten werden geschrieben, wenn ein Prozess stirbt. Das bedeutet auch, dass Sie meines Wissens keine Daten für Prozesse erhalten, die nach einem Systemabsturz ausgeführt wurden.
Gilles 'SO - hör auf böse zu sein'
Das ist ein Problem - es bedeutet, dass ich es nicht verwenden kann, da wir viele lang laufende Prozesse haben werden.
Stefano Palazzo