Auf einem Mehrbenutzersystem möchte ich die CPU-Auslastung jedes Benutzers in Sekunden der CPU-Zeit messen. Für diese Messung gehe ich davon aus, dass dieser Benutzer die CPU-Zeit verursacht, wenn eine PID einem Benutzer gehört - das heißt, ich ignoriere Daemons und den Kernel.
Derzeit mache ich das alle fünf Sekunden:
- Rufen Sie jeden Benutzer und die PIDs ab, über die er ausgeführt wird
ps aux
- Für jede PID erhalten Sie
x
die Summe aus utime, cutime, stime und cstime von/proc/[pid]/stat
- berechnen
t = x / interval
(Intervall ist bei hoher Last nicht immer genau 5 Sekunden)
Wenn ich das starte, bekomme ich vernünftig aussehende Werte. Beispiel: Ein Benutzer auf diesem System drehte sich in python ( while True: pass
) und das System zeigte ungefähr 750 Millisekunden CPU-Zeit pro Sekunde an. Wenn das System ein bisschen hängen blieb, wurden 1600 ms für einen 1-Sekunden-Intervall gemeldet. Was ungefähr richtig erscheint, aber ich verstehe, dass diese Werte trügerisch sein können, zumal ich sie nicht wirklich verstehe.
Meine Frage lautet also:
Was ist eine faire und korrekte Methode, um die CPU-Auslastung auf Benutzerbasis zu messen?
Die Methode muss ziemlich genau sein. Es gibt möglicherweise viele Hunderte von Benutzern auf diesem System, daher ist das Extrahieren von Prozentsätzen ps aux
nicht genau genug, insbesondere für kurzlebige Threads, aus denen viele Softwareteile gerne erstellt werden.
Das mag kompliziert sein, aber ich weiß, dass es möglich ist. Dies war mein Ausgangspunkt:
Der Kernel verfolgt die Erstellungszeit eines Prozesses sowie die CPU-Zeit, die er während seiner Lebensdauer verbraucht. Bei jedem Takt aktualisiert der Kernel die Zeit in Sekundenschnelle, die der aktuelle Prozess im System- und im Benutzermodus verbracht hat. - (aus dem Linux-Dokumentationsprojekt )
Der Wert, nach dem ich mich befinde, ist die Anzahl der Sekunden (oder Zeitspannen), die ein Benutzer für die CPU aufgewendet hat, nicht ein Prozentsatz der Systemlast oder der CPU-Auslastung.
Es ist wichtig, dass wir die CPU-Zeit messen, während die Prozesse noch ausgeführt werden. Einige Prozesse dauern nur eine halbe Sekunde, andere mehrere Monate - und wir müssen beide Arten abfangen, damit wir die CPU-Zeit der Benutzer mit feiner Granularität abrechnen können.
top
können Batch-Modus tun? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
sollte die Last für {user} in diesem Moment anzeigen.