Как рассчитать и сгруппировать временные различия указанных системных вызовов при запуске strace

1085
kenorb

Я планирую провести некоторое тестирование производительности сети (чтобы узнать, сколько времени уходит на каждый файл), но это может быть полезно для любого приложения.

Я точно знаю существование и как использовать различные приложения производительности, поэтому меня интересует только решение для strace.

По сути, я хотел бы рассчитать разницу во времени выполнения моих отфильтрованных системных вызовов, а затем сгруппировать их, отсортировать и произвести сводку (аналогично опции -C).

Некоторые примеры использования:

$ strace -ttt -s1500 -o/dev/stdout -e trace=open,access sleep 1 | awk '' $ strace -ttt -s1500 -s/dev/stdout -e trace=access drush ev '' | awk '' (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(' 0.00101089 

Подсказка: в strace вы можете использовать другой формат, например -t, -tt или -ttt (вы можете использовать любой, который легче анализировать).

Затем сгенерируйте список следующим образом (используя, например, sort, uniq и т. Д. Без заголовков):

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", 

Не группируйте его только по имени системного вызова, но по всей фразе ($ 2).

Это должно быть как можно проще. Если есть какие-то строки, я бы хотел это увидеть. Благодарю.

PS Если вы считаете, что это бессмысленно для вас, пожалуйста, игнорируйте это.

-

Связанные темы (которые могут быть полезны для некоторых идей):

Как извлечь два числа из двух строк и рассчитать разницу в Bash?

http://www.unix.com/shell-programming-scripting/121053-sum-value-selected-lines-script-awk-perl.html

http://unstableme.blogspot.ch/2009/12/sum-numbers-in-each-row-awk.html

http://www.unix.com/shell-programming-scripting/157047-awk-compare-previous-value-current.html

2

1 ответ на вопрос

2
Yasushi Shoji

Вы можете сделать это так:

$ strace -ttt ls 2>&1 1>&2- | awk '{ if (NR < 2) else } END '| 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, 

Существует гораздо лучший инструмент, если вы хотите профилировать системные вызовы в Linux:

Кстати, $ 2 не содержит все аргументы системного вызова, вы увидите 0.073917 mmap(NULL,в выходных данных