我在GNU / Linux 上的C中进行了一些i / o密集编程,我希望能够跟踪所有的i / o调用并了解应用程序花费的时间,等待用于每次通话的IO
使用gettimeoftheday到处都是DIY方法的公寓,是否有一些工具可以做到这一点?我希望能够区分彼此的呼叫。一个有用的输出:
sendto at myprog.c:42 : 30µs recvfrom at myprog.c:48 : 45µs ...
注意:我想要的是实时,而不是像分析师通常给出的cpu时间。
由于
答案 0 :(得分:3)
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>
时间是在行的末尾,以秒为单位。在上面的示例中,系统调用的时间为15到28微秒。
答案 1 :(得分:0)
有一把瑞士军刀,由于一些奇怪的原因,不是每个人都知道,也许是因为它太简单(也很难看)。在GDB和just pause it下运行几次,如10次。每次都要研究调用堆栈。
如果50%的时间在I / O中,50%+ / - 的样本将在I / O中显示,并且调用堆栈上的每行代码都将显示为什么它的链的一部分做I / O.对于睡眠或任何其他阻止呼叫也是如此。如果时间没有被阻止,就像你对一个巨大的阵列进行冒泡排序一样,它也会显示出来,以及为什么。如果它花费时间在一些你不知道(或关心)它是否被阻止的系统库中,那么同样的交易。
如果由于某些其他进程正在使用一些CPU时间而需要更长的时间,那并不重要,因为这并不会改变代码在百分比基础上花费时间的方式。你仍然会发现你正在做多少IO或睡眠或嘎吱嘎嘎,百分比以及确切原因。
如果你想要更漂亮的东西,虽然不是更有效,试试Zoom。