web-dev-qa-db-ja.com

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 FAQ で説明されているチェックも行いました:

$ cat /proc/sys/kernel/perf_event_paranoid
1

しかし、perf toolがインストールされていません:

$ 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

自分のホームディレクトリ( '2.6.36-gentoo-r4'カーネル用)に、perfユーザーランドを通常のユーザーとしてインストールできますか?

または、問題のマシンの管理者にインストールを依頼する必要がありますか?残念ながら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
6
Jakub Narębski

Root以外でperf userlandツールをインストールする方法

  1. kernel-2.6.36-gentoo-r4のソースを取得/検索 (Gentoo Linux)。 この答え からの最初のチェック

    実際、first_/usr/src/linux_を見て、カーネルソースがまだインストールされているかどうかを確認する必要があります。書き込み可能なディレクトリにコピーするだけです。)

    カーネルソース全体をコピーする代わりに、それらをリンクしただけで十分でした:

    _$ mkdir -p build
    $ cd build
    $ ln -s /usr/src/linux-2.6.36-gentoo-r4
    _
  2. _~/build/linux-2.6.36-gentoo-r4_ディレクトリに書き込むことができないので、perfが構築されるディレクトリを作成します。

    _$ 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」への未定義の参照」に対するGoogle。 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
    _

    これは解決策ではなく回避策であることに注意してください(_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) ]
    _

出力は少し編集されており、ホームディレクトリが_~_に置き換えられています。

9
Jakub Narębski