C'è un modo per determinare utilizzando gli strumenti standard di Linux/Unix quanto è stato speso un processo in modalità Utente e quanto è stato atteso il kernel?
In altre parole, esattamente i valori "user" e "sys" che ottieni quando usi time
, ma durante tempo di esecuzione del processo?
NOTA: un modo è usare WBEM ed enumerare Linux_UnixProcess, ma devo usare altro strumento di questo; il mio obiettivo è verificare cosa mi dice il provider WBEM, ovvero devo usare uno strumento diverso.
Risposta accettata:
Su Linux, le informazioni sono disponibili nei campi da 14 a 17 di /proc/$pid/stat
(vedi proc(5) per i dettagli):
I campi sono:
- 14:tempo utente (in numero di tick dell'orologio)
- 15:ora di sistema
- 16:tempo utente di attesa per i bambini
- 17:sys tempo di attesa per i bambini
(tutti i thread di un determinato processo hanno gli stessi valori lì)
Non vengono segnalati direttamente da ps
.
ps
segnala 14 + 15 con ps -o time
e 14 + 15 + 16 + 17
con ps --cumulative -o bsdtime
.
Attenzione che il secondo campo in /proc/$pid/stat
può contenere spazi o caratteri di nuova riga, quindi non puoi analizzarlo con $1
di awk , $2
…
Puoi usare perl
come:
$ perl -MPOSIX -l -0777 -ne '@f = /(.*)|S+/gs;
printf "utime: %.2fnstime: %.2fncutime: %.2fncstime: %.2fn",
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
Un processo può recuperare i propri tempi con getrusage(RUSAGE_SELF)
e getrusage(RUSAGE_CHILDREN)
.
C'è anche un times
chiamata di sistema che recupera le stesse informazioni. Le shell POSIX hanno un times
costruito per quello. Alcune shell forniscono anche queste informazioni con time
(senza argomenti).
$ 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