web-dev-qa-db-ja.com

perfは本当に大きなプロセスで動作しません

私はアプリケーションのプロファイルを作成するためにperfを頻繁に使用します。最近、〜750Gの新しいマシンをいくつか入手しましたRAMそれぞれ。それらの1つで約400GのRAMを使用するプロセスをプロファイルしようとしています。これは、1つを除くすべての新しいマシンで正常に動作します。それらはすべて同じ方法でインストールされ、ubuntuを実行していました。

apt-getを介してインストールされたperfの両方を試し、自分でコンパイルしました gitから

./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になります。

すべてがこのマシン上の他の(小さい)プロセスで問題なく機能し、前述したように、これは他のマシンで約200Gのプロセスの重みでうまく機能します。他のマシンで前のコマンドを実行すると、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 ..の読み取りに多くの時間が費やされているようです。おそらく、私のプロセスは単純に大きすぎますか?このプロセスを記録するためにどうすればそれを取得できるかについての手がかりはありますか?

ありがとう!

5
Shlomi

私は似たようなことを経験しましたが、それほど深刻ではありません。

私の場合、おそらく10%の確率でCONFIG_PERF_EVENTSエラーが発生します。残りの時間perf recordはエラーなしで完了しますが、サンプルの記録に失敗します(perf reportで出力ファイルを見ると、「ファイルにサンプルがない」と表示され、perf report -D ... | grep -c RECORD_SAMPLEゼロのカウントを確認します)。

このstackoverflow post のアドバイスに従って、-e cpu-clockパラメーターをperf recordに追加しました。これはCONFIG_PERF_EVENTSエラーを修正せず、perf recordsleepで指定した限り、2倍から4倍かかりますが、少なくとも機能しました。多分それはあなたにも役立つでしょう。

3
John Hart