来自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等。

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

我在Fedora 19上,3.11.3-201.fc19.x86_64,Schrödinger's Cat,perf版本为3.10.9-200.fc19.x86_64。


好吧,看起来像这样的几个部分:

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

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

  • 看到:

  • 该补丁为Perf添加了libunwind支持
  • Debian bug 725075。
  • linux perf:如何解释和查找热点
  • 我在Fedora 18上,但同样的问题适用。 所以如果你正在分析你正在处理的代码(就像堆栈溢出一样),用-fno-omit-frame-pointer-ggdb重建。

    因为我想能够比较股票RPM,所以我重新建立了perf

  • 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之类的.perfunwind 。 注意它是%define not % 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 to produce new perf没有构建整个内核的RPM。 或者,如果你愿意,省略了--without你希望内核的味道,在这种情况下,你还需要建立头,debuginfo软等。

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

  • 请参阅关于构建定制内核的Fedora项目指南。

    我已经向Fedora报告了这个问题; 他们不应该使用NO_LIBUNWIND=1 。 见bug 1025603。

    一旦你有一个重建perf你可以使用perf record -g dwarf获得完整的堆栈。

    链接地址: http://www.djcxy.com/p/80033.html

    上一篇: space stack information from perf

    下一篇: ioctl vs netlink vs memmap to communicate between kernel space and user space