我目前正在试图追踪我测试的PostgreSQL版本中的一些幻像I/O。这是一个多进程服务器,将磁盘I/O与特定的后端和查询关联起来并不简单。从perf获取用户空间堆栈信息
我认为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
它会采取内核堆栈快照,但没有捕获用户空间的状态在内核捕获PERF事件。用户空间堆只上升到从用户空间入口点,像LWLockRelease
,LWLockAcquire
,memcpy
(mmap'd IO),__GI___libc_write
等
大二有小费吗?能够捕获用户空间堆栈的快照以响应内核事件将是理想的。
我在Fedora 19,3.11.3-201.fc19.x86_64,Schrödinger's Cat,perf版本为3.10.9-200.fc19.x86_64。
回到这个,另一种可能是使用frace/systemtap/uprobes/...来代替。 2014年linux.conf.au上的一次演讲表明,systemtap在这一点上可能更容易实现。 –