Estou planejando fazer alguns testes de desempenho da Web (para ver quanto tempo é gasto em cada arquivo), mas pode ser útil para qualquer aplicativo.
Eu sei exatamente a existência e como usar aplicativos de desempenho diferentes, então estou interessado apenas em solução para strace.
Basicamente eu gostaria de calcular as diferenças de execução de tempo dos meus syscalls filtrados e então agrupá-los, classificá-los e produzir o resumo (semelhante à opção -C).
Alguns exemplos de uso:
$ strace -ttt -s1500 -o/dev/stdout -e trace=open,access sleep 1 | awk '{print $1 " " $2}'
$ strace -ttt -s1500 -s/dev/stdout -e trace=access drush ev '' | awk '{print $1 " " $2}'
(some example output)
1344416787.291395 execve("/bin/sleep",
1344416787.291796 brk(0)
1344416787.291879 access("/etc/ld.so.nohwcap",
1344416787.291960 mmap(NULL,
1344416787.292026 access("/etc/ld.so.preload",
1344416787.292089 open("/etc/ld.so.cache",
...
1344416787.294428 nanosleep({1,
1344416788.294726 close(1)
1344416788.294814 close(2)
1344416788.294906 exit_group(0)
Então, a partir da saída acima eu gostaria de calcular a diferença de tempo entre as últimas chamadas impressas (em formato humano):
Pseudo code:
echo "1344416788.294906 1344416788.294814" | awk '{print $2 - $1}'
0.00101089
Dica: no strace, você pode usar diferentes formatos como -t, -tt ou -ttt (você pode usar qualquer um que seja mais fácil de analisar).
Em seguida, gere a lista como (usando, por exemplo, sort, uniq, etc, sem cabeçalhos):
seconds syscall
------ -----------
0.001580 close(2)
0.000132 close(1)
0.000032 exit_group(0)
0.000022 access("/etc/ld.so.preload",
0.000012 access("/etc/ld.so.cache",
Não o agrupe apenas pelo nome syscall, mas pela frase inteira ($ 2).
Isso deve ser o mais fácil possível.
Se houver algum one-liner, eu gostaria de ver isso.
Obrigado.
P.S. Se você acha que é inútil, ignore-o.
-
Tópicos relacionados (que podem ser úteis para algumas ideias):
Como extrair dois números de duas seqüências e calcular a diferença no Bash?
link
link
link