perf falha ao trabalhar em processos realmente grandes

3

Eu uso o perf com bastante frequência para criar perfis de meus aplicativos. Recentemente consegui algumas máquinas novas com ~ 750G de RAM cada. Eu estou tentando o perfil de um processo que usa cerca de 400G de RAM em um deles. Isso funciona bem em todas as novas máquinas, exceto uma. Eles foram todos instalados da mesma maneira, executando o Ubuntu.

Eu tentei os dois perf como instalados através de apt-get e compilei meu próprio do git .

Ao executar ./perf top -p 14182 , algum tempo consigo obter resultados (depois de uma longa espera e muito raramente), mas na maioria das vezes estou recebendo:

The sys_perf_event_open() syscall returned with 3 (No such process) for event (cycles:pp).
/bin/dmesg may provide additional information.
No CONFIG_PERF_EVENTS=y kernel support configured?

Para o mesmo pid (!).

Eu recebo problemas semelhantes ao tentar gravar, por exemplo:

time ./perf record -F 111 -a -g -p 14182 -- sleep 3
Warning:
PID/TID switch overriding SYSTEMsleep: Terminated

Command exited with non-zero status 255
2.66user 91.58system 1:36.68elapsed 97%CPU (0avgtext+0avgdata 4896maxresident)k 
0inputs+5248outputs (0major+4847minor)pagefaults 0swaps

Este comando demora mais de 3 segundos, eu não posso ctrl + c, e matá-lo requer -9 . Ele emite alguns dados em perf.data , mas quando tento visualizá-los, recebo file has no samples .

Tudo funciona muito bem em outros processos (menores) nesta máquina, e como mencionei anteriormente, isso funciona muito bem no resto das máquinas, para processos que pesam cerca de 200G. Quando eu executo o comando anterior nas outras máquinas, ele também usa muito menos cpu (33% em vez de 97%).

Não sei onde mais procurar e o Google não tem sido muito útil para mim. Alguma idéia ou direção?

Editar

Vendo como o sistema estava alto, eu corri isso com strace -c , é isso que eu recebo:

Outras máquinas com um peso de processo de ~ 200G:

_ strace  -c perf record -F 111 -a -g -p 27879 -- sleep 3 

Warning:
PID/TID switch overriding SYSTEM[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.684 MB perf.data (~29876 samples) ]
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 91.43    2.548664         109     23481           read
  2.47    0.068712          11      6457        15 stat
  2.42    0.067392           9      7303           write
  0.68    0.018960          12      1646           getdents
  0.68    0.018841          22       847         1 mmap

Esta máquina com um peso de processo de ~ 400G:

_ strace -c perf record -F 111 -a -g -p 14182 -- sleep 3                                                                                                                                                                                           /tmpvaknins9@snlp-brevis-3
Warning:
PID/TID switch overriding SYSTEMsleep: Terminated
sleep: Terminated
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 99.70  131.243199         472    278178           read
  0.16    0.207757           8     25895           write
  0.04    0.048962           8      6398         5 stat
  0.02    0.031247          14      2217           mmap
  0.02    0.026385           9      3091           close

Parece que muito tempo está sendo gasto na leitura de /proc/tid/maps|status . Talvez o meu processo seja simplesmente muito grande? Alguma pista de como eu ainda conseguiria gravar esse processo?

Obrigado!

    
por Shlomi 10.08.2016 / 02:13

1 resposta

3

Eu experimentei algo semelhante, mas menos grave.

No meu caso, eu recebo o erro CONFIG_PERF_EVENTS talvez 10% do tempo. O restante do tempo perf record seria concluído sem erro, mas falharia ao registrar quaisquer amostras (olhando para o arquivo de saída com perf report declararia "arquivo não tem amostras" e perf report -D ... | grep -c RECORD_SAMPLE confirmaria uma contagem de zero ).

Seguindo os conselhos em esta postagem do stackoverflow , adicionei o -e cpu-clock parâmetro para perf record . Isso não corrigiu o erro CONFIG_PERF_EVENTS, e perf record ainda tomaria 2x-4x enquanto eu especificasse via sleep - mas pelo menos funcionava. Talvez te ajude também.

    
por 14.03.2017 / 00:56