C 跟踪io系统调用计时的工具

C 跟踪io系统调用计时的工具,c,performance,io,trace,C,Performance,Io,Trace,我在GNU/Linux上用C做了一些I/o密集型编程,我希望能够跟踪所有I/o调用,并了解应用程序睡眠、等待每次调用的IO的时间 从到处使用GetTimeOfDay的DIY方法来看,有什么工具可以做到这一点吗?我希望能够区分这些电话 可能有用的输出的Ex: sendto at myprog.c:42 : 30µs recvfrom at myprog.c:48 : 45µs ... 在myprog.c时发送至:42:30µs myprog.c时的recvfrom:48:45µs ...

我在GNU/Linux上用C做了一些I/o密集型编程,我希望能够跟踪所有I/o调用,并了解应用程序睡眠、等待每次调用的IO的时间

从到处使用GetTimeOfDay的DIY方法来看,有什么工具可以做到这一点吗?我希望能够区分这些电话

可能有用的输出的Ex:

sendto at myprog.c:42 : 30µs recvfrom at myprog.c:48 : 45µs ... 在myprog.c时发送至:42:30µs myprog.c时的recvfrom:48:45µs ... 注意:我想要的是实时,而不是像分析器一般提供的cpu时间


谢谢

使用
strace
命令可以选择
-T
,该选项可以满足您的需要。我检查了源代码,它调用
gettimeofday
(2)来获取时间,因此它报告的是挂钟时间,而不是CPU时间

我的计算机上的
strace-p 2956-T
输出示例:

stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0 <0.000028>
stat("/media/Klatch", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021>
stat("/media/Drum", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021>
close(18)                               = 0 <0.000019>
munmap(0x7fa088e60000, 4096)            = 0 <0.000022>
open("/etc/mtab", O_RDONLY)             = 18 <0.000024>
fstat(18, {st_mode=S_IFREG|0644, st_size=742, ...}) = 0 <0.000015>
stat(“/proc/sys/fs/binfmt_misc”,{st_mode=S_IFDIR | 0755,st_size=0,…})=0
stat(“/media/Klatch”,{st_mode=S_IFDIR | 0711,st_size=4096,…})=0
stat(“/media/Drum”,{st_mode=S|IFDIR | 0711,st_size=4096,…})=0
关闭(18)=0
munmap(0x7fa088e600004096)=0
打开(“/etc/mtab”,O_RDONLY)=18
fstat(18,{st_mode=S_IFREG | 0644,st_size=742,…})=0

时间在该行的末尾,以秒为单位。在上面的例子中,系统调用的时间是15到28微秒。

有一把瑞士军刀,出于某种奇怪的原因,不是每个人都知道,可能是因为它太简单(也很难看)。在GDB下运行几次,比如10次。每次,研究调用堆栈

如果50%的时间在I/O中,50%+/-的样本将在I/O中显示它,调用堆栈上的每一行代码都将显示为什么要执行I/O的部分链。对于睡眠或任何其他阻塞调用也是如此。如果时间没有被阻塞,比如你正在对一个巨大的数组进行气泡排序,它也会显示出来,以及为什么。如果它花时间在某个系统库中,而您却不知道(或不关心)它是否被阻止,则处理相同的问题

如果因为其他进程占用了一些CPU时间而花费了更长的时间,那也没关系,因为这并不会改变代码在百分比基础上花费时间的多少。你仍然会发现你在做多少IO或睡眠或咀嚼,百分比,以及确切的原因


如果你想要更漂亮的东西,尽管不是真的更有效,试试看。

什么操作系统?例如,MacOSX有“仪器”来做这类事情。有点离题,但只是以防万一,这在谷歌会成为一个很高的结果。要在
python
中实现这一点,您可以查看此工具,更深入地了解strace提供的计时选项。有绝对、相对和累积计时器模式。它们都有很好的用途。好吧,这很好,可惜它不能同时使用调试符号来指示调用来自源代码的哪一行。@Jocelyn:strace
-i
选项与
addr2line-fe
组合应该会解决这个问题。@ninja:rective。。。但是strace-我似乎给出了重新定位的运行时指针,这些指针在每次运行时都会发生变化,无法帮助添加与相对指针一起工作的r2line:-(@Jocelyn:then,启用ADDR\u NO\u随机化个性位(例如,通过
setarch-R
)应该会有帮助。@Jocelyn:你能得到对例程X的N次调用的计数吗?总时间乘以X处于活动状态的时间的分数,除以N,大致上是每次调用的平均时间。很笨拙,但就是这样。