ajd*_*574 7 linux perf-event strace dtrace
我正在尝试测量正在运行的进程的磁盘 IO 延迟以制作直方图。
我可以在提供它的操作系统中使用 DTrace 做到这一点(例如在这篇 Joyent 论文中),但我的应用程序在 Linux 中运行。我的第一个想法是尝试perf
,我可以得到计数器,但我找不到任何方法来获取时间增量。我可以使用strace
(例如strace -e read -T
)获取时间增量,但我不确定是否可以将跟踪限制为磁盘 IO(该系统也有一个繁忙的网络接口)。
有没有办法在 Linux 中做到这一点?
这实际上很复杂。但是有提示:
了解 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) 归档时间: |
|
查看次数: |
8058 次 |
最近记录: |