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

上次更新时间:2022 年 6 月 22 日

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 流量。
  • 重叠处理增加:考虑检查使用者的记录处理逻辑。如果您发现与增加的流量负载无关的 processRecords.Time 值增加,请检查您的记录处理逻辑。您的记录处理逻辑可能正在进行同步阻塞式调用,这些调用会导致使用者记录处理发生延迟。缓解此问题的另一种方法是增加您的 Kinesis Data Streams 中的分区数量。有关所需分区数量的更多信息,请参阅重新分区、扩展和并行处理
  • GetRecords 请求不足:如果使用者没有足够频繁地发送 GetRecords 请求,那么使用者应用程序可能会滞后。要进行验证,请检查 Amazon Kinesis 客户端库 (KCL) 配置:withMaxRecordswithIdleTimeBetweenReadsInMillis
  • IteratorAgeMilliseconds:如果使用者正在使用 Lambda 函数,则处理速度缓慢可能是由于 Lambda 触发器中的配置(例如,批处理大小较小)造成的。调用被阻塞或 Lambda 内存预置也可能导致记录处理速度缓慢。有关更多信息和故障排除,请参阅配置 Lambda 函数选项
  • 吞吐量不足或 MillisBehindLatest 值较高:如果您使用 Amazon Kinesis Data Analytics for SQL,请参阅吞吐量不足或 MillisBehindLatest 较高以了解故障排除步骤。

如果使用者滞后且存在数据过期的风险,请增加数据流的保留期限。默认情况下,保留期为 24 小时,最多可配置为一年。有关数据保留期的更多信息,请参阅更改数据保留期

读取限制

检查 ReadProvisionedThroughputExceeded 指标,查看是否对数据流设置了读取限制。

读取限制可能是由以下原因引起的:

  • 一个或多个使用者违反了每秒 5 次 GetRecords 调用的限制
  • 一个或多个使用者违反了每秒 1000 条记录的限制
  • 一个或多个使用者违反了每秒 1 MiB 的限制

有关 Kinesis 数据流读取限制的更多信息,请参阅如何检测并排查 Kinesis Data Streams 中的 ReadProvisionedThroughputExceeded 异常?

Lambda 函数错误

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

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

间歇性连接超时

您的使用者应用程序可能会在从 Kinesis 数据流提取记录时遇到连接超时问题。间歇性连接超时错误会导致 IteratorAgeMilliseconds 计数显著增加。

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

分片之间的数据分布不均匀

Kinesis 数据流中的某些分片可能比其他分片接收更多的记录,这是因为 Put 操作中使用的分区键无法在分片之间平均分配数据。这种不均匀的数据分布导致对 Kinesis 数据流分片的并行 GetRecords 调用减少,从而导致 IteratorAgeMilliseconds 计数增加。

如果数据在 Kinesis 数据流中的分片间分布不均匀,则使用随机分区键。随机分区键允许客户应用程序更快地读取记录。