C 如何对Linux内核中的特定函数进行基准测试或跟踪?

C 如何对Linux内核中的特定函数进行基准测试或跟踪?,c,linux-kernel,systemtap,ftrace,C,Linux Kernel,Systemtap,Ftrace,如何使用ftrace()(或其他任何东西)跟踪Linux内核中特定的、用户定义的函数?我正在尝试创建和运行一些微基准点,所以我希望有时间运行某些函数。我已经通读了(至少尽我所能)文档,但朝着正确的方向迈出一步将是非常棒的 我倾向于ftrace(),但在Ubuntu 14.04上使用时遇到了一些问题。ftrace是一个不错的选择,并且有一个。使用WARN\u on()它将打印一些调用该函数的跟踪 对于时间跟踪,我认为您应该使用内核日志中显示的时间戳,或者使用jiffies计数器systemtap在

如何使用ftrace()(或其他任何东西)跟踪Linux内核中特定的、用户定义的函数?我正在尝试创建和运行一些微基准点,所以我希望有时间运行某些函数。我已经通读了(至少尽我所能)文档,但朝着正确的方向迈出一步将是非常棒的


我倾向于ftrace(),但在Ubuntu 14.04上使用时遇到了一些问题。

ftrace是一个不错的选择,并且有一个。

使用
WARN\u on()
它将打印一些调用该函数的跟踪


对于时间跟踪,我认为您应该使用内核日志中显示的时间戳,或者使用
jiffies
计数器

systemtap在您的情况下也会很有用。Systemtap是一种工具,您可以使用它编写脚本语言之类的代码。它非常强大,但是如果您只想知道特定函数的执行时间,那么ftrace会更好,但是如果您需要非常高级的工具来分析内核空间中的性能问题,那么它可能非常有用

请阅读更多内容:(您想做的是:-5.2计时功能执行时间)

根据您所使用的内核版本,这里有几个选项:

Systemtap-这是检查stap附带的示例的理想方法,您可能已经准备好了一些东西,只需进行很少的修改即可

Oprofile-如果您使用的是旧版本的内核,stap比Oprofile提供更好的精度

debugfs带有堆栈跟踪选项-适用于堆栈溢出调试。为此,您需要通过
装载debugfs
然后
echo 1>/proc/sys/kernel/stack\u tracer\u enabled
来启用深度检查功能

strace-如果您正在识别用户空间程序调用的系统调用和一些性能编号。使用
strace-fc


希望这有帮助

如果函数的执行时间很有趣,因为它对慢/阻塞函数进行了辅助调用,那么逐语句跟踪就可以为您工作,而不会因为插装本身的“探测效应”开销而产生太多失真

probe kernel.statement("function_name@dir/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) }

将为您提供函数名称中每个单独语句的跟踪。相邻语句之间的增量很容易通过手工或更大的脚本计算。另请参见

为了获得所需的精度(CPU周期),我最终使用了
get_cycles()
,它本质上是RDTSC的包装器(但可移植)。ftrace()在将来可能仍然是有益的,但我现在所做的只是将开始CPU周期和结束CPU周期之间的差异作为基准


更新:为了避免指令的并行化,我实际上最终包装了RDTSCP。我无法使用RDTSC+CPUID,因为这会导致超级调用的大量延迟(我在虚拟机中工作)。

使用systemtap并尝试以下脚本: