如何检查 Linux 内核中是否启用了 perf 事件,以及如何以非 root 用户身份安装 perf 用户空间?

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)

Jak*_*ski 9

如何以perf非 root 用户身份安装userland 工具

  1. 获取/查找 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)
  2. 创建perf将要构建的目录,因为我将无法在~/build/linux-2.6.36-gentoo-r4目录中写入。

    $ mkdir -p perf
    
    Run Code Online (Sandbox Code Playgroud)

    实际上这不是我一开始所做的......一开始的错误消息make完全没有帮助。

  3. 转到tools/perf内核源代码中的目录

    $ cd linux-2.6.36-gentoo-r4/tools/perf
    
    Run Code Online (Sandbox Code Playgroud)
  4. 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)
  5. 谷歌搜索“对‘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)。

  6. 检查 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)
  7. 检查~/bin是否在 PATH 中

  8. 检查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)

输出有点编辑,将我的主目录替换为~.