为什么 Kinesis Data Streams 中的 IteratorAgeMilliseconds 值不断增加?

上次更新时间:2020 年 5 月 6 日

Amazon Kinesis Data Streams 中的 IteratorAgeMilliseconds 指标不断增加。为什么会发生这种情况?

简短描述

Kinesis Data Streams 中的 IteratorAgeMilliseconds 指标增加可能是由于以下原因导致:

  • 记录处理速度较慢
  • 读取限制
  • AWS Lambda 函数错误
  • 连接超时

解决方法

记录处理速度较慢

使用者处理逻辑过载,可能会导致记录处理速度降低。如果使用者通过使用 Amazon Kinesis 客户端库 (KCL) 构建,请检查以下根本原因:

  • 物理资源不足:检查您的实例是否有充足的物理资源,例如,内存或峰值需求期间的 CPU 使用率。
  • 扩展失败:在 Amazon Kinesis 数据流负载增加的情况下,使用者记录处理逻辑可能无法进行扩展。可以通过监控 KCL 发布的其他自定义 Amazon CloudWatch 指标来验证这一点。这些指标与以下操作有关:processTaskRecordProcessor.processRecords.TimeSuccessRecordsProcessed。您也可以通过监控 CloudWatch 指标 IncomingBytesIncomingRecords 来检查 Kinesis 数据流的整体吞吐量。有关 KCL 和自定义 CloudWatch 指标的更多信息,请参阅利用 Amazon CloudWatch 监控 Kinesis 客户端库。但是,如果处理时间无法缩短,则考虑通过增加分区数量来增加 Kinesis 流量。
  • 数据过期:如果使用者滞后并且存在数据过期的风险,请增加数据流的保留期限。默认情况下,保留期为 24 小时,最多可配置为 7 天。有关数据保留期的更多信息,请参阅更改数据保留期
  • 重叠处理增加:考虑检查使用者的记录处理逻辑。如果您发现与增加的流量负载无关的 processRecords.Time 值增加,请检查您的记录处理逻辑。您的记录处理逻辑可能正在进行同步阻塞式调用,这些调用会导致使用者记录处理发生延迟。缓解此问题的另一种方法是增加您的 Kinesis Data Streams 中的分区数量。有关所需分区数量的更多信息,请参阅重新分区、扩展和并行处理
  • GetRecords 请求不足:如果使用者没有足够频繁地发送 GetRecords 请求,那么使用者应用程序可能会滞后。

读取限制

检查 ReadProvisionedThroughputExceeded 指标,查看是否对数据流设置了读取限制。有关 Kinesis Streams 的读取限制的更多信息,请参阅利用 Amazon CloudWatch 监控 Amazon Kinesis Data Streams 服务

Lambda 函数错误

在 Amazon CloudWatch 中,查看 IteratorAgeMilliseconds 计数不断增加的数据流对应的 Lambda 函数。您可以通过在 CloudWatch 中查看错误摘要,来确定导致 IteratorAgeMilliseconds 值增加的错误。检查 Lambda 函数错误的时间戳与 Kinesis 数据流的 IteratorAgeMilliseconds 指标增加时间是否一致。如果时间戳一致,则可以确定导致增加的原因。

注意:Lambda 函数可能会因重试而引发错误。Lambda 函数重试是因为它作为 Kinesis 的使用者没有跳过记录。由于这些记录被重试,处理的延迟时间也会增加。这样,您的使用者会落后于数据流,从而导致 IteratorAgeMilliseconds 指标增加。

连接超时

您的 Lambda 函数可能会在从 Kinesis 数据流提取记录时遇到连接超时问题。连接超时会导致 IteratorAgeMilliseconds 计数显著增加。

要验证计数增加是否与连接超时有关,请检查 GetRecords.LatencyGetRecords.Success 指标。如果这两个指标也都受到影响,则在恢复连接后您的 IteratorAgeMilliseconds 计数将停止增加。