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