【发布时间】:2012-08-01 15:19:49
【问题描述】:
我想提高大型应用程序中特定方法的性能。
目标是改善延迟(特定功能所花费的挂钟时间),而不是(必然)系统负载。
要求:
- 我预计很多延迟都是由 I/O 引起的,因此请考虑等待/阻塞所花费的时间(换句话说:查看挂钟时间而不是 CPU 时间)
- 因为程序比我试图优化的片段做得更多。需要有一种方法可以以编程方式启动/停止分析,或者过滤输出以仅显示进入和退出我正在优化的函数之间的时间。
- 方法级别的分析是可以接受的(如果可以在指令级别完成,那就更好了。如果只分析系统调用,那可能还不够)
- 这是一个爱好项目,所以昂贵的工具不是真正的选择
- 仪器(-finstrument-functions)是可以接受的
- 我感兴趣的关键代码段很难手动中断(因为它已经相对较快并且很难在循环中实际调用),因此需要某种自动化。
目前丢弃的工具:
- gprof、oprofile、callgrind(要求 1)
- 使用 getrusage 构建自定义内容(要求 1)
- poormansprofiler.org(要求 2)
- strace -T,dtrace,http://perf.wiki.kernel.org(要求 2 和 3)
- VTune、缩放(要求 4)
- 手动调用堆栈采样(要求 6)
- google-perftools(应该能够测量挂墙时间,但这在我的情况下似乎不起作用,大概是因为 SIGALRM 干扰。
- systemtap(我的内核未修补以包含 utrace)
我尚未进一步评估的其他选项:
- cprof(这里不是开箱即用的,似乎仅限 i386)
- 手动插入跟踪点(例如使用 lttng)
我很想听听:
- 其他选项
- 也许我太早放弃了一些工具?
- 我尚未评估的选项是否有机会发挥作用,如果有,如何做到最好。
我终于安顿下来了:
- 根据http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ 我自己使用 -finstrument-functions 构建一些自定义的东西
这个粗糙的工具产生的痕迹很难解释,我可以很容易地想象一些工具可以进一步处理它的输出,让它变得无限有用。但是,这对我来说已经完成了工作,所以我将这个项目推迟到以后;)。
【问题讨论】:
标签: linux performance profiling trace sampling