为什么我的 Lambda IteratorAge 指标会升高,我该如何降低该指标?

上次更新时间: 2021 年 6 月 15 日

我发现我的 AWS Lambda 函数的 IteratorAge 指标升高(或激增)。为什么我的函数的 iterator age 指标会升高,我该如何降低该指标?

简短描述

当 Lambda 函数无法有效处理写入调用该函数的流式传输的数据时,函数的 iterator age 会升高。要降低函数的 IteratorAge 指标,您必须提升流式传输处理的吞吐量。

以下因子会影响函数的 IteratorAge 指标:

阅读这篇文章以了解每个因子如何影响 iterator age。然后,根据您的使用案例的情况,重新配置函数或数据流式传输以降低函数的 iterator age。有关更多信息,请参阅使用 AWS Lambda 函数指标

解决方法

缩短函数的运行时间

较长的运行持续时间会使函数的 iterator age 升高。减少持续时间会增加函数的吞吐量,从而降低函数的 iterator age。

要减少函数的运行持续时间,请执行以下一项或两项操作:

1.  增加分配给函数的内存数量

2.  优化函数代码,缩短处理记录的时间。

注意:有关更多信息,请参阅 AWS Lambda 和 AWS X-Ray分析 AWS Lambda 函数

增加流式传输的分区数量

流式传输中的分区数量少会增加函数的 iterator age。增加流式传输中的分区数可提升函数的吞吐量,进而降低函数的 iterator age。

要增加流式传输的分区数量,请按照对流式传输进行重新分区中的说明进行操作。

注意:分区拆分不会立即对函数的 iterator age 造成影响。现有记录仍保留在它们写入的分区中。这些分区必须在它们的 iterator age 降低之前赶上分区的积压。有关更多信息,请参阅使用流式传输

增加流式传输的批处理大小

如果函数的运行持续时间与事件中的记录数无关,则增加函数的批处理大小可降低函数的 iterator age。

要增加函数的批处理大小,请按照将流式传输配置为事件来源中的说明进行操作。

注意:如果您的函数的持续时间与事件中的记录数量有关,则增加函数的批处理大小不会降低函数的 iterator age。有关更多信息,请参阅使用流式传输

确保您的函数有条不紊地处理调用错误

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

重要的是,您的函数可以有条不紊地处理写入流式传输的记录。在开发函数时,记录和分析代码有助于诊断错误。

有关更多信息,请参阅以下内容:

通过测试不同的并行化因子设置和使用增强扇出来提高流式传输处理的吞吐量

测试并行化因子设置

您可以通过配置函数的并行化因子来增加流式传输的每个分区中的并发 Lambda 调用数。您还可以指定 Lambda 从各个分区轮询的并发批处理数。

例如,如果您的并行化因子设为 10,则最多可以有 50 个并发 Lambda 调用来处理五个 Kinesis 数据分区。

有关更多信息,请参阅将 AWS Lambda 与 Amazon Kinesis 结合使用以及适用于 Kinesis 和 Amazon DynamoDB 事件来源的新 AWS Lambda 扩展控件

注意:在增加每个分区的并发批处理数量时,Lambda 在分区键级别管理有序处理。

使用增强的扇出

您可以通过创建具有增强扇出功能的数据流使用者来降低延迟并提高读取吞吐量。对于不影响从数据流读取数据的其他应用程序,数据流使用者将为这些应用程序的每个分区获得专用的连接。

有关更多信息,请参阅发展具有专用吞吐量的自定义使用者(增强扇出)以及将 AWS Lambda 与 Amazon Kinesis 结合使用

注意:如果您有许多应用程序读取相同的数据,或者要使用大记录重新处理流式传输,则最佳实践是使用增强扇出。