我目前正在尝试在我正在测试的 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
它会拍摄快照kernel堆栈,但不捕获内核中捕获的性能事件的用户空间状态。用户空间堆栈仅从用户空间上升到入口点,例如LWLockRelease
, LWLockAcquire
, memcpy
(mmap'd IO),__GI___libc_write
, etc.
所以。有小费吗?能够捕捉快照用户空间堆栈响应kernel事件将是理想的。
我使用的是 Fedora 19、3.11.3-201.fc19.x86_64、Schrödinger’s Cat,性能版本为 3.10.9-200.fc19.x86_64。