Как рассчитать и сгруппировать временные различия указанных системных вызовов при запуске strace
Я планирую провести некоторое тестирование веб-производительности (чтобы узнать, сколько времени уходит на каждый файл), но это может быть полезно для любого приложения.
Я точно знаю существование и как использовать различные приложения производительности, поэтому меня интересует только решение для strace.
По сути, я хотел бы рассчитать разницу во времени выполнения отфильтрованных системных вызовов, а затем сгруппировать их, отсортировать и получить сводку (аналогично опции -C).
Некоторые примеры использования:
$ 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)
Затем из приведенного выше вывода я хотел бы рассчитать разницу во времени между последними напечатанными вызовами (в человеческом формате):
Pseudo code:
echo "1344416788.294906 1344416788.294814" | awk '{print $2 - $1}'
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
1 ответ
Вы можете сделать это так:
$ 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,
Существует гораздо лучший инструмент, если вы хотите профилировать системные вызовы в Linux:
Кстати, $2 не содержит все аргументы системного вызова, вы увидите 0.073917 mmap(NULL,
в вашем выводе