内核模块分析器

时间:2015-03-30 06:25:54

标签: linux-kernel kernel profiler kernel-module

我想分析一些模块(例如网络子系统模块)。 我们可以在内核模块中分析函数的时间/ CPU利用率吗?

我听说过一些个人资料,例如:

是否有最适合我上述用例的探查器?

我真的很感谢你的时间,谢谢

2 个答案:

答案 0 :(得分:4)

你做对了! Perf是适合您的工具。由于您要分析内核模块,因此使用valgrind等任何用户态工具都没有意义

通常在监控软件时,您关心系统在每个系统中花费的时间,这可以通过perf top实现,这可以很好地估计系统在每个功能上花费的大部分时间。

您花费大量时间的功能可以成为优化的非常好的指针。

我不确定我理解您需要的时间/ CPU模型,但我认为以上内容可以满足您的需求。

您可以详细了解如何使用perf here

[编辑]
就像@myaut说的那样,还有其他的内核分析工具。虽然我对perf有很好的经验,但我不同意@myaut关于结果的质量,所以值得一提的是其他一些工具。如果您只是对完成工作感兴趣,那么perf会很好,但如果您想了解其他分析工具及其能力,我发现这个很好的参考here

(...如果我们帮助过你,请忘记亲切地将@myaut或我的答案标记为已接受......)

答案 1 :(得分:3)

我怀疑分析本身会揭示有用的结果 - 你需要经常调用这个函数或花费大量时间。否则,您将获得非常少量的数据,因为perf描述了所有模块。

如果您想在执行功能时测量实时支出,建议您查看SystemTap

stap -e 'global tms; 
    probe kernel.function("dev_queue_xmit") { 
        tms[cpu()] = local_clock_ns(); } 
    probe kernel.function("dev_queue_xmit").return { 
        println(local_clock_ns() - tms[cpu()]); }'

此函数在进入函数tms时将本地CPU时间(以纳秒为单位)保存到dev_queue_xmit()关联数组。当CPU离开dev_queue_xmit()时,第二个探测器计算delta。请注意,如果将在dev_queue_xmit()中切换CPU,则可能会显示混乱的结果。

要测量模块的时间,请将kernel.function("dev_queue_xmit")替换为module("NAME").function("*"),但附加到许多功能可能会影响性能。您也可以使用get_cycles()代替local_clock_ns()来获取CPU周期。