9

我有一个应用程序,我想分析在各种活动中花费了多少时间。由于这个应用程序是 I/O 密集型的,我想得到一份报告,总结每个库/系统调用所花费的时间(墙上时间)。

我尝试过 oprofile,但它似乎在 Unhalted CPU 周期方面提供了时间(那是 cputime,而不是实时)

我已经尝试过 strace -T,它提供了挂墙时间,但是生成的数据很大,并且很难获得摘要报告(并且为此存在 awk/py 脚本?)

现在我正在寻找 SystemTap,但我没有找到任何足够接近并且可以修改的脚本,并且现场教程也没有太大帮助。我不确定我正在寻找的东西是否可以完成。

我需要有人指出我正确的方向。非常感谢!

4

3 回答 3

5

这个 commit来看,最近发布的 strace 4.9支持这一点:

strace -w -c

他们称其为“系统调用延迟”(仅从联机帮助页很难看出这是什么-w)。

于 2014-10-04T17:37:58.470 回答
1

请参阅fntimes.stpsystemtap 示例脚本。https://sourceware.org/systemtap/examples/index.html#profiling/fntimes.stp

fntimes.stp 脚本监控给定函数族的执行时间历史(假定为非递归)。然后将每次(超出预热间隔)与历史最大值进行比较。如果超过某个阈值 (250%),则会打印一条消息。

# stap fntimes.stp 'kernel.function("sys_*")'

或者

# stap fntimes.stp 'process("/path/to/your/binary").function("*")'

该 .stp 脚本的最后一行演示了跟踪给定函数族所消耗时间的方法

probe $1.return { elapsed = gettimeofday_us()-@entry(gettimeofday_us()) }
于 2014-10-04T22:09:29.510 回答
1

您这样做是出于对测量的好奇,还是因为您想找到可以修复的时间消耗以使其运行得更快?

如果您的目标是让它尽可能快地运行,请尝试 random-pausing。它不测量任何东西,除了非常粗略。这可能违反直觉,但它所做的是查明将导致最大加速的代码。

于 2011-07-05T13:29:35.410 回答