コードプロファイリングでアプリケーションのパフォーマンスを最適化する

Observability Margaret Ball

本番環境でアプリケーションパフォーマンスを監視したり問題をトラブルシューティングしたりするときは、コンテキストを知ることが重要です。入手した情報が多ければ多いほど、ユーザーに影響する問題をよりすばやく回避または検出できます。オブザーバビリティツールには、データのコンテキスト調査に役立つさまざまな機能が用意されています。その1つがコードプロファイリングです。このブログ記事では、コードプロファイリングの概要と使用例をご紹介します。

コードプロファイリング

サービスのパフォーマンスに問題が発生したときにコードプロファイリングを使用すれば、エンジニアはリソースのボトルネックをコードレベルで可視化してトラブルシューティングに役立てることができます。さらに、コードがCPUやメモリーの使用率に与える影響を継続的に測定して、サービスのパフォーマンス低下の原因になっていないかを確認できます。コードプロファイリングについて具体的に説明する前に、いくつかの用語の定義を示します。

コードプロファイリングによって本番環境からコールスタックが収集され、そのコールスタックの定期的なスナップショットがエージェントからコレクター経由でバックエンドのAPMに送られます。その後、APMソリューションによって、エンジニアが理解しやすいチャートやフレームグラフの形式でコードのパフォーマンスが可視化されます。

コードプロファイリングの実践

Splunk APMでは、AlwaysOn Profiling®ツールを介してコードプロファイリング機能を利用できます。2022年のAWS re:Inventで開催されたAWS GameDayでは、パフォーマンスに影響を与えているコードの問題をSplunk APMとAlwaysOn Profilingを使って特定、解決するというセッションが行われました。

GameDayの参加チームには、実行に時間のかかるコールが隠されたJava Webアプリケーションが渡されました。Splunk APMとSplunk AlwaysOn Profilingツールを設定してコードを調査することで、問題のあるファイルとその中のコード行を突き止めることができます。

セッションが始まると、チームはまずSplunk Observability Cloud UIに表示されるガイドに従ってSplunk APMをすばやくセットアップする必要があります。アプリケーションをOpenTelemetryでインストルメント(計装)してデータをSplunk APMに送信するように設定すると、数分以内にアプリケーションのメトリクス、サービスマップ、ビジネスワークフローが表示されます。

次に、トラブルシューティングの追加情報を得るために、アプリケーションを起動するコマンド行を少し変更してAlwaysOn Profilingを実装します。AlwaysOn Profilingが有効になると、Splunk APMでアプリケーションサービスのコールスタックが表示されます。

ここまでの準備ができたら、トラブルシューティングを開始して、アプリケーションのパフォーマンスに影響を与えている実行時間の長いコールを特定できます。AlwaysOn Profilingでは、コールスタック情報が表形式とフレームグラフ形式で表示されます。コールスタックを見れば、目的のサービスフロー内のコードで実行された個々のメソッドとコールの情報を確認できます。

コールスタック情報

左の表には、実行されたメソッドの名前、そのコールの実行にかかった時間、コールスタック内でのそのコールの実行回数が表示されます。この表から、「sleep」のコールに時間がかかっていることがすぐにわかります。「sleep」コールを選択して展開すると、あるトレースの実行時間が他のトレースよりも大幅に長いことがわかります。

sleepコールの詳細

最も時間がかかっている「sleep」コールを選択すると、このコールのスタックトレースが右側に表示されます。スタックトレースを見ると、このコールがDoorChecker.javaの36行目にある「precheck」メソッド内で実行されていることがわかります。ここまで問題を特定できたら、あとはアプリケーションのコードを変更して時間のかかっているコールを修正するだけです。

このように、Splunk APMを使ってAlwaysOn Profilingを有効にすることで、問題をすばやく調査、特定、解決できます。アプリケーションの問題はシステムのダウンタイムの問題ほど単純でないことがあります。しかも、パフォーマンスの低下は顧客満足度の低下につながります。APMとコードプロファイリングツールでパフォーマンスとコードレベルのインサイトが得られれば、問題をすばやく解決し、アプリケーションコードを最適化できます。

現在、AlwaysOn Profiling機能はJava、.NET、Node.jsアプリケーションに対応しており、他の言語も順次サポートされる予定です。Goとその他いくつかの言語ではプロファイリングがサポートされていませんが、自動インストルメンテーションが可能です。コードプロファイリングの便利さと問題解決の速さを実際に体験したい場合は、Splunk Observability Cloudの無料トライアル版をご利用ください。

このブログはこちらの英語ブログの翻訳、山村 悟史によるレビューです。

関連記事

LLMアプリケーションのオブザーバビリティ
オブザーバビリティ
5 分程度

LLMアプリケーションのオブザーバビリティ

LLMアプリケーションや企業にとって競争力を高めるために今や必須である一方、安全性、安定性の確保についてもこれまでのアプリと同様に重要です。この記事ではSplunkでどのような対応が可能かをお伝えします。
レジリエンスを強化する基盤としてのSplunk
オブザーバビリティ
5 分程度

レジリエンスを強化する基盤としてのSplunk

本記事では、不安定な昨今においていかにシステムの安定性を高めイノベーションを促進するかについて、レジリエンスの説明およびSplunkのアプローチをご説明します。
DevOpsのリリース管理の概念とベストプラクティス
オブザーバビリティ
5 分程度

DevOpsのリリース管理の概念とベストプラクティス

DevOpsのリリース管理におけるベストプラクティスを説明します。チームが迅速にデプロイできるスケジュールを自動化および維持し、信頼性の高いソフトウェアをよりスピーディにリリースするのに役立ちます。