2013-11-01 64 views
11

我目前正在試圖追蹤我測試的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事件。用戶空間堆只上升到從用戶空間入口點,像LWLockReleaseLWLockAcquirememcpy(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。

+0

回到這個,另一種可能是使用frace/systemtap/uprobes/...來代替。 2014年linux.conf.au上的一次演講表明,systemtap在這一點上可能更容易實現。 –

回答

15

OK,貌似有幾個環節進行:

  • 我在x86_64,其中大多數發行版建立與在默認情況下,和perf不能按照無幀指針堆棧;

  • ....除非它是用libunwind支持構建的更新版本,在這種情況下它支持perf record -g dwarf

參見:

我在Fedora 18,但the same issue applies。因此,如果您正在分析您正在處理的代碼(可能是堆棧溢出),請使用-fno-omit-frame-pointer-ggdb重建。

我登陸了重建perf,因爲我想成爲能夠比較股票的RPM:

  • sudo yum build-dep perf
  • sudo yum install yum-utils rpmdevtools libunwind-devel
  • yumdownloader --source perf或下載相應的kernel-.....src.rpm SRPM
  • rpmdev-setuptree
  • rpm -Uvh kernel-*.src.rpm
  • cd $HOME/rpmbuild/SPECS
  • rpmbuild -bp --target=$(uname -m) kernel.spec

此時你可以建立一個新的perf,如果你想:

  • cd $HOME/rpmbuild/BUILD/kernel-*/linux-*/tools/perf
  • make

...我做到了並測試了更新後的perf實際上捕獲了一個有用的堆棧,如果使用libunwind構建可用。

您也可以建立一個新的RPM:

  • 編輯kernel.spec,取消對該行%define buildid ...,改變buildid喜歡的東西.perfunwind。注意它是%define而不是% define

  • 在同規格的文件,發現:

    %global perf_make \ 
    make %{?_smp_mflags} -C tools/perf -s V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix} 
    

    和刪除NO_LIBUNWIND=1

  • rpmbuild -bb --without up --without mp --without pae --without debug --without doc --without headers --without debuginfo --without bootwrapper --without with_vdso_install --with perf kernel.spec產生新perf的RPM沒有建立整個內核。或者,如果你願意,省略--without你希望內核的味道,在這種情況下,你還需要建立頭,debuginfo軟等

  • sudo rpm -Uvh $HOME/rpmbuild/RPMS/x86_64/perf-*.fc19.x86_64.rpm

the fedora project guide on building a custom kernel

我向Fedora報告過這個問題;他們不應該使用NO_LIBUNWIND=1。見bug 1025603

一旦你重建了perf,你可以使用perf record -g dwarf來獲得完整的堆棧。

+0

非常徹底和啓發! –

+1

@ErwinBrandstetter您可能會喜歡後續的博客文章:http://blog.2ndquadrant.com/tracing-postgresql-perf/ –