Existe algo como `time 'que também grava E / S e CPU?

18

Posso monitorar rapidamente o tempo de execução de um processo com time:

x@y ~ $ time foo

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

Existe uma maneira de obter os mesmos dados para o uso de E / S e CPU de um argumento, registrado em STDOUT? Um comando ou utilitário simples timeseria o ideal, onde apenas passo o argumento da coisa que quero executar:

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
fonte

Respostas:

25

Na página de manual de horas no seu sistema, algumas implementações têm opções de formato para incluir estatísticas de E / S, CPU e Memória (-f).

Por exemplo, o GNU time, com -vmostrará todas as informações disponíveis (aqui no 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

Em BSDs, use em -lvez disso.

Observe que este é o /usr/bin/timeprograma real , não a palavra-chave bashfornecida por alguns shells, que você invoca time pipeline.

MaQleod
fonte
4
zshA timepalavra-chave de também pode ser configurada (com $TIMEFMT) para fornecer essas informações.
Stéphane Chazelas 19/03/14
11
Isto é exatamente o que eu queria. Perfeito! Além disso, obrigado aos editores deste post que esclareceram que você precisará executá-lo, command time -v ...pois bashestá sendo seqüestrado time.
John Feminella
4

O comando stracepode ser útil, você pode limitar o rastreamento para contar apenas -cou um subconjunto de chamadas do 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.

Nesta resposta , eu o uso para contar o número de chamadas do sistema. Não sei se alguma coisa fornecerá uma análise resumida da taxa de transferência, mas o strace pode produzir os números para algo como awkresumir.

X Tian
fonte
stracepode atrasar significativamente as coisas, por isso é útil medir tempos relativos de chamadas de sistema diferentes, mas eu não usaria isso como um cronômetro de uso geral. perfé muito mais rápido / menos invasivo, se você jogar com opções de frequência de amostragem.
Marcin