Cra*_*ger 11 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_*'
Run Code Online (Sandbox Code Playgroud)
并且记录了用户空间pid,但是没有捕获内核或用户空间堆栈,或者能够对用户空间进程堆的快照位(例如,查询文本)等进行快照.所以当你有pid时,你就不会我知道那个过程在那一点上做了什么.只是perf script输出,如:
postgres 7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0 () 208078848 + 1024 [postgres]
Run Code Online (Sandbox Code Playgroud)
如果我向其添加-g标志,perf record则会获取内核堆栈的快照,但不会捕获内核中捕获的perf事件的用户空间状态.用户空间堆只上升到从用户空间,如入口点LWLockRelease,LWLockAcquire,memcpy(mmap'd IO),__GI___libc_write等
所以.有小费吗?能够捕获用户空间堆栈的快照以响应内核事件将是理想的.
我在Fedora 19,3.11.3-201.fc19.x86_64,Schrödinger的Cat,使用perf版本3.10.9-200.fc19.x86_64.
Cra*_*ger 15
好的,看起来有几个部分:
我在x86_64上,大多数发行版-fomit-frame-pointer都是默认构建的,perf没有帧指针就无法跟随堆栈;
....除非它是一个libunwind支持的新版本,在这种情况下它支持perf record -g dwarf.
看到:
我在使用Fedora 18,但同样的问题也适用.因此,如果您正在分析您正在处理的代码(可能在Stack Overflow上),请使用-fno-omit-frame-pointer和重建-ggdb.
我进行了重建,perf因为我希望能够与库存RPM进行比较:
sudo yum build-dep perfsudo yum install yum-utils rpmdevtools libunwind-develyumdownloader --source perf或下载相应的kernel-.....src.rpmsrpmrpmdev-setuptreerpm -Uvh kernel-*.src.rpmcd $HOME/rpmbuild/SPECSrpmbuild -bp --target=$(uname -m) kernel.spec此时,您可以perf根据需要构建新的:
cd $HOME/rpmbuild/BUILD/kernel-*/linux-*/tools/perfmake...我做了并测试了更新perf确实捕获了一个有用的堆栈,如果使用libunwind构建的话.
您还可以构建一个新的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}
Run Code Online (Sandbox Code Playgroud)
并删除 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
有关构建自定义内核的信息,请参阅fedora项目指南.
我已经向Fedora报告了这个问题; 他们不应该使用NO_LIBUNWIND=1.请参阅错误1025603.
重建后,perf您可以使用perf record -g dwarf完整堆栈.