perfは非常に大きなプロセスでは動作しません。

perfは非常に大きなプロセスでは動作しません。

私は私のアプリケーションをプロファイリングするためによく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ました。おそらくそれはあなたにも役立ちます。

おすすめ記事