Kinesis Data Streams で IteratorAgeMilliseconds の値が増え続けるのはなぜですか?

最終更新日: 2020 年 5 月 6 日

Amazon Kinesis Data Streams のメトリクス IteratorAgeMilliseconds が増加し続けています。この理由について教えてください。

簡単な説明

Kinesis Data Streams における IteratorAgeMilliseconds メトリクスの増加には、以下のような理由が考えられます。

  • 遅いレコード処理
  • 読み込みのスロットリング
  • AWS Lambda 関数でのエラー
  • 接続タイムアウト

解決方法

遅いレコード処理

コンシューマー処理ロジックに対する過負荷は、レコード処理における速度低下の原因になる場合があります。コンシューマーが Amazon Kinesis Client Library (KCL) を使用して構築されている場合は、次に示す根本原因についてチェックします。

  • 物理リソースの不足: 需要のピーク時におけるメモリや CPU の使用率などをチェックし、インスタンスに十分な量の物理リソースがあるかどうかを確認します。
  • スケーリングの失敗: Amazon Kinesis データストリームの負荷が増加した場合に、コンシューマーレコード処理ロジックがスケーリングに失敗することがあります。これは、KCL によって出力される、Amazon CloudWatch からの他のカスタムメトリクスをモニタリングすることで確認できます。これらのメトリクスは、以下の各オペレーションに関連付けられています。processTaskRecordProcessor.processRecords.TimeSuccessRecordsProcessedCloudWatch メトリクスの IncomingBytes および IncomingRecords をモニタリングすると、Kinesis データストリームの全体的なスループットも確認できます。KCL および CloudWatch でのカスタムメトリクスの詳細については、「Amazon CloudWatch による Kinesis クライアントライブラリのモニタリング」をご参照ください。前出の確認を通じても処理時間を短縮できない場合は、シャード数を増やして Kinesis ストリームをアップスケールすることを検討してください。
  • データの有効期限: コンシューマーの処理が遅いために、データの有効期限が切れるリスクがある場合は、ストリームの保持期間を延長します。保持期間はデフォルトで 24 時間に設定されており、最大 7 日にまで延長できます。データ保持期間の詳細については「データ保持期間の変更」をご参照ください。
  • 重複処理の増加: コンシューマーのレコード処理ロジックの確認も役立つことがあります。processRecords.Time 値の増加がトラフィック負荷の増加と相関しない場合は、レコード処理ロジックを確認します。レコード処理ロジックによる同期ブロック呼び出しが原因で、コンシューマーレコード処理の遅延が発生することがあります。この問題を軽減するもう 1 つの方法は、Kinesis Data Streams のシャード数を増やすことです。必要なシャード数の詳細については「リシャーディング、拡張、並列処理」をご参照ください。
  • GetRecords リクエスト回数の不足: コンシューマーによる GetRecords リクエストの送信頻度が十分でない場合、コンシューマーアプリケーションで遅延が発生することがあります。

読み込みのスロットリング

ReadProvisionedThroughputExceeded メトリクスをチェックし、ストリームで読み込みスロットリングが起きているかどうかを確認します。Kinesis ストリームでの読み込みスロットリングの詳細については、「Amazon CloudWatch による Amazon Kinesis Data Streams サービスのモニタリング」をご参照ください。

Lambda 関数でのエラー

Amazon CloudWatch で、IteratorAgeMilliseconds カウントが増加し続けているストリームと関係のある Lambda 関数を確認します。CloudWatch でエラーの概要を確認することで、IteratorAgeMilliseconds 値の増加の原因となっているエラーを特定できます。Lambda 関数エラーのタイムスタンプが、Kinesis データストリームの IteratorAgeMilliseconds メトリクスが増加した時刻と一致しているかを確認します。タイムスタンプが一致していれば、このエラーが増加の原因です。

注: Lambda 関数では、再試行される際にエラーをスローすることがあります。Lambda 関数は Kinesis のコンシューマーとしてレコードをスキップしないため、再試行が発生します。レコードが再試行されると、処理の遅延も増加します。コンシューマーがストリームに対し遅延するので、IteratorAgeMilliseconds メトリクスが増加します。

接続タイムアウト

Kinesis データストリームからレコードをプルしている間に、Lambda 関数が接続タイムアウトを引き起こす場合があります。接続タイムアウトが起きると、IteratorAgeMilliseconds カウントの大幅な増加につながることがあります。

カウントの増加が接続タイムアウトに関連しているかどうかは、GetRecords.Latency および GetRecords.Success メトリクスを見ることで確認できます。これら 2 つのメトリクスが供に影響を受けている場合は、接続が復元された以降、IteratorAgeMilliseconds カウントの増加はなくなります。