为什么我的 Lambda IteratorAge 指标会上升?

上次更新时间:2019 年 8 月 5 日

我看到我的 AWS Lambda 函数的 IteratorAge 指标上升或猛升。为什么会出现这种情况,我应该如何处理?

简短描述

对于基于流的调用,Lambda 会发出 IteratorAge 指标。Iterator age 是记录批处理中最后一条记录与 Lambda 读取记录之间的时间。Iterator age 取决于其他参数,例如 Lambda 函数执行持续时间、分区数量和批处理大小。有关更多信息,请参阅 AWS Lambda CloudWatch 指标

通常,当函数无法及时处理正在写入流的数据量时,iterator age 会上升。

解决方法

查看每个 Lambda 函数参数和使用案例如何影响 iterator age。然后,重新配置函数以降低 iterator age。

持续时间

Lambda 函数执行持续时间长可能导致 iterator age 较高。持续时间是处理一批记录所需的时间。减少持续时间可增加吞吐量,从而降低 iterator age。

要减少函数的持续时间,请尝试:

  • 增加分配给函数的内存量。这可以使您的函数更快地处理记录,从而降低 iterator age。
  • 优化函数代码(例如,并行使用调用、使用异步方法等)以减少处理记录的时间。

AWS X-Ray 在优化函数持续时间方面也很有用。有关更多信息,请参阅 AWS Lambda 和 AWS X-Ray 分析 AWS Lambda 函数

分区数量

假设记录均匀分布(这是最佳实践),增加流中的分区数量会降低 iterator age。这是因为流中的分区数量对应于 Lambda 函数的最大并发数。基本上,更多分区意味着更高的并发数,因此吞吐量更高。有关更多信息,请参阅流事件调用

注意:分区分割对 iterator age 没有立即影响。现有记录保留在它们写入的分区中,并且在这些分区的 iterator age 降低之前,这些分区需要先处理其待办事项。

批处理大小

根据 Lambda 函数的工作方式,更改批处理大小可能会降低 iterator age。

例如,假设您的函数的持续时间基本上与事件中的记录数量无关,例如在批处理中发生下游调用时。在这种情况下,增加批处理大小可增加吞吐量,从而降低 iterator age。

但是,函数的持续时间可能在很大程度上取决于事件中的记录数量,例如每个记录触发一个同步下游调用时。在这种情况下,调整批处理大小可能无法有效降低 iterator age。

有关更多信息,请参阅流事件调用

错误数

调用错误可能导致 Lambda 函数需要更长时间来处理事件或反复处理同一事件。由于事件记录是按顺序读取的,因此如果一批记录在每次重试时都会导致错误,则您的函数无法处理后面的记录。在这些情况下,iterator age 随着记录年龄的增长而线性上升。

您的函数能够从容处理写入流的任何记录非常重要。在开发函数时,记录和分析代码可以帮助您诊断错误。有关更多信息,请参阅对基于 Lambda 的应用程序进行监控和问题排查分析 AWS Lambda 函数