私は私のアプリケーションをプロファイリングするためによくperfを使用します。私は最近、それぞれ約750GのRAMを備えたいくつかの新しいコンピュータを購入しました。私はこれらのうちの1つで約400Gのメモリを使用するプロセスをプロファイリングしたいと思います。これは、1つを除くすべての新しいコンピュータでうまく機能します。 Ubuntuを実行しながら、すべて同じ方法でインストールされます。
自分でperf
インストールしてコンパイルしてみました。apt-get
子供から。
実行時には./perf top -p 14182
時々結果が得られますが(長い間待ってから、ごくまれに)、ほとんどの場合、次のような結果が得られます。
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?
同じPID(!)について。
録音しようとしたときに同様の問題が発生しました。たとえば、次のようになります。
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
このコマンドは3秒以上かかり、Ctrl + Cは使用できず、終了する必要があります-9
。一部のデータをエクスポートしますが、表示しようperf.data
とするとfile has no samples
。
このマシンの他の(より小さな)プロセスでは、すべてがうまく実行され、前述のように、約200 Gの重量を持つプロセスの場合は、残りのマシンでもうまく動作します。他のコンピュータで以前のコマンドを実行すると、CPUもはるかに少なくなります(97%ではなく33%)。
私はどこを見るべきかわからず、Googleは私にとってあまり役に立ちませんでした。どんなアイデアや方向がありますか?
編集する
システムがどれだけ高いかを確認するためにこれを実行してstrace -c
得られた結果は次のとおりです。
処理重量が約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
この機械の処理重量は〜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
読むのに時間がかかると思います/proc/tid/maps|status
。このプロセスを記録するためにどのようにして得ることができるかについての手がかりはありますか?
ありがとうございます!
答え1
私も同様のことを経験しましたが、それほどひどくはありませんでした。
CONFIG_PERF_EVENTS
私の場合、約10%程度エラーが発生します。残りの時間はperf record
エラーなしで完了しますが、サンプルは記録されません(出力ファイルを見ると、perf report
「ファイルにサンプルがありません」と表示され、数が0であることをperf report -D ... | grep -c RECORD_SAMPLE
確認できます)。
のアドバイスに従ってください。このスタックオーバーフロー投稿、-e cpu-clock
にパラメータを追加しましたperf record
。これにより、CONFIG_PERF_EVENTSエラーは修正されず、perf record
仕様を通過するまで2x-4xがかかりましたが、少なくとも機能しsleep
ました。おそらくそれはあなたにも役立ちます。