从perf获取用户空间堆栈信息

时间:2013-11-01 02:30:44

标签: c linux linux-kernel perf

我正在尝试在我正在测试的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,它将获取内核堆栈的快照,但不捕获用于捕获的perf事件的用户空间状态内核。用户空间堆栈仅上升到用户空间的入口点,如LWLockReleaseLWLockAcquirememcpy(mmap'd IO),__GI___libc_write等。< / p>

因此。有小费吗?能够捕获用户空间堆栈的快照以响应内核事件将是理想的。

我使用Fedora 19,3.11.3-201.fc19.x86_64,Schrödinger的Cat,使用版本3.10.9-200.fc19.x86_64。

1 个答案:

答案 0 :(得分:15)

好的,看起来有几个部分:

  • 我在x86_64上,大多数发行版默认使用-fomit-frame-pointer构建,perf无法在没有帧指针的情况下跟踪堆栈;

  • ....除非它是使用libunwind支持构建的较新版本,在这种情况下它支持perf record -g dwarf

请参阅:

我在使用Fedora 18,但the same issue applies。因此,如果您正在分析您正在处理的代码(可能在Stack Overflow上),请使用-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

...我做过并测试过,如果使用libunwind构建,更新的perf实际上会捕获一个有用的堆栈。

您还可以构建新的rpm:

  • 编辑kernel.spec,取消注释行%define buildid ...,将buildid更改为.perfunwind之类的内容。请注意,%define不是% define

  • 在同一个spec文件中,找到:

    %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来获得完整的堆栈。