我一直在使用oprofile尝试发现为什么我的程序在内核上花费了这么多时间。现在,我有了内核中的符号,但是显然程序与内核之间没有任何链接可以告诉我程序的哪些位花费了这么长时间。
samples % image name app name symbol name
-------------------------------------------------------------------------------
201 0.8911 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock_irq
746 3.3073 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic rb_get_reader_page
5000 22.1671 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic default_spin_lock_flags
16575 73.4838 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock
22469 11.1862 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock
22469 99.6010 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock [self]
26 0.1153 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic ret_from_intr
我从这里去哪里?如何发现程序中导致__ticket_spin_lock的位置?
最佳答案
Oprofile提取堆栈样本。您需要做的不是查看摘要,而是实际检查原始样本。例如,如果您花费30%的时间在内核中,那么如果您看到随机选择的10个堆栈样本,则可以期望其中3个或多或少地向您展示如何进入内核。核心。
That way you will see things摘要或调用图不会显示。
情况尚不清楚:由于__ticket_spin_lock
处于堆栈的时间为99.6%,因此在您查看的每个堆栈样本中,概率为99.6%,您将看到如何进入该例程。
然后,如果您真的不需要这样做,则可能有250倍的加速比。
从四分钟缩短到一秒。拧“正确”或“自动”方法-获得结果。
添加:关于探查器的事情是它们很流行,并且有些具有非常好的用户界面,
但是,可悲的是,恐怕是“皇帝的新装”。
如果找不到这样的工具,您会喜欢它的,因为它说(可能是错误的)编写的代码接近最佳。
有很多推荐使用此概要分析器的信息,但是
我无法指出使用剖析器节省超过百分之几的时间(例如40%)的说法。
也许有一些。
我从未听说过先使用分析器来获得加速,然后再使用它来获得第二次加速,依此类推。
这就是您真正获得加速的方式-多种优化。
在开始时只是一个很小的性能问题的东西在您删除了一个较大的问题之后不再是小的问题。
该图显示了如何通过消除六个问题来将速度提高近三个数量级。
您不一定必须这样做,但是值得尝试吗?
致词作进一步编辑。我只是想展示一个简单的方法来欺骗调用图。
红线代表调用堆栈样本。在此,A1将所有时间都花在 call C2上,反之亦然。然后,假设您保持相同的行为,但是您放入了"dispatch"例程B。
现在,调用图丢失了A1将所有时间都花在C2上的信息,反之亦然。
您可以轻松地将此示例扩展到多个级别。
您可以说 call 树会看到这一点。
好吧,这是您如何欺骗 call 树的方法。 A将所有时间都花在对C的调用上。
现在,如果相反,A调用了B1,B2,... Bn,而那些调用了C,则从A到C的“热路径”被分解成几部分,因此A和C之间的关系被隐藏了。
还有许多其他的非常普通的编程习惯会混淆这些工具,尤其是当样本深度为10-30级并且功能很少时,但是对于仔细检查大量样本的程序员而言,它们之间的关系是无法隐藏的。
关于linux - Oprofile Callgraph : origin of syscalls,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15766674/