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

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

根据我的检查,我工作的计算机上似乎启用了“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/perfGentoo 上的软件包在 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 工具

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

    $ mkdir -p perf
    

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

  3. 进入tools/perf内核源码目录

    $ cd linux-2.6.36-gentoo-r4/tools/perf
    
  4. 建造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.
    
  5. 谷歌搜索“对‘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)。

  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'
    
  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) ]
    

输出进行了一些编辑,将我的主目录替换为~.

相关内容