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!