分散アプリケーションのパフォーマンスのチューニング

このシリーズでは、開発チームがロード テストとメトリックを使用してパフォーマンスの問題を診断する方法を示しながら、いくつかのクラウド アプリケーションのシナリオについて手順を説明します。 これらの記事は、Microsoft がサンプル アプリケーションを開発するときに行った実際のロード テストに基づいています。 各シナリオのコードは、GitHub で入手できます。

シナリオ:

パフォーマンスとは

パフォーマンスは、スループット、応答時間、および可用性に関して頻繁に測定されます。 パフォーマンス目標は、業務に基づいている必要があります。 顧客向けのタスクは、レポートの生成などの運用タスクよりも要件が厳しい場合があります。

各ワークロードのパフォーマンス目標を定義するサービスレベル目標 (SLO) を定義します。 この目標を達成するには、通常、パフォーマンス目標を次のような一連の主要業績評価指標 (KPI) に分割します。

  • 特定の要求の待機時間または応答時間
  • 1 秒あたりに実行される要求の数
  • システムから例外が生成される速度。

パフォーマンス目標には、目標の負荷を明示的に含める必要があります。 また、システムに同時にアクセスして同じ作業を実行する場合でも、すべてのユーザーがまったく同じレベルのパフォーマンスを得られるわけではありません。 そのため、パーセンタイルの観点から SLO を構成する必要があります。

SLO の例: "クライアント要求は、最大 25,000 要求/秒の負荷で P90 あたり 500 ミリ秒内に応答があります。"

分散システムのパフォーマンスのチューニングに関する課題

分散アプリケーションのパフォーマンスの問題を診断することは特に困難な場合があります。 たとえば、次のような課題があります。

  • 通常、1 つのビジネストランザクションまたは操作には、システムの複数のコンポーネントが関わります。 1 つの操作を包括的にエンドツーエンドで把握するのは困難な場合があります。

  • リソースの消費は複数のノードに分散されます。 一貫性のあるビューを取得するには、ログとメトリックを 1 か所で集計する必要があります。

  • クラウドでは、柔軟なスケールが提供されます。 自動スケールは、負荷の急増に対処するための重要な手法ですが、基の問題がわからなくなる可能性もあります。 また、どのコンポーネントをいつスケールする必要があるかを把握することは難しい場合があります。

  • 多くの場合、ワークロードがコアやスレッドをまたいで拡張されることはありません。 ワークロードの要件を理解し、最適なサイズを求めることが重要です。 一部のサイズでは、コアが制約され、ハイパースレッドが無効になるため、シングル コア指向のライセンスありワークロードがコア単位で改善されます。

  • カスケード エラーが原因で、根本的な問題の上流で障害が発生する可能性があります。 その結果、問題の最初のシグナルは、根本原因とは異なるコンポーネントで現れることがあります。

一般的なベスト プラクティス

パフォーマンスのチューニングは芸術と科学の両方であり、体系的なアプローチを採用することで科学に近づけることができます。 いくつかのベスト プラクティスを次に示します。

  • テレメトリでメトリックを収集できるようにします。 コードをインストルメント化します。 監視のベスト プラクティスに従います。 トランザクション内のすべての手順を確認できるように、相関トレースを使用します。

  • 平均だけでなく、90/95/99 パーセンタイルを監視します。 平均値によって、外れ値がわからなくなる可能性があります。 メトリックのサンプリング レートも重要です。 サンプリング レートが低すぎると、問題を示している場合があるスパイクや外れ値がわからなくなる可能性があります。

  • 一度に 1 つのボトルネックに取り組みます。 1 つの仮説を立て、一度に 1 つの変数を変更してテストします。 ボトルネックを 1 つ取り除くと、さらに上流または下流の別のボトルネックが明らかになることがあります。

  • エラーと再試行は、パフォーマンスに大きな影響を与える可能性があります。 バックエンド サービスによってシステムが調整される場合、スケールアウトするか、使用の最適化を試してください (たとえば、データベース クエリを調整します)。

  • 一般的なパフォーマンスのアンチパターンを探します。

  • 並列化できる可能性を探します。 ボトルネックの 2 つの一般的な原因として、メッセージ キューとデータベースがあります。 いずれの場合も、シャーディングが役に立ちます。 詳細については、「データの水平的、垂直的、および機能的パーティション分割」を参照してください。 読み取りまたは書き込みの不均衡な負荷を示している可能性があるホット パーティションを探します。

次のステップ

パフォーマンスのチューニングに関するシナリオを読む