本番環境でアプリケーションパフォーマンスを監視したり問題をトラブルシューティングしたりするときは、コンテキストを知ることが重要です。入手した情報が多ければ多いほど、ユーザーに影響する問題をよりすばやく回避または検出できます。オブザーバビリティツールには、データのコンテキスト調査に役立つさまざまな機能が用意されています。その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」コールを選択すると、このコールのスタックトレースが右側に表示されます。スタックトレースを見ると、このコールがDoorChecker.javaの36行目にある「precheck」メソッド内で実行されていることがわかります。ここまで問題を特定できたら、あとはアプリケーションのコードを変更して時間のかかっているコールを修正するだけです。
このように、Splunk APMを使ってAlwaysOn Profilingを有効にすることで、問題をすばやく調査、特定、解決できます。アプリケーションの問題はシステムのダウンタイムの問題ほど単純でないことがあります。しかも、パフォーマンスの低下は顧客満足度の低下につながります。APMとコードプロファイリングツールでパフォーマンスとコードレベルのインサイトが得られれば、問題をすばやく解決し、アプリケーションコードを最適化できます。
現在、AlwaysOn Profiling機能はJava、.NET、Node.jsアプリケーションに対応しており、他の言語も順次サポートされる予定です。Goとその他いくつかの言語ではプロファイリングがサポートされていませんが、自動インストルメンテーションが可能です。コードプロファイリングの便利さと問題解決の速さを実際に体験したい場合は、Splunk Observability Cloudの無料トライアル版をご利用ください。