web-dev-qa-db-ja.com

LinuxでマルチスレッドC ++アプリケーションをプロファイルする方法は?

以前はすべてのLinuxプロファイリングを gprof で行っていました。

ただし、マルチスレッドアプリケーションでは、出力に一貫性がないように見えます。

今、私はこれを掘りました:

http://sam.zoy.org/writings/programming/gprof.html

しかし、それは昔からのもので、私のgprof出力では、私のgprofが非メインスレッドによって使用される関数をリストしているようです。

だから、私の質問は次のとおりです。

1)2010年に、gprofを使用してマルチスレッドLinux C++アプリケーションを簡単にプロファイルできますか? ( buntu 9.1 )2)プロファイリングのために検討すべき他のツールは何ですか?

43
anon

編集:貧しい人のプロファイラーに別の answer を追加しました。これは、IMHOがマルチスレッドアプリに適しています。

oprofile をご覧ください。このツールのプロファイリングオーバーヘッドはごくわずかであり、マルチスレッドアプリケーションをサポートします。ミューテックスの競合をプロファイリングしたくない限り(これはマルチスレッドアプリケーションのプロファイリングの非常に重要な部分です)

12

貧乏人のプロファイラー をご覧ください。驚いたことに、マルチスレッドアプリケーション用にCPUプロファイリングとミューテックス競合プロファイリングの両方を実行するツールはほとんどありません。

7

ズーム をご覧ください。

6
Paul R

Valgrindをご覧ください

6
stefanB

ポールRは、ズームを見てくださいと言いました。また、lsstackを使用することもできます。これはローテクなアプローチですが、驚くほど効果的です と比較してgprof .

追加:33msでOpenGLを実行していることを明確にしたので、私の以前の推奨事項は有効です。さらに、そのような状況で私が個人的に行ったことは、効果的で直感的ではありません。典型的なワークロードまたは問題のあるワークロードで実行し、トラックで手動で停止し、何をしているのか、その理由を確認するだけです。これを数回行います。さて、たまにしか誤動作する場合は、誤動作している間だけ停止したいでしょう。それは簡単なことではありませんが、適切な遅延のために目覚まし時計割り込みセットを使用しました。たとえば、100のうち1フ​​レームが33ミリ秒以上かかる場合、フレームの開始時にタイマーを35ミリ秒に設定し、フレームの終了時にオフにします。そうすれば、コードに時間がかかりすぎた場合にのみ割り込みが発生し、その理由がわかります。もちろん、1つのサンプルは有罪コードを見逃すかもしれませんが、20サンプルは見逃しません。

6
Mike Dunlavey

最新のLinuxプロファイリングツール、perf(perf_events)を試してください。 https://perf.wiki.kernel.org/index.php/Tutorial および http:// www.brendangregg.com/perf.html

perf record ./application
# generates profile file perf.data
perf report
3
osgx

問題にわずかに異なるひねりを加えると、ftraceとkernelsharkを使用してマルチスレッドアプリケーションで何が起こっているかについて、実際にかなり良いアイデアを得ることができます。適切なトレースを収集して適切なボタンを押すと、個々のスレッドのスケジューリングを確認できます。

ディストリビューションのカーネルによっては、適切な構成でカーネルを構築する必要があります(しかし、最近では多くのカーネルが構築されていると思います)。

0
bazza

非商用については言及しなかったので、IntelのVTuneをお勧めします。無料ではありませんが、詳細レベルは非常に印象的です(オーバーヘッドは無視できます)。

0
rustyx

pstackをランダムに実行して、特定のポイントでスタックを見つけることができます。例えば。 10または20回。最も典型的なスタックは、アプリケーションがほとんどの時間を費やす場所です(経験によれば、パレート分布を想定できます)。

その知識をstraceまたはtruss(Solaris)と組み合わせて、システムコールをトレースし、pmapをメモリ印刷用に使用できます。

アプリケーションが専用システムで実行されている場合、CPU、メモリ、I/Oなどを測定してシステム全体のプロファイルを作成するsarもあります。

valgrindgprofを試しました。それらのどれもがマルチスレッドアプリケーションでうまく機能しないことは非常に残念です。後で、Intel VTune Amplifierが見つかりました。良いことは、マルチスレッドを適切に処理し、ほとんどの主要言語で動作し、WindowsおよびLinuxで動作し、多くの優れたプロファイリング機能を備えていることです。さらに、アプリケーション自体は無料です。ただし、Intelプロセッサでのみ機能します。

0

Microprofile は、これに対する別の可能な答えです。手作業でコードを計測する必要がありますが、マルチスレッドコードをかなりうまく処理できるようです。また、グラフィックパイプラインのプロファイリング用の特別なフックもあります。これには、カード自体の内部で行われていることも含まれます。

0
Omnifarious