如何在运行 strace 时计算并分组指定系统调用的时间差

如何在运行 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,在输出中看到

相关内容