What is continuous profiling?
継続的なプロファイリングの定義
継続的なプロファイリングは、パフォーマンスを最適化し、リソース使用状況を改善するために、本番運用環境で実行中のアプリケーションからパフォーマンスデータを継続的に収集するプロセスです。
アドホックまたはオンデマンドでデータをサンプリングする従来の方法とは異なり、継続的なプロファイリングではメトリックをリアルタイムでキャプチャします。それにより、アプリケーションのパフォーマンスや振る舞いについて、はるかに正確な最新の情報が得られます。また、特に本番環境に焦点を合わせ、リソース使用状況を追跡したり、コードレベルのインサイトを取得したりできます。これは短期的に役立つだけでなく、最小限のオーバーヘッドで長期的な分析も可能にします。
従来のプロファイリング手法と比較すると、いくつかの重要な点で進化が見られます。たとえば、アドホックな分析から継続的なデータ収集への移行、eBPFの革新を通じたパフォーマンスへの影響の大幅な軽減、オブザーバビリティツールとの統合などが挙げられます。最新の継続的なプロファイラーは、AIや機械学習に基づく自動化された分析機能も搭載し、さまざまなプログラミング言語をサポートできます。また、分散型とクラウドネイティブの両方のシステムで適切に動作できるよう設計されています。
継続的なプロファイリングの重要性
パフォーマンスのボトルネックの特定と解決
継続的なプロファイリングでは、パフォーマンスのボトルネックをリアルタイムで検出して解決することが可能です。CPU、メモリー、ディスクI/Oなどのリソース使用状況データを継続的に収集することで、システムの振る舞いに対する詳細なインサイトをその場で得ることができます。つまり、開発者はコード内のどこに非効率性があるかを厳密に特定できるため、パフォーマンスの問題を解決し、アプリケーション全体のパフォーマンスをプロアクティブに改善できます。
開発チームへのメリット
継続的なプロファイリングでは、開発環境やテスト環境では現れない可能性のあるパフォーマンスの問題を開発者が簡単に特定して対処できるため、コードの品質も向上します。結果として、より堅牢で効率の良い本番コードにつながります。また、データをリアルタイムで分析して、間欠的な問題をよりすばやく特定できるため、トラブルシューティングも強化されます。それにより、デバッグにかかる時間が短縮され、生産性が向上します。また、アプリケーションのパフォーマンスや振る舞いへのインサイトが得られることで、継続的なプロファイリングはスケーラビリティや信頼性の点でもSREチームに貢献します。なぜなら、アプリケーションがパフォーマンスを落とさずに負荷の増加に対応できるかを確認できるためです。
ビジネス上のメリット
継続的なプロファイリングを使用してリソース使用状況を最適化することで、クラウドリソースの消費と関連コストを削減できるため、ビジネスのコスト削減につながります。また、データセンターの二酸化炭素排出量を最小限に抑えて、技術産業における企業の全体的な環境責任を改善するために役立ちます。
アプリケーションのパフォーマンスを改善することは、間接的にユーザーエクスペリエンスの向上にもつながるため、顧客満足度が高まり、顧客の維持率向上も可能になります。
継続的なプロファイリングの仕組み
手順1:データ収集
継続的なプロファイリングの最初の手順は、必要なデータの収集です。このプロセスでは一般に、低オーバーヘッドのサンプリング手法を使用して、メモリー割り当て、CPU使用状況、I/O動作などのメトリックを収集します。これは、eBPF、JProfiler、Elasticのユニバーサルプロファイリングなどのツールを統合することで行います。
これらのツールは、エージェント、ライブラリ、またはカーネルモジュールを使用してシステムに統合されます。その方法は、選択する特定のテクノロジーと、必要なアクセスのレベルによって異なります。また、プロファイリングの各アプローチには、影響やリソース要件に関する違いもあります。
- 軽量で常時オンのプロファイラー:オーバーヘッドが最小限で、本番環境での継続的な使用に適しています。
- サンプリングプロファイラー:定期的なデータ収集を実行し、オーバーヘッドから低~中程度です。
- インストルメンテーションプロファイラー:より詳細なデータを収集しますが、オーバーヘッドは大きくなります。多くの場合、開発環境、テスト環境、ステージング環境で使用されます。
- トレーシングツール:包括的なデータ収集を実行しますが、オーバーヘッドは非常に大きくなります。一般に、特定のデバッグセッションで使用されます。
手順2:分析
収集したデータを分析して、パフォーマンスのボトルネック、リソース使用パターン、潜在的な最適化などを特定します。この分析プロセスには多くの場合、データの経時的な集計、アプリケーションイベントとの相互参照、統計的手法の適用による異常やトレンドの検出が含まれます。ここでの目標は、データをアクション可能なインサイトに変換することです。
また、継続的なプロファイリングにトレースなどのアプリケーションパフォーマンス監視(APM)データを関連付けると、特定のトレースの発生時にどのコードが実行されていたかを正確に理解できるため、コンテキストを改善することで根本原因究明までの平均時間を短縮できます。
この段階では多くの場合、分析の向上のために、機械学習やAIツールなどの高度な手法が使用されます。これらの手法は特に、問題の自動的な分類、将来のパフォーマンスの予測、可能な最適化の提案などに役立ちます。
手順3:可視化
可視化手順では、収集された複雑なパフォーマンスデータを、直感的で理解しやすいビジュアル表現へと変換します。それにより、開発者と運用チームは、パフォーマンスのボトルネック、使用パターン、最適化可能な領域などをすばやく特定できるようになります。一般的な手法としては、ホットコードパスを簡単に特定できるフレームグラフや、コードの各部分で相対的に時間が費やされている箇所を表すつららチャートなどがあります。
これらの可視化では多くの場合、対話型操作がサポートされ、ユーザーがズームインしたり、データをフィルタリングしたり、特定の問題領域または関数にドリルダウンしたりできます。ほとんどのプロファイリングツールにはダッシュボードがあり、複数の可視化とメトリックが1か所に表示されます。
継続的なプロファイリングの実際
ユースケース
- Eコマースプラットフォームの最適化:継続的なプロファイリングを使用して、チェックアウトプロセスに影響している低速のデータベースクエリを特定したり、リソースが集中している関数を最適化してページ読み込み時間を短縮したりできます。
- マイクロサービスアーキテクチャのパフォーマンス:サービス間通信でのボトルネックを特定したり、すべての分散システムにわたってリソース割り当てを最適化したりできます。クラウドコストの最適化:メモリーやCPUの過剰な使用につながっている非効率なコードを特定したり、リソース使用状況を最適化してクラウドホスティングコストを削減したりできます。
- リアルタイムデータ処理システム:データ処理のボトルネックを検出して対処したり、ストリーム処理パイプラインを最適化してレイテンシを短縮したりできます。
- インシデントの管理と解決:パフォーマンスの問題の根本原因をすばやく特定して、平均復旧時間(MTTR)を短縮できます。
ベストプラクティス
- 継続的なプロファイリングを開発プロセスの早い段階で統合し、低オーバーヘッドのサンプリング手法を使用します。
- データ収集、分析、アラート生成を自動化して、一貫性と迅速な応答を確保します。
- 包括的なインサイトを得るために、既存のAPMおよびオブザーバビリティツールと接続します。
- ユニットテスト実行の継続的なプロファイリングを行うために、CI/CDパイプライン統合を実装します。
- 適用されているすべての最適化について、定期的な確認ルーチンとフィードバックループを設定します。
- すべてのプロファイリングツールを最新に保ち、定期的にメンテナンスします。
- チームのメンバーに対して、プロファイリングデータの解釈方法と効果的な分析方法のトレーニングを実施します。
継続的なプロファイリングの課題と制限
パフォーマンスのオーバーヘッド
低オーバーヘッドのサンプリング手法であっても、あらゆるタイプの継続的なプロファイリングで、監視対象システムに対してある程度のパフォーマンスオーバーヘッドが生じます。リソースに制約のある環境では特に、アプリケーションのパフォーマンスに影響が及ぶ可能性があります。パフォーマンスのオーバーヘッドを最小限に抑えるために行えることが3つあります。
- 可能な場合は、オーバーヘッドが最小であるeBPFベースのプロファイラーを使用する
- 適応型のプロファイリングを実装して、高負荷期間中の頻度を下げる
- システム全体ではなく重要なコンポーネントのプロファイリングに焦点を絞る
データのプライバシーに関する懸念
データ収集を伴う他のプロセスと同様に、収集されるデータには機密情報、特にユーザーのデータが含まれるリスクがあります。これには次の方法で対処できます。
- すべてのプロファイリングデータに対して、強力なアクセス制御と暗号化を実装する
- 機密データを格納、共有、表示する前に匿名化または難読化を行う
- 関連するすべてのデータ保護規制に厳密に準拠する
データの格納と管理
継続的なプロファイリングでは、生成される大量のデータを格納、管理する必要があります。これは、以下のような方法で効率的に行う必要があります。
- 格納期間を制限するデータ保持ポリシーを実装する
- データを圧縮する
- クラウドサービスを活用してスケーラビリティを高める
将来のトレンド、OpenTelemetryからのサポート
テクノロジーは常に変化や進化を続けており、それは継続的なプロファイリングを向上させる場合もあれば、新しい予期しない課題を生み出す場合もあります。それらを事前に予測することはできませんが、新しいツールや技法について認識し、自身のビジネスに活用できるどうかを判断することが重要です。
たとえば、OpenTelemetryは最近、プロファイリングをサポートしたことを発表し、オープンスタンダードに基づくプロファイリングデータモデルの構築を進めています。このような業界の変化は、ベンダーロックインをできるだけ避けつつ継続的なプロファイリングをオブザーバビリティプラットフォームに採用する際に、大きな違いをもたらす可能性があります。
Elasticによる継続的なプロファイリング
Elasticはユニバーサルプロファイリングをリリースし、これは企業に対して、開発パイプライン全体、システム全体にわたる常時オンのプロファイリングを提供します。eBPFプロファイリングを使用して必要なデータだけをキャプチャでき、OpenTelemetryとの統合によるオブザーバビリティの強化を通じて、より深いインサイトが明らかになります。Elasticは以下を実現します。
- システム全体での可視化:Elasticユニバーサルプロファイリングは、お客様のカーネル、アプリケーションコード、サードパーティライブラリからデータをキャプチャし、分析します。
- スムーズなデプロイ:干渉的な操作やアプリケーションのソースコードへの変更なしでエージェントをデプロイできるため、プロファイリングデータの受信をわずか数分で簡単に開始できます。
- データの可視化:プロファイリングデータは、スタックトレース、フレームグラフ、関数ビューを通してKibanaで検査できるため、データを経時的にフィルタリングおよび比較して、パフォーマンスの改善を特定したり、回帰を検出したりするのが簡単になります。