1. ホーム
  2. c++

[解決済み] スタックサンプリングの先にあるもの。C++プロファイラ

2022-04-27 08:34:51

質問

ハッカー物語

日付は2010年12月02日。 クリスマス前の日々が垂れ流しになっていますが、Windowsプログラマーとしてかなり大きな壁にぶち当たっています。 AQTimeを使っていて、sleepy、shiny、very sleepyと試してきて、今現在、VTuneをインストールしているところです。 VS2008のプロファイラを使おうとしたが、正に懲り懲りであり、また、しばしば理解不能であった。 ランダムポーズのテクニックを使ってみた。 コールツリーを調べてみた。 関数トレースもやった。 しかし、悲しいかな、私が携わっているアプリは100万行を超えるコードで、さらに100万行相当のサードパーティアプリが含まれているという事実があります。

もっと良いツールが必要だ。 他のトピックを読みました。 各トピックで紹介されているプロファイラーをそれぞれ試してみた。 これらのジャンキーで高価なオプションや、ほとんど何の利益もないためにおろかな量の作業をするよりも、単純に何か良いものがあるはずです。 さらに問題を複雑にするのは、私たちのコードは大きくスレッド化されており、Qt のイベントループをいくつも走らせています。 なぜ複数のイベントループを実行しているのか、私に聞かないでください。 誰も教えてくれません。

Windows環境でValgrindに近い選択肢はないのでしょうか?

私がすでに試した、長い間の壊れたツールより良いものはありますか?

Qt と統合するように設計されたもので、おそらくキュー内のイベントを便利に表示するものはないでしょうか?

私が試したツールの全リスト。本当に便利だったものは斜体で表示。

  • AQTime むしろ良い! しかし、コールグラフはこのような場合にも正しく表示されるので、混乱を解消するために使用することができます。 完璧なツールではないが、試してみる価値はある。 あなたのニーズにも合うかもしれませんし、確かに私にとってはほとんどの場合、十分なものでした。
  • デバッグモードでのランダムポーズ攻撃。 情報量が十分でない。

    良いツールだが、完全な解決策ではない。
  • パラレルスタジオ 核の選択肢。 押し付けがましく、奇妙で、狂おしいほどパワフル。 30日間の評価を受け、自分に合うかどうかを判断するのがいいと思います。とにかくカッコいいんです。
  • AMD Codeanalystです。 素晴らしい、使いやすい、非常にクラッシュしやすいが、それは環境の問題だと思う。 無料なので、試してみることをお勧めします。
  • ルーク・スタックウォーカー 小規模なプロジェクトでは問題なく動作しますが、私たちのプロジェクトで動作させるのは少し大変です。 でも、いい結果も出ていますし、個人的な作業では間違いなくSleepyに取って代わりますね。
  • ピュリファイプラス Win-x64環境(特にWindows 7)に対応していない。 それ以外は素晴らしい。 他の部署の多くの同僚がこの製品を愛用しています。
  • VS2008 プロファイラー。関数トレースモードで、必要な解像度で100ギガ以上の出力が得られます。 逆に言えば、しっかりした結果が得られる。
  • GProf: GCCが必要です。
  • VTune。VTuneのW7サポートは犯罪的と言えるほどです。それ以外は優秀
  • PIN:自分でツールをハックする必要があるので、これは最後の手段みたいなものです。
  • SleepyVerySleepy: 小さいアプリでは便利だが、ここでは失敗。
  • EasyProfiler。インスツルメントする場所を示すために手動でコードを注入することを気にしないのであれば、悪くない。

  • ヴァルグラインド *nixのみですが、その環境にいるときはとてもよいです。
  • OProfile。Linuxのみ。
  • プロフィ:野生の馬を撃つんです。

試していないツールの提案。

  • XPerf
  • グローコード
  • デブパートナー

注意事項 現時点でのIntel環境。 VS2008、ブーストライブラリ。 Qt 4+。 そして、その中でも特に惨めなハムスター。Qt/MFCの統合はtrolltechで。


今すぐ 約2週間後、私の問題は解決されたようです。 リストにあるほぼすべてのツールと、私の個人的なトリックを含むさまざまなツールのおかげで、主要なボトルネックを見つけることができました。 しかし、私は、新しいプロファイラーや新しい技術をテストし、探求し、試し続けるつもりです。 なぜか? それは、君たちのおかげだからだ。君たちが素晴らしいからだ。 タイムラインは少し遅くなりますが、それでも新しいツールを試し続けることに、とても興奮しています。

あらすじ

他の多くの問題の中で、最近多くのコンポーネントが不正なスレッドモデルに切り替わり、私たちの下にあるコードが突然マルチスレッドでなくなったために深刻なハングアップを引き起こしたのです。 これ以上はNDAに違反するので言えませんが、何気ない点検や通常のコードレビューでも決して見つからなかったと言えます。 プロファイラ、コールグラフ、ランダムポーズを併用しなければ、私たちはまだ空の美しい青い弧に向かって怒りを叫び続けていたことでしょう。 ありがたいことに、私はこれまで出会った中で最高のハッカーたちと働いていますし、素晴らしいツールと素晴らしい人々でいっぱいの素晴らしい「バース」にアクセスすることができます。

皆さん、大変ありがとうございます。 しかし、これはSOでこれまで得られた答えよりも良い答えを得るための重要な質問だと思います。

その結果、これから3週間、毎週、私が出せる最大の懸賞金をかけ、最も素敵なツールで、かつ、一般常識ではないと思われる回答者に授与します。 3週間後には、プロファイラーたちの決定的なプロフィールが蓄積されていることを期待しているのだが、洒落はさておき。

テイクアウェイ

プロファイラーを使用する。 リッチー、カーニガン、ベントレー、クヌースには十分な性能を持っています。あなたが誰であろうと関係ありません。 プロファイラーを使うんだ 今持っているのがダメなら 他を探せ 見つからなければコードを書け。 コーディングできない、あるいはちょっとしたハングアップ、あるいは行き詰まったら、ランダムポーズを使え。 もしすべて失敗したら、大学院生を何人か雇ってプロファイラを作らせましょう。


長い目で見る

そこで、ちょっと回顧録を書いてみるのもいいかもしれません。 私がParallel Studiosを多用することにしたのは、実はPIN Toolの上に構築されていることも理由のひとつです。 研究者の方々と学術的なお付き合いをしていることもあり、これはある程度のクオリティがあることの証だろうと思ったのです。 ありがたいことに、その通りでした。 GUIはちょっとひどいですが、IPSは非常に便利だと思いました。 AQTや他の多くのプロファイラが提供している、行レベルのヒットカウントを取得する明白な方法がないことが致命的です。 また、AQTimeのサポートは非常に迅速で、楽しく使用することができました。 繰り返しになりますが、私の推薦を修飾する必要があります。 AQTimeの機能の多くはそれほどうまく機能しませんし、Win7x64ではクラッシュしやすいものもあります。 XPerfも立派に動作しましたが、ある種のアプリケーションで良好な結果を得るために必要なサンプリングの詳細については、苦痛を感じるほど遅いです。

今のところ、W7x64環境でC++コードをプロファイリングするための決定的なオプションはないと思いますが、単に有用なサービスを提供できないオプションがあることは確かです。

どのように解決する?

まず

タイムサンプリングプロファイラの方が、CPUサンプリングプロファイラより堅牢です。 私はWindowsの開発ツールに極めて疎いので、どれがどれとは言えません。 ほとんどのプロファイラがCPUサンプリングです。

CPUサンプリングプロファイラでは、N命令ごとにスタックトレースを取得します。

このテクニックは、CPUに依存しているコードの一部を明らかにします。 もしそれがアプリケーションのボトルネックになっているのであれば、これは素晴らしいことです。 アプリケーションのスレッドが、ほとんどの時間をミューテックスをめぐって争っている場合は、あまり良いことではありません。

タイムサンプリングプロファイラーは、Nマイクロ秒ごとにスタックトレースを取得します。

このテクニックは "遅い"。 コードです。 その原因がCPUバウンド、ブロックIOバウンド、ミューテックスバウンド、キャッシュスラッシュのコードのセクションであろうと、です。 要するに、アプリケーションの速度を低下させているコードがあれば、それが目立つようになるのです。

そのため、特にスレッドコードのプロファイリングでは、可能な限りタイムサンプリングプロファイラを使用してください。

2つ目

サンプリングプロファイラーは膨大なデータを生成します。 このデータは非常に有用なものですが、多すぎて使い勝手が悪いことがよくあります。 そこで役立つのが、プロファイルデータのビジュアライザーです。 私が見つけたプロファイルデータの可視化に最適なツールは次のとおりです。 gprof2dot . 名前に惑わされず、あらゆる種類のサンプリングプロファイラの出力(AQtime、Sleepy、XPerfなど)を扱うことができます。 可視化によって問題のある関数を指摘したら、生のプロファイルデータにジャンプして、本当の原因が何であるかについてより良いヒントを得ることができます。

gprof2dot ツールが生成するのは ドットグラフの説明 を入力し、それを グラフビズ というツールがあります。 出力は基本的にコールグラフで、アプリケーションに与える影響度によって関数が色分けされています。

gprof2dot がきれいな出力をするためのヒントをいくつか紹介します。

  • を使っています。 --skew を0.001で表示することで、ホットコードのパスを簡単に確認できるようにしました。 それ以外の場合は int main() グラフを支配しています。
  • C++のテンプレートで何かおかしなことをしているのなら、おそらく --strip . これは特にBoostで顕著です。
  • サンプリングデータの生成にOProfileを使用しています。 良い出力を得るためには、サードパーティとシステムライブラリからデバッグシンボルをロードするように設定する必要があります。 そうしないと、CRTがアプリケーションの20%の時間を消費していることがわかります。 malloc がヒープを破壊して15%を食いつぶしています。