C语言 测量从用户空间到内核空间的延迟的最佳方法是什么?



我必须测量用户空间程序与其交互的驱动程序之间的延迟。我基本上通过此应用程序发送数据包。延迟介于用户空间中的write与内核中相应的write函数之间

我在用户空间中使用了带有CLOCK_MONOTONICclock_gettimegetrawmonotonic内核(驱动程序(中,当我看到差异时,它是巨大的(大约 4 毫秒(。所以我肯定使用了错误的方法。

那么,最好的方法是什么?

要仅测量从用户空间到内核空间的单个上下文切换,请尝试使用 TSC(时间戳计数器(。它在 x86 和 ARM、用户和内核空间上可用。

维基百科上有关TSC的更多信息:https://en.wikipedia.org/wiki/Time_Stamp_Counter

x86 的 BSD 许可实现可以在这里找到 对于此处的 64 位 ARM。

此外,正如评论所建议的那样,请考虑使用任何可用的标准工具来测量往返延迟,即使用到内核和返回。

如果我这样做,我会使用 ftrace,这是 Linux 内核提供的性能工具。

它几乎可以跟踪内核中的所有函数。

它首先将信息记录到内存中的环形缓冲区中,因此它很少滑行。

linux内核源代码中有个非常好的文档"Documentation/trace/ftrace.txt",你也可以在这里找到。

1.prepare the environment, configure ftrace.
2.run the application.
3.0.In the application, bind cpu, and give the application priority。
3.1.In the application, write something to the trace_marker, 
3.2.In the application, call the function which you want to test.
4.get the log from the ring buffer.
5.calculate the latency.

最新更新