¿Hay alguna forma de determinar usando las herramientas estándar de Linux/Unix cuánto ha gastado un proceso en el modo Usuario y cuánto tiempo esperando el kernel?
En otras palabras, exactamente los valores de "usuario" y "sys" que obtienes cuando usas time
, pero durante tiempo de ejecución del proceso?
Respuesta aceptada:
En Linux, la información está disponible en los campos 14 a 17 de /proc/$pid/stat
(ver proc(5) para más detalles):
Los campos son:
- 14:tiempo de usuario (en número de tics de reloj)
- 15:hora del sistema
- 16:tiempo de usuario de niños esperados
- 17:tiempo del sistema de niños esperados
(todos los subprocesos de un proceso dado tienen los mismos valores allí)
No son reportados directamente por ps
.
ps
informa 14 + 15 con ps -o time
y 14 + 15 + 16 + 17
con ps --cumulative -o bsdtime
.
Tenga en cuenta que el segundo campo en /proc/$pid/stat
puede contener espacios o caracteres de nueva línea, por lo que no puede analizarlo con $1
de awk , $2
…
Puedes usar perl
como:
$ 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 proceso puede recuperar sus propios tiempos con getrusage(RUSAGE_SELF)
y getrusage(RUSAGE_CHILDREN)
.
También hay un times
llamada al sistema que recupera la misma información. Los shells POSIX tienen un times
incorporado para eso. Algunos shells también proporcionan esa información con time
(sin argumentos).
$ 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