内核模块分析器
Kernel module profilers
我想分析一些模块(例如网络子系统模块)。
我们可以分析内核模块中函数的时间/cpu 利用率吗?
我听说过一些分析器,例如:
是否有最适合我上述用例的分析器?
非常感谢您抽出时间,谢谢
你没看错! Perf 是适合您的工具。由于您要分析内核模块,因此没有必要使用任何用户空间工具,例如 valgrind
通常在监控软件时,您关心的是您的系统在每个系统上花费了多少时间,这可以通过 perf top
来实现,这将让您很好地估计您的系统在每个系统上花费的时间功能。
您花费大量时间的函数可能是非常好的优化指南。
我不确定我是否理解你需要的时间/cpu模型,但我认为以上应该能满足你的需求。
您可以阅读更多关于如何使用 perf here。
[编辑]
正如@myaut 所说,还有其他内核分析工具。虽然我在 perf 方面有很好的经验并且我不同意@myaut 关于结果质量的看法,但值得一提的是其他一些工具。如果您只是对完成工作感兴趣,perf 就可以了,但如果您想了解其他分析工具及其功能,我发现了这个不错的参考 here
(...如果我们帮助了您,请不要忘记将@myaut 或我的回答标记为已接受...)
我怀疑分析本身是否会揭示有用的结果——您需要使此函数经常被调用或在其中花费大量时间。否则你会得到非常少量的数据,因为 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()]); }'
此脚本将本地 CPU 时间(以纳秒为单位)保存到函数 dev_queue_xmit()
入口处的 tms
关联数组中。当 CPU 离开 dev_queue_xmit()
时,第二个探测器计算增量。请注意,如果 CPU 将在 dev_queue_xmit()
中切换,它可能会显示混乱的结果。
要测量模块的时间,请将 kernel.function("dev_queue_xmit")
替换为 module("NAME").function("*")
,但附加到许多函数可能会影响性能。您也可以使用 get_cycles()
而不是 local_clock_ns()
来获得 CPU 周期。
我想分析一些模块(例如网络子系统模块)。 我们可以分析内核模块中函数的时间/cpu 利用率吗?
我听说过一些分析器,例如:
是否有最适合我上述用例的分析器?
非常感谢您抽出时间,谢谢
你没看错! Perf 是适合您的工具。由于您要分析内核模块,因此没有必要使用任何用户空间工具,例如 valgrind
通常在监控软件时,您关心的是您的系统在每个系统上花费了多少时间,这可以通过 perf top
来实现,这将让您很好地估计您的系统在每个系统上花费的时间功能。
您花费大量时间的函数可能是非常好的优化指南。
我不确定我是否理解你需要的时间/cpu模型,但我认为以上应该能满足你的需求。
您可以阅读更多关于如何使用 perf here。
[编辑]
正如@myaut 所说,还有其他内核分析工具。虽然我在 perf 方面有很好的经验并且我不同意@myaut 关于结果质量的看法,但值得一提的是其他一些工具。如果您只是对完成工作感兴趣,perf 就可以了,但如果您想了解其他分析工具及其功能,我发现了这个不错的参考 here
(...如果我们帮助了您,请不要忘记将@myaut 或我的回答标记为已接受...)
我怀疑分析本身是否会揭示有用的结果——您需要使此函数经常被调用或在其中花费大量时间。否则你会得到非常少量的数据,因为 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()]); }'
此脚本将本地 CPU 时间(以纳秒为单位)保存到函数 dev_queue_xmit()
入口处的 tms
关联数组中。当 CPU 离开 dev_queue_xmit()
时,第二个探测器计算增量。请注意,如果 CPU 将在 dev_queue_xmit()
中切换,它可能会显示混乱的结果。
要测量模块的时间,请将 kernel.function("dev_queue_xmit")
替换为 module("NAME").function("*")
,但附加到许多函数可能会影响性能。您也可以使用 get_cycles()
而不是 local_clock_ns()
来获得 CPU 周期。