Como verificar se os eventos perf estão habilitados no kernel do Linux, e como instalar o userland do perf como non-root?

5

Pelo que verifiquei, parece que o lado do kernel do subsistema 'perf' está ativado no computador em que trabalho.

A verificação da configuração do kernel mostra o seguinte

$ 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

Também fiz a verificação descrita na FAQ do perf_events :

$ cat /proc/sys/kernel/perf_event_paranoid
1

Mas a perf tool não está instalada:

$ 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

É possível instalar o userland do perf como usuário comum, no próprio diretório home (para o kernel '2.6.36-gentoo-r4')?

Ou preciso perguntar ao administrador da máquina em questão para instalá-lo? Mais infelizmente dev-util/perf package no Gentoo é mascarado (bloqueado) em 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
    
por Jakub Narębski 28.05.2011 / 08:50

1 resposta

9

Como instalar a ferramenta perf userland como não-raiz

  1. Obtenha / encontre fontes para o kernel-2.6.36-gentoo-r4 (no Gentoo Linux). A primeira verificação de esta resposta

    Actually, first you should look at /usr/src/linux and see if the kernel sources are still installed. You could just copy them to a directory you can write to.)

    foi o suficiente, mas em vez de copiar fontes inteiras do kernel eu apenas as vinculei:

    $ mkdir -p build
    $ cd build
    $ ln -s /usr/src/linux-2.6.36-gentoo-r4
    
  2. Crie um diretório onde perf seja criado, pois não poderei escrever no diretório ~/build/linux-2.6.36-gentoo-r4 .

    $ mkdir -p perf
    

    Na verdade, não foi o que eu fiz no início ... mensagens de erro de make foram totalmente inúteis no começo.

  3. Vá para o diretório tools/perf em fontes do kernel

    $ cd linux-2.6.36-gentoo-r4/tools/perf
    
  4. Compile perf , não esquecendo de passar a opção O=<destdir> para makefile pois o diretório não é gravável (não haveria nenhum problema se eu copiasse em vez de fontes de kernel ligadas por links simbólicos). p>

    $ 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. Google para "referência indefinida para 'Perl_push_scope'". Encontre Falha ao instalar o perf no slackware 13.1 em unix.stackexchange.com. Siga os conselhos em resposta automática ou, para saber mais, o diagnóstico :

    $ 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
    

    Observe que é solução alternativa em vez de uma solução (eu tenho libperl.so ).

  6. Marque Makefile para o destino de instalação padrão: its $(HOME) . Instale perf em seu próprio diretório pessoal:

    $ 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. Verifique se ~/bin está em PATH

  8. Verifique se perf funciona corretamente (não esqueça de criar um cd no diretório gravável):

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

A saída é um pouco redigida, substituindo meu diretório inicial por ~ .

    
por 22.06.2011 / 21:28