Como calcular e agrupar as diferenças de tempo de syscalls especificadas ao executar strace

2

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

    
por kenorb 08.08.2012 / 11:53

1 resposta

2

Você pode fazer assim:

$ strace -ttt ls 2>&1 1>&2- | awk '{ if (NR < 2) {last_time=$1} else {sec[$2]+=($1-last_time)}} END {for (i in sec) printf("%f %s\n", sec[i], i)}'| sort -n
0.000874 access("/etc/ld.so.preload",
0.000944 open("/etc/ld.so.cache",
0.001242 open("/lib/x86_64-linux-gnu/libselinux.so.1",
0.001490 mprotect(0x7f0166a2b000,
0.001543 mmap(0x7f0166c2a000,

Existe uma ferramenta muito melhor se você quiser fazer o perfil de chamadas do sistema no Linux:

BTW, $ 2 não contém todos os argumentos de chamada do sistema, você verá 0.073917 mmap(NULL, em sua saída

    
por 16.08.2012 / 07:17