Benutzer- und Kernelzeit eines laufenden Prozesses abrufen?

7

Gibt es eine Möglichkeit, mithilfe von Standard-Linux / Unix-Tools zu bestimmen, wie viel ein Prozess im Benutzermodus ausgegeben hat und wie viel auf den Kernel gewartet wurde?

Mit anderen Worten, genau die Werte "user" und "sys", die Sie bei der Verwendung erhalten time, aber während der Prozesslaufzeit?

HINWEIS: Eine Möglichkeit besteht darin, WBEM zu verwenden und Linux_UnixProcess aufzulisten. Ich muss jedoch ein anderes Tool als dieses verwenden. Mein Ziel ist es zu überprüfen, was der WBEM-Anbieter mir sagt, dh ich muss ein anderes Tool verwenden.

Alois Mahdal
quelle
Sehen Sie times(2)und das timeseingebaute Ihrer Shell. Das timeSchlüsselwort einiger Shells zeigt an sich auch die Zeiten an.
Stéphane Chazelas
@StephaneChazelas leider muss ich die Zeiten pro Prozess lesen, während und diese Aufrufe kumulative Zeiten von der Shell und Kindern geben.
Alois Mahdal
Nein, timesgeben Sie sowohl die Zeit des Prozesses als auch die Zeit seiner (toten und warteten) Kinder an.
Stéphane Chazelas

Antworten:

13

Unter Linux sind die Informationen in den Feldern 14 bis 17 von verfügbar ( Details /proc/$pid/statsiehe proc (5) ):

Felder sind:

  • 14: Benutzerzeit (in Anzahl der Uhr-Ticks)
  • 15: sys Zeit
  • 16: Benutzerzeit von auf Kinder gewartet
  • 17: sys Zeit auf Kinder gewartet

(Alle Threads eines bestimmten Prozesses haben dort die gleichen Werte.)

Sie werden nicht direkt von gemeldet ps.

psmeldet 14 + 15 mit ps -o timeund 14 + 15 + 16 + 17mit ps --cumulative -o bsdtime.

/proc/$pid/statBeachten Sie, dass das zweite Feld in möglicherweise Leerzeichen oder Zeilenumbrüche enthält, sodass Sie es nicht mit awk's $1, $2... analysieren können.

Sie können perlwie folgt verwenden :

$ perl -MPOSIX -l -0777 -ne '@f = /\(.*\)|\S+/gs;
    printf "utime: %.2f\nstime: %.2f\ncutime: %.2f\ncstime: %.2f\n",
      map {$_/POSIX::sysconf( &POSIX::_SC_CLK_TCK )}@f[13..16]' "/proc/$pid/stat"
utime: 3.79
stime: 2.06
cutime: 56.49
cstime: 34.27

Ein Prozess kann seine eigenen Zeiten mit getrusage(RUSAGE_SELF)und abrufen getrusage(RUSAGE_CHILDREN).

Es gibt auch einen timesSystemaufruf, der dieselben Informationen abruft. POSIX-Shells haben dafür einen timeseingebauten. Einige Shells liefern diese Informationen auch mit time(ohne Argumente).

$ times
0m3.800s 0m2.060s
0m56.512s 0m34.276s

$ ps -o time -p "$$"
    TIME
00:00:05
$ ps --cumulative -o bsdtime -p "$$"
  TIME
  1:36
Stéphane Chazelas
quelle
Bash timesA) erlaubt mir nicht, separate Zeiten für jedes Kind zu sehen und B) scheint Zeiten nur von bereits gekündigten Kindern zu melden. Ich habe A gelöst, indem ich jedes Kind mit einem Bash-Skript umschlossen habe, das Kind aufruft und dann nur mal meldet, aber immer noch; Aufgrund von B besteht bestenfalls die notwendige Lücke: 1. Messung durch WBEM, 2. Tötung, 3. Bericht lesen.
Alois Mahdal
tWas ist mit dem Abrufen der Benutzer- / Systemzeiten für einen Thread? Das ist ein Problem, das ich derzeit lösen muss (ohne RUSAGE_THREAD - das Linux-spezifisch ist) an getrusage zu übergeben.
Alec Teal