2013-11-01 28 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/ –