测量正在运行的进程的磁盘 IO 延迟

ajd*_*574 7 linux perf-event strace dtrace

我正在尝试测量正在运行的进程的磁盘 IO 延迟以制作直方图。

我可以在提供它的操作系统中使用 DTrace 做到这一点(例如在这篇 Joyent 论文中),但我的应用程序在 Linux 中运行。我的第一个想法是尝试perf,我可以得到计数器,但我找不到任何方法来获取时间增量。我可以使用strace(例如strace -e read -T)获取时间增量,但我不确定是否可以将跟踪限制为磁盘 IO(该系统也有一个繁忙的网络接口)。

有没有办法在 Linux 中做到这一点?

cat*_*sis 7

这实际上很复杂。但是有提示:

  • 了解 SystemTap,这是 DTrace 的 linux 模拟。我认为他们甚至可能有用于类似任务的示例脚本。

  • 学习blktrace。理论上,您可能能够解析其输出。这将比响应时间程序获得更多的设备延迟(服务时间)read()

是的strace可能不合适,因为它会跟踪所有内容(所有系统调用,即使您使用-e过滤器)并且会显着加载服务器和减慢进程。Perf是一个非常晦涩的工具,您可能有时认为自己理解了它的输出,但实际上并没有,而且它的功能集高度依赖于内核版本。基本上和目前perf适用于测量CPU 时间(周期),[但] 不适合测量响应时间(您实际需要)。我听说他们想实现一些东西来缓解这种情况,所以在最近的开发内核中可能会有一些东西。(perf script -l如果您要进一步调查,请查看 perf-scripts ( )。)

  • 也许你能从ftrace得到一些东西。阅读这篇文章http://lwn.net/Articles/370423/(这是介绍。)正如我所见,您可以通过pid和功能来限制 ftracing ,然后使用类似sys_read. 我试过这个作为你的例子:

    # mount -t debugfs debugfs /sys/kernel/debug # if it's not already mounted
    # cd /sys/kernel/debug/tracing
    # echo $$ > set_ftrace_pid  # pid of process to trace
    # echo sys_read sys_write > set_ftrace_filter
    # echo function_graph > current_tracer
    # head trace
    
    # tracer: function_graph
    #
    # CPU  DURATION                  FUNCTION CALLS
    # |     |   |                     |   |   |   |
     0)   8.235 us    |  sys_write();
     0)   3.393 us    |  sys_write();
     0) ! 459859.3 us |  sys_read();
     0)   6.289 us    |  sys_write();
     0)   8.773 us    |  sys_write();
     0) ! 1576469 us |  sys_read();
    
    Run Code Online (Sandbox Code Playgroud)