Perfを使用した分散アプリケーションのプロファイリング
私は、多くの開発者と同様に、既存のアプリケーションを使用して、基本的にスローコードを削除し、高速コードに置き換えることで、アプリケーションを高速化する必要がある状況にあります。コードの最適化に関しては、次の1つの簡単なルールに従う必要があります。
アプリケーションの速度を低下させていると思われるコードが何であれ、最後に確認する必要があります。
プロファイリングは、直感の限界にすばやく同意できるトレードです。コードのどの部分を最適化する必要があるかを知るために、冷たくて難しい測定が必要であることに早くから気づきました。幸いなことに、コードの実行方法に関連するほぼすべてのものを測定できるプロファイリングツールが多数あります。
ただし、ツールは必ずしもプロファイリングを容易にするわけではありません。測定値の解釈には注意が必要な場合があり、実験を行う際には変数を厳密に制御する必要があります。特に、マルチスレッドおよび分散アプリケーションのプロファイリングは困難です。
競合状態をデバッグしなければならなかったことのある人なら誰でも、マルチスレッドアプリケーションの動作がどれほど時間に敏感であるかを知っているでしょう。マルチスレッドアプリケーションのプロファイリングには、タイミングが測定の重要な要素になるため、同様の課題があります。
callgrindのようなプロファイラーはプログラムの速度を大幅に低下させるため、タイミングに影響を与えます。このようなプロファイラーの制限を示す例は、ミューテックスの競合です。ミューテックスが頻繁に使用されているため、アプリケーションの実行が遅くなり、コードがロック関数に多くの時間を費やす可能性があります。 callgrindのようなツールは、指示をカウントするため、これを明らかにしません。 、時間ではありません。
「統計プロファイリング」を行う別のクラスのプロファイラーがあります。これらのプロファイラーを使用すると、アプリケーションが時間を費やしている場所のスナップショットを定期的に取得しながら、通常どおりにプログラムを実行できます。これらのプロファイラーは、正確な結果を生成するためにしばらく実行する必要がありますが、タイミングへの影響を最小限に抑えて実行できます。そのため、マルチスレッドおよび/または分散アプリケーションのプロファイリングに最適です。
Linux perfツールを使用してプロファイリングワークフローを共有したかったのですが、パフォーマンスの「ホットスポット」をすばやく特定できるため、特に便利であることがわかりました。パフォーマンスを測定するためのターゲットとして、RTI Connext5.3.0のc / hello_dynamicの例を使用します。
まず、perfがLinuxマシンにインストールされていることを確認します。 Ubuntuでは、次のコマンドを実行して自分のマシンにperfをインストールする必要がありました:
sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic
次に、perfからの出力を、収集されたプロファイリングデータの視覚的表現である「FlameGraph」と呼ばれるものに変換できるGitHubプロジェクトをダウンロードする必要があります。このコマンドは、アクセスしやすい場所(ホームディレクトリなど)から実行します。
git clone https://github.com/brendangregg/FlameGraph
次に、rti_workspace / examples / cフォルダーにあるhello_dynamicの例に移動します。これらのコマンドを使用してコードをビルドします(NDDSHOMEがRTI Connextインストールに設定されていることを確認してください):
export DEBUG =1
make -f makefile_Hello_x64Linux3gcc4.8.2
makefileの名前のプラットフォームは、ご使用のプラットフォームとは異なる場合があります。 DEBUG環境変数の設定方法に注意してください。これは、バイナリにデバッグシンボルが含まれるようにするためです。これにより、perfが出力するコールスタック内の関数の名前を確認できます。
これで、コードでperfを実行できます。次のコマンドを実行します:
objs / x64Linux3gcc4.8.2 / Hello sub&
sudo perf record -g objs / x64Linux3gcc4.8.2 / Hello pub
しばらくしてから、control-Cを押してパブリッシャーを終了します。 Perfは「perf.out」というファイルを作成します。次に、FlameGraphリポジトリのスクリプトを使用して、このファイルをFlameGraphツールが理解できるものに変換する必要があります。
perfスクリプト-f | 〜/ FlameGraph / stackcollapse-perf.pl> out.perf-folded
ここから、FlameGraph画像を生成できます:
〜/ FlameGraph / flamegraph.pl out.perf-folded> perf.svg
Webブラウザでperf.svgファイルを開くと、次のようになります。
横軸は特定の関数で費やされた時間を表し、積み上げられたバーはアプリケーションの呼び出しスタックを表します。各バーをクリックして、その特定のスタックにズームインできます。
サブスクライバーなしで、パブリッシャーを再実行してみてください。サブスクライバーがいない場合、DDSはデータを送信しないため、フレームグラフの右側が消えることに気付くでしょう。
perfツールは、このブログで説明されている以上のことを実行できます。プロファイリング作業を容易にする他の設定やツールをご存知の場合は、お知らせください。
ハッピープロファイリング!
モノのインターネットテクノロジー
- モリブデンは他の元素と結合しますか?
- イーサリアムとグーグルでハイブリッドブロックチェーン/クラウドアプリケーションを構築する
- ReactNativeとAWSを使用したサーバーレスモバイルアプリケーションの構築
- シンプルな近接センサー回路とアプリケーションの操作
- アプリケーションを備えたアナログおよびデジタルセンサーの種類
- 別のプロトコルで構築したい4つのZigBeeアプリケーション
- マイクロチップ:COTSから耐放射線性のコアMCUを使用したスケールスペースアプリケーション
- シンプルでITボトルネックを排除:ローコードプラットフォームが鍵を握る
- OvoはVChargeスマートグリッド購入で分散型エネルギーゲームを強化します
- CNCウッドルーター-見事なアプリケーション
- 医学におけるAIの5つの実際のアプリケーション(例を含む)