【发布时间】:2014-12-02 18:09:03
【问题描述】:
如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但朝着正确方向迈出的一步会很棒。
我倾向于使用 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。
【问题讨论】:
标签: c linux-kernel systemtap ftrace
如何使用 ftrace()(或其他任何东西)来跟踪 Linux 内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能。我已经(至少尽可能多地)阅读了文档,但朝着正确方向迈出的一步会很棒。
我倾向于使用 ftrace(),但在 Ubuntu 14.04 上运行时遇到问题。
【问题讨论】:
标签: c linux-kernel systemtap ftrace
以下是您可能拥有的几个选项,具体取决于您所使用的内核版本:
Systemtap - 这是检查 stap 附带的示例的理想方式,您可能已经准备好了一些东西,只需要做最少的修改。
Oprofile - 如果您使用的是旧版本的内核,与 oprofile 相比,stap 的精度更高。
debugfs 带有堆栈跟踪器选项 - 适用于堆栈溢出调试。为此,您需要通过mounting debugfs 和echo 1 > /proc/sys/kernel/stack_tracer_enabled 打开深度检查功能。
strace - 如果您正在寻找识别用户空间程序正在调用的系统调用和一些性能数字。使用strace -fc <program name>
希望这会有所帮助!
【讨论】:
Ftrace 是一个不错的选择,它有一个good documentation。
【讨论】:
使用WARN_ON()它会打印一些调用那个函数的痕迹。
对于时间跟踪,我认为您应该使用内核日志中显示的时间戳或使用jiffies 计数器
【讨论】:
systemtap 在您的情况下也很有用。 Systemtap 是一种工具,您可以在其中编写类似脚本语言的代码。它非常强大,但是如果您只想知道特定函数 ftrace 的执行时间会更好,但是如果您需要非常高级的工具来分析例如内核空间中的性能问题,它可能会很有帮助。
请阅读更多:(您想要做的是在这里:- 5.2 计时函数执行时间) enter link description here
【讨论】:
如果函数的执行时间很有趣,因为它对慢速/阻塞函数进行辅助调用,那么逐语句跟踪可以为您工作,而不会由于仪器本身的“探测效应”开销而造成太多失真。
probe kernel.statement("function_name@dir/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) }
会给你一个函数名中每个单独语句的跟踪。相邻语句之间的增量很容易用手或更大的脚本计算。另见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
【讨论】: