Jak*_*ski 6 linux kernel gentoo software-installation perf-event
根据我的检查,我工作的计算机上似乎启用了“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
Run Code Online (Sandbox Code Playgroud)
我还做了perf_events FAQ 中描述的检查:
$ cat /proc/sys/kernel/perf_event_paranoid
1
Run Code Online (Sandbox Code Playgroud)
但是没有安装该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
Run Code Online (Sandbox Code Playgroud)
是否可以将 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)创建perf将要构建的目录,因为我将无法在~/build/linux-2.6.36-gentoo-r4目录中写入。
$ mkdir -p perf
Run Code Online (Sandbox Code Playgroud)
实际上这不是我一开始所做的......一开始的错误消息make完全没有帮助。
转到tools/perf内核源代码中的目录
$ cd linux-2.6.36-gentoo-r4/tools/perf
Run Code Online (Sandbox Code Playgroud)Build 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.
Run Code Online (Sandbox Code Playgroud)谷歌搜索“对‘Perl_push_scope’的未定义引用”。在 unix.stackexchange.com上发现无法在 slackware 13.1上安装 perf。按照自我回答中的建议,或者更准确地诊断:
$ 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
Run Code Online (Sandbox Code Playgroud)
请注意,它是解决方法而不是解决方案(我有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'
Run Code Online (Sandbox Code Playgroud)检查~/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) ]
Run Code Online (Sandbox Code Playgroud)输出有点编辑,将我的主目录替换为~.