私はアプリケーションのプロファイルを作成するために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
..の読み取りに多くの時間が費やされているようです。おそらく、私のプロセスは単純に大きすぎますか?このプロセスを記録するためにどうすればそれを取得できるかについての手がかりはありますか?
ありがとう!
私は似たようなことを経験しましたが、それほど深刻ではありません。
私の場合、おそらく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 record
はsleep
で指定した限り、2倍から4倍かかりますが、少なくとも機能しました。多分それはあなたにも役立つでしょう。