linux - Linux 中特定时间间隔的 CPU 事件的细粒度日志记录

标签 linux logging linux-kernel cpu-usage

有什么方法可以记录 CPU 事件,如“时间戳:实际事件”(如上下文切换等)?它应该类似于 syslog、sar 或 top,但具有更细粒度的时间值(以纳秒为单位)。

请告诉我是否有可以执行此操作的工具,否则我也准备好重新编译内核代码。

我已经阅读了相关的 SO question在这种情况下,讨论主要与线程相关,也检查了其他问题,但是没有得到任何线索..

谢谢。

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

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

现在,我寄希望于 systemtap。

最佳答案

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

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

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

使用 Systemtap,您可以对 Linux 内核中的函数进行基准测试。在分析正在运行的系统上的性能时,仅获得最小值/最大值/平均值/中值/标准偏差是不够的,因为您的平均值通常会过于嘈杂,例如你的写函数执行时间的平均值可以是 150 纳秒,stddev 是 100 纳秒,显然这并不能告诉你太多。因为一张图片胜过一千个字,一个好的开始是在您的驱动程序中识别一个或多个有趣的函数,对它们的执行时间进行采样,然后将样本集显示为直方图。

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

我不提供任何 sample 因为Systemtap has an excellent tutorial .

关于linux - Linux 中特定时间间隔的 CPU 事件的细粒度日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4990771/

相关文章:

php - APC 文件缓存不工作,但用户缓存正常

python - 记录到具有不同设置的两个文件

ios - 如何在 Xcode 管理器中访问设备日志(不是崩溃报告)

linux - 关于 linux 中进程的线程级别信息

linux - 什么时候执行脚本?

linux - Eclipse 在 elementaryOS 中崩溃

linux - get_user_pages() Linux 内核使用 virt_to_page()

linux - MS_INVALIDATE 的历史和当前使用

使用命令行进行 Linux OpenWRT 麦克风流式传输

c# - LogTrace 和 LogDebug 未出现在控制台或调试窗口中 - .NET 7.0 中的日志记录问题