我目前正在試圖追蹤我測試的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在這一點上可能更容易實現。 –