2

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

Я точно знаю существование и как использовать различные приложения производительности, поэтому меня интересует только решение для 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 ответ1

2

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

$ 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, в вашем выводе

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .