在Linux中以特定时间间隔对CPU活动进行细粒度记录

时间:2011-02-14 09:55:21

标签: linux logging linux-kernel cpu-usage

我有没有办法记录CPU活动,比如“时间戳:实际活动”(如上下文切换等)?它应该像syslog,sar或top,但是具有更细粒度的时间值(以纳秒为单位)。

如果有一个可以执行此操作的工具,请告诉我。我已准备好重新编译内核代码。

我在这个上下文中已经阅读了相关的SO question,其中讨论主要与线程相关并检查了其他问题,但是没有得到任何引导..

谢谢。

[编辑] :我正在寻找一个工具(API)/代码更改建议,它只能在内核级别工作,因为我的上下文与应用程序/用户空间无关。 / p>

[EDIT2] :简要背景:我修改了Linux / Android SDIO UART驱动程序,并对其进行了基准测试(指标:数据传输速度)。我所做的改变确实改善了性能,但它也提出了一些问题。从理论上讲,数据写入时间应该约为50ns,但我观察到它约为200ns。为了理解150ns的延迟/延迟,我想跟踪CPU的工作情况,以便得到一些提示/答案。

现在,我的希望是关于systemtap。

1 个答案:

答案 0 :(得分:2)

您无法轻松记录CPU活动,但您可以记录您的软件和内核活动。

Oprofile可以是一个记录堆栈跟踪的采样分析器。可以记录用户空间应用程序和内核的堆栈。

Systemtap是另一个工具(类似于大肆吹捧的DTrace),它允许检测应用程序和内核,并获得带有函数参数和时间戳的详细堆栈跟踪。

使用Systemtap可以对Linux内核中的函数进行基准测试。在分析正在运行的系统上的性能时,获取min / max / mean / median / stddev是不够的,因为你的平均值通常会太嘈杂,例如写函数执行时间的平均值可以是150nsec,stddev是100nsec,显然这并不能说明你的意思。因为一张图片胜过千言万语,一个好的开始就是在你的驱动程序中识别一个或多个有趣的函数,对它们的执行时间进行采样,然后将样本集显示为直方图。

这可以通过在函数入口处插入探针并返回来完成。函数入口探针将当前时间保存为进入时间。函数返回探针占用当前时间并减去输入时间以获得函数执行时间。将函数执行时间用作数组的下标/键(Systemtap数组实际上是哈希表)并递增与该键关联的样本计数。收集到足够的样本(可以计算它们)后,完成Systemtap会话。在会话退出时,将数组显示为直方图,Systemtap提供了一个执行此操作的函数。

我没有提供任何样本,因为Systemtap has an excellent tutorial