如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但是朝着正确方向迈出的一步会很棒。
我倾向于 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。
如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但是朝着正确方向迈出的一步会很棒。
我倾向于 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。
以下是您可能拥有的几个选项,具体取决于您所使用的内核版本:
Systemtap - 这是检查 stap 附带的示例的理想方法,您可能已经准备好了一些东西,只需要做最少的修改。
Oprofile - 如果您使用的是旧版本的内核,与 oprofile 相比,stap 可以提供更好的精度。
带有堆栈跟踪器选项的debugfs - 适用于堆栈溢出调试。为此,您需要先打开深度检查功能mounting debugfs
,然后echo 1 > /proc/sys/kernel/stack_tracer_enabled
。
strace - 如果您正在查看识别用户空间程序正在调用的系统调用和一些性能数字。采用strace -fc <program name>
希望这可以帮助!
Ftrace 是一个不错的选择,并且有很好的文档。
使用WARN_ON()
它将打印一些称为该函数的跟踪。
对于时间跟踪,我认为您应该使用内核日志中显示的时间戳或使用jiffies
计数器
systemtap 在您的情况下也很有用。Systemtap 是一种工具,您可以在其中编写类似脚本语言的代码。它非常强大,但是如果您只想知道特定函数的执行时间 ftrace 会更好,但是如果您需要非常高级的工具来分析例如内核空间中的性能问题,它可能会很有帮助。
请阅读更多:(您想要做的是在这里:- 5.2 计时功能执行时间) 在此处输入链接描述
如果函数的执行时间很有趣,因为它对慢速/阻塞函数进行辅助调用,那么逐语句跟踪可以为您工作,而不会由于仪器本身的“探测效应”开销而造成太多失真。
probe kernel.statement("function_name@dir/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) }
将为您提供 function_name 中每个单独语句的跟踪。相邻语句之间的增量很容易用手或更大的脚本计算。另请参阅https://sourceware.org/systemtap/examples/#profiling/linetimes.stp
为了获得我需要的精度(CPU 周期),我最终使用get_cycles()
它本质上是 RDTSC 的包装器(但可移植)。ftrace() 将来可能仍然有用,但我现在所做的只是获取开始 CPU 周期和结束 CPU 周期之间的差异并将其用作基准。
更新:为了避免指令并行化,我实际上最终包装了 RDTSCP。我不能使用 RDTSC + CPUID,因为这会导致超级调用的大量延迟(我在 VM 中工作)。
使用 systemtap 并尝试此脚本: https ://github.com/openresty/stapxx#func-latency-distr