12

短縮版:

Linux用の適切な時間ベースのサンプリングプロファイラーはありますか?

ロングバージョン:

私は通常、OProfileを使用してアプリケーションを最適化します。私は最近、疑問に思う欠点を見つけました。

問題はタイトなループであり、c++filtを生成してc++名をデマングルしました。別のボトルネックを追いかけているときに、偶然にコードに出くわしただけです。OProfileはコードについて異常なことを何も示さなかったので、私はそれをほとんど無視しましたが、私のコードセンスは、呼び出しを最適化して何が起こったかを確認するように指示しました。popenc++filtのをに変更しましたabi::__cxa_demangle。実行時間は1分以上から1秒強になりました。約x60スピードアップ。

popen呼び出しにフラグを立てるようにOProfileを構成する方法はありますか?プロファイルデータが存在するため、OProfileは、ボトルネックがヒープとstd::string呼び出しであると見なします(ところで、最適化すると、ランタイムが1秒未満に短縮され、2倍以上高速化されます)。

これが私のOProfile構成です。

$ sudo opcontrol --status
Daemon not running
Event 0: CPU_CLK_UNHALTED:90000:0:1:1
Separate options: library
vmlinux file: none
Image filter: /path/to/executable
Call-graph depth: 7
Buffer size: 65536

ボトルネックを見つけた可能性のあるLinux用の別のプロファイラーはありますか?

問題は、OProfileが現在実行中のプロセスにのみサンプルを記録することだと思います。プロファイリングしているプロセスに常にサンプルを記録してほしい。したがって、プロセスが現在切り替えられている場合(IOまたはpopen呼び出しでブロックされている場合)、OProfileはブロックされた呼び出しにサンプルを配置するだけです。

これを修正できない場合、OProfileは、実行可能ファイルがほぼ100%のCPUをプッシュしている場合にのみ役立ちます。非効率的なブロッキング呼び出しがある実行可能ファイルには役立ちません。

4

5 に答える 5

6

よろしくお願いします。OProfileは、プログラムが遅いときに実時間でスタックサンプルを取得し、個々のスタックサンプルを調べられない場合は、少なくとも次のように要約するという、私が正しいと考えることを実行できると思います。サンプルに表示されるコードの各行、その行が表示されるサンプルの割合。これは、その行がなかった場合に何が節約されるかを直接測定したものです。ここに1つの議論があります。 これがもう1つ、そしてもう1つです。そして、ポールが言ったように、ズームはそれをするべきです。

時間が60秒から1秒になった場合、これは、すべてのスタックサンプルが59/60の確率で問題を示していることを意味します。

于 2010-03-15T18:55:42.043 に答える
3

ズームを試してみてください-すべてのプロセスのプロファイルを作成できると思います-この場合、問題が浮き彫りになるかどうかを知ることは興味深いことです。

于 2010-03-15T18:57:16.870 に答える
2

私はずっと前にこれを書きましたが、それは私がこれ以上良いものを見つけることができなかったからです:https ://github.com/dicej/profile

試したことはありませんが、これも見つけました:https ://github.com/oliver/ptrace-sampler

于 2014-04-04T22:29:34.943 に答える
1

Linux用の簡単なサンプリングプロファイラーをすばやくハックアップしました:http://vi-server.org/vi/simple_sampling_profiler.html

backtrace(3)上のファイルに追加してからSIGUSR1、注釈付きのソースに変換します。

于 2010-10-22T02:24:03.303 に答える
1

ここで提案されているすべてのことを試した後(ドロップボックスから巨大なファイルとしてまだ利用できる現在は廃止されたZoomを除く)、Dunlavey氏が推奨することは何も行わないことがわかりました。上記のいくつかの回答に記載されている「クイックハック」は、私にとってはうまくいかなかったか、私にとってもうまくいきませんでした。一日中何かを試していました...そして、I/Oバウンドであった他の単純なテストプログラムのホットスポットとしてfseekを見つけることはできませんでした。

そこで、GDBに基づいて、今回はビルドの依存関係がない、さらに別のプロファイラーをコーディングしました。これにより、ほとんどすべてのデバッグ可能なコードで「正常に機能する」はずです。単一のCPPファイル。

https://github.com/jasonrohrer/wallClockProfiler

Dunlavey氏が提案した手動プロセスを自動化し、GDBを使用してターゲットプロセスを定期的に中断し、スタックトレースを収集して、最後に最も一般的なスタックトレースに関するレポートを出力します。それらはあなたの本当の壁掛け時計のホットスポットです。そしてそれは実際に機能します。

于 2019-01-22T06:17:50.020 に答える