![如何检查 Linux 内核中是否启用了 perf 事件,以及如何以非 root 身份安装 perf 用户态?](https://linux22.com/image/2026/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%20Linux%20%E5%86%85%E6%A0%B8%E4%B8%AD%E6%98%AF%E5%90%A6%E5%90%AF%E7%94%A8%E4%BA%86%20perf%20%E4%BA%8B%E4%BB%B6%EF%BC%8C%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E4%BB%A5%E9%9D%9E%20root%20%E8%BA%AB%E4%BB%BD%E5%AE%89%E8%A3%85%20perf%20%E7%94%A8%E6%88%B7%E6%80%81%EF%BC%9F.png)
根据我的检查,我工作的计算机上似乎启用了“perf”子系统的内核端。
检查内核配置显示如下
$ zgrep "_PERF[_= ]" /proc/config.gz
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_EVENTS=y
# CONFIG_PERF_COUNTERS is not set
CONFIG_HAVE_PERF_EVENTS_NMI=y
我也做了中描述的检查perf_events 常见问题解答:
$ cat /proc/sys/kernel/perf_event_paranoid
1
但是perf
工具未安装:
$ perf
-bash: perf: command not found
$ /sbin/perf
-bash: /sbin/perf: No such file or directory
$ /usr/sbin/perf
-bash: /usr/sbin/perf: No such file or directory
是否可以作为普通用户将 perf userland 安装到自己的主目录(对于“2.6.36-gentoo-r4”内核)?
或者我需要请相关机器的管理员来安装它吗?更不幸的是,dev-util/perf
Gentoo 上的软件包在 amd64 上被屏蔽(阻止):
$ emerge --search perf
[...]
* dev-util/perf [ Masked ]
Latest version available: 2.6.35_rc4
Latest version installed: [ Not Installed ]
Size of files: 73,503 kB
Homepage: http://perf.wiki.kernel.org/
Description: Userland tools for Linux Performance Counters
License: GPL-2
答案1
如何perf
以非 root 身份安装 userland 工具
获取/查找 kernel-2.6.36-gentoo-r4 的源代码(在 Gentoo Linux 中)。第一张支票来自这个答案
实际上,第一的您应该查看
/usr/src/linux
内核源代码是否仍然安装。您可以将它们复制到可以写入的目录中。)就足够了,不过我没有复制整个内核源代码,而是将它们链接起来:
$ mkdir -p build $ cd build $ ln -s /usr/src/linux-2.6.36-gentoo-r4
创建要
perf
构建的目录,因为我无法在~/build/linux-2.6.36-gentoo-r4
目录中写入。$ mkdir -p perf
实际上这并不是我最初所做的...
make
一开始的错误信息完全没有帮助。进入
tools/perf
内核源码目录$ cd linux-2.6.36-gentoo-r4/tools/perf
建造
perf
,不要忘记将O=<destdir>
选项传递给 makefile因为该目录不可写(如果我复制而不是符号链接的内核源代码,就不会有这样的问题)。$ make O=~/build/perf -k Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev * new build flags or prefix CC ~/build/perf/perf.o CC ~/build/perf/builtin-annotate.o [...] CC ~/build/perf/util/scripting-engines/trace-event-python.o CC ~/build/perf/scripts/python/Perf-Trace-Util/Context.o AR ~/build/perf/libperf.a LINK ~/build/perf/perf ~/build/perf/libperf.a(trace-event-perl.o): In function `define_flag_value': ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-perl.c:127: undefined reference to `PL_stack_sp' ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-perl.c:131: undefined reference to `Perl_push_scope' [...] ~/build/perf/libperf.a(trace-event-python.o): In function `handler_call_die': ~/build/linux-2.6.36-gentoo-r4/tools/perf/util/scripting-engines/trace-event-python.c:53: undefined reference to `PyErr_Print' [...] collect2: ld returned 1 exit status make: *** [/home/narebski/build/perf/perf] Error 1 GEN perf-archive make: Target `all' not remade because of errors.
谷歌搜索“对‘Perl_push_scope’的未定义引用”。寻找在 slackware 13.1 上安装 perf 失败在 unix.stackexchange.com 上。请遵循以下建议自我回答,或者更进一步地说诊断:
$ make O=~/build/perf -k NO_LIBPERL=1 NO_LIBPYTHON=1 Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev * new build flags or prefix CC ~/build/perf/perf.o CC ~/build/perf/builtin-annotate.o [...] CC ~/build/perf/util/probe-finder.o AR ~/build/perf/libperf.a LINK ~/build/perf/perf GEN perf-archive
请注意,它是解决方法而不是解决方案(我有
libperl.so
)。检查默认安装目标的 Makefile:其
$(HOME)
.安装perf
在自己的主目录中:$ make O=~/build/perf -k NO_LIBPERL=1 NO_LIBPYTHON=1 install Makefile:565: newt not found, disables TUI support. Please install newt-devel or libnewt-dev GEN perf-archive install -d -m 755 '~/bin' install ~/build/perf/perf '~/bin' [...] install scripts/python/bin/* -t '~/libexec/perf-core/scripts/python/bin'
检查它
~/bin
是否在 PATH 中检查是否
perf
正常工作(不要忘记在可写目录中进行 cd):$ cd $ perf record -f -- sleep 10 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.001 MB perf.data (~61 samples) ]
输出进行了一些编辑,将我的主目录替换为~
.