¿Hay algo como 'tiempo' que también registra E / S y CPU?

18

Puedo monitorear rápidamente el tiempo de ejecución de un proceso con time:

x@y ~ $ time foo

real        0m14.299s
user        0m4.770s
sys         0m0.440s

¿Hay alguna manera de obtener los mismos datos para el uso de E / S y CPU de un argumento, registrado en STDOUT? Un comando simple o una utilidad como timesería ideal, donde simplemente paso el argumento de lo que quiero ejecutar:

x@y ~ $ stats foo

wallclock runtime     0m14.299s
I/O reads             290,420 KB
I/O writes            239,429 KB
peak CPU usage        18.62%
mean CPU usage        1.44%
# etc.
John Feminella
fuente

Respuestas:

25

mire la página de manual de tiempo en su sistema, algunas implementaciones tienen opciones de formato para incluir E / S, CPU y estadísticas de memoria (-f).

Por ejemplo, GNU time, con -vmostrará toda la información disponible (aquí en Linux):

/usr/bin/time -v ls

Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 3664
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 273
Voluntary context switches: 2
Involuntary context switches: 2
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Encendido BSDs, use -len su lugar.

Tenga en cuenta que este es el /usr/bin/timeprograma real , no la palabra clave que proporcionan algunos shells con bashlos que invoca time pipeline.

MaQleod
fuente
44
zshLa timepalabra clave también se puede configurar (con $TIMEFMT) para proporcionar esa información.
Stéphane Chazelas
1
Esto es exactamente lo que quería. ¡Perfecto! Además, gracias a los editores de esta publicación que aclararon que necesitarán ejecutarlo command time -v ...ya que bashestá secuestrando time.
John Feminella
4

El comando stracepuede ser útil, puede limitar el seguimiento para que solo cuente -co un subconjunto de llamadas del sistema,

-e trace=set
      Trace  only  the  specified set of system calls.  The -c option is
      useful for determining which  system  calls  might  be  useful  to
      trace.   For  example,  trace=open,close,read,write  means to only
      trace those four system calls.  Be careful when making  inferences
      about  the  user/kernel  boundary if only a subset of system calls
      are being monitored.  The default is trace=all.

En esta respuesta , lo uso para contar la cantidad de llamadas al sistema. No sé si algo le dará un desglose resumido del rendimiento, sin embargo, strace puede producir las cifras para algo como awkresumir.

X Tian
fuente
stracepuede ralentizar las cosas significativamente, por lo que es útil medir tiempos relativos de diferentes llamadas al sistema, pero no lo usaría como un temporizador de propósito general. perfes mucho más rápido / menos intrusivo, si juegas con opciones de frecuencia de muestreo.
Marcin