プロビジョンドモードのスロットリングの問題のトラブルシューティング
テーブルまたはインデックスでプロビジョニングされたスループットキャパシティを超過したアプリケーションは、リクエストスロットリングの対象になります。スロットリングは、アプリケーションで大量のキャパシティーユニットが消費されるのを防ぎます。DynamoDB は、読み込みや書き込みのオペレーションをスロットリングすると、発信者に ProvisionedThroughputExceededException
を返します。その後、アプリケーションは、リクエストの再試行前に短時間待機するなど、適切なアクションを実行できます。
スロットリングに関連していると思われる問題のトラブルシューティングでは、まずスロットリングの発生元が DynamoDB とアプリケーションのいずれであるかを確認することが重要です。
このトピックでは、プロビジョンドキャパシティモードの一般的なスロットリングの問題をトラブルシューティングする方法について説明します。一般的なシナリオと、その解決に役立つ手順を以下に示します。
DynamoDB テーブルには十分なプロビジョンドキャパシティがあるようでも、リクエストがスロットリングされる
この問題は、スループットが 1 分あたりでは平均未満でも、1 秒あたりでは使用可能な量を超えている場合に発生することがあります。DynamoDB は分単位のメトリクスのみを CloudWatch に報告し、メトリクスは 1 分間の合計として計算されて平均化されます。ただし、DynamoDB 自体のレート制限は 1 秒単位で適用されます。このため、その 1 分間の範囲でわずかな時間 (たとえば数秒未満) であっても、発生したスループットが多すぎると、その範囲の残りのリクエストが抑制される可能性があります。
例えば、テーブルに 60 WCU がプロビジョニングされている場合、1 分間に 3,600 回の書き込みオペレーションを実行できます。ただし、1 秒で 3600 個の WCU リクエストがすべて実行された場合、残りの時間にスロットリングが発生します。
このシナリオを解決する 1 つの方法は、API 呼び出しに多少のジッターとエクスポネンシャルバックオフを追加することです。詳細については、バックオフとジッター
自動スケーリングが有効になっていても、テーブルがスロットリングされる
これは、トラフィックでの突然のスパイク時に発生する可能性があります。自動スケーリングは、2 つのデータポイントが 1 分の間にターゲット使用率の設定値を超えた場合にトリガーされます。したがって、消費された容量が目標使用率よりも高い状態が 2 分間継続すると、自動スケーリングが実行されます。ただし、スパイクの間隔が 1 分を超えると、自動スケーリングはトリガーされない場合があります。
同様に、15 個の連続するデータポイントが目標使用率を下回ると、スケールダウンイベントがトリガーされます。いずれの場合でも、自動スケーリングのトリガー後に UpdateTable
API オペレーションが呼び出されます。この呼び出しは、テーブルまたはインデックスのプロビジョンドキャパシティを更新するのに数分かかる場合があります。この期間中、テーブルの前のプロビジョンドキャパシティを超えるリクエストはスロットルされます。
つまり、自動スケーリングで DynamoDB テーブルをスケールアップするには、連続したデータポイントでターゲット使用率の値を超える必要があります。このため、自動スケーリングは、スパイキーなワークロードに対処するためのソリューションとしては推奨されません。詳細については、自動スケーリングによるコスト最適化に関するドキュメントを参照してください。
ホットキーが原因でスロットリングの問題が発生している可能性がある
DynamoDB では、高いカーディナリティを持たないパーティションキーによって、少数のパーティションのみをターゲットとする多くのリクエストが発生する可能性があります。結果のホットパーティションが、1 秒あたり 3,000 RCU または 1,000 WCU のパーティション制限を超えると、スロットリングが発生する場合があります。CloudWatch Contributor Insights (CCI) は、各テーブルの項目アクセスパターンの CCI グラフを提供して、この問題のデバッグを支援する診断ツールです。このツールを使用すると、DynamoDB テーブルの最も頻繁にアクセスされるキーやその他のトラフィックの傾向を継続的に監視できます。CloudWatch Contributor Insights の詳細については、「CloudWatch Contributor Insights for DynamoDB」を参照してください。詳細については、「パーティションキーを設計してワークロードを分散する」および「適切な DynamoDB パーティションキーの選択
テーブルへのトラフィックがテーブルレベルのスループットクォータを超えている
テーブルレベルの読み取りスループットとテーブルレベルの書き込みスループットクォータは、テーブルレベルで適用されます。これらのクォータは、プロビジョンドキャパシティモードとオンデマンドキャパシティモードの両方のテーブルに適用されます。デフォルトでは、テーブルに設定されるスループットクォータは 40,000 読み込みリクエストユニットと 40,000 書き込みリクエストユニットです。テーブルへのトラフィックがこのクォータを超えると、テーブルがスロットリングする可能性があります。この発生を防止する方法の詳細については、「Amazon DynamoDB をモニタリングして運用状況を把握する
この問題を解決するには、Service Quotas コンソールを使用して、アカウントのテーブルレベルの読み取りまたは書き込みスループットクォータを増やします。