【发布时间】:2013-11-01 02:30:44
【问题描述】:
我目前正在尝试在我正在测试的 PostgreSQL 构建中追踪一些幻像 I/O。它是一个多进程服务器,将磁盘 I/O 关联回特定的后端和查询并不简单。
我认为 Linux 的 perf 工具非常适合这种情况,但我正在努力捕获块 I/O 性能计数器指标并将它们与用户空间活动相关联。
很容易记录块 I/O 请求和完成,例如:
sudo perf record -g -T -u postgres -e 'block:block_rq_*'
并且记录了用户空间 pid,但是没有捕获内核或用户空间堆栈,也没有能力快照用户空间进程堆的位(例如,查询文本)等。所以当你有 pid 时,你不知道那个过程当时在做什么。只需perf script 输出如下:
postgres 7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]
如果我将-g 标志添加到perf record,它将拍摄内核 堆栈的快照,但不会捕获内核中捕获的性能事件的用户空间状态。用户空间堆栈仅从用户空间上升到入口点,如LWLockRelease、LWLockAcquire、memcpy(mmap'd IO)、__GI___libc_write 等。
所以。有小费吗?能够捕获 user-space 堆栈的快照以响应 kernel 事件将是理想的选择。
我使用的是 Fedora 19,3.11.3-201.fc19.x86_64,薛定谔的猫,性能版本为 3.10.9-200.fc19.x86_64。
【问题讨论】:
-
回到这一点,另一种可能性可能是使用 frace / systemtap / uprobes / ... 代替。在 linux.conf.au 2014 上的一次演讲表明,此时 systemtap 可能更容易做到这一点。
标签: c linux linux-kernel perf