

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 无限制的状态增长
<a name="troubleshooting-rt-stateleaks"></a>

如果您的应用程序未正确处理过时的状态信息，则这些信息将不断积累并导致应用程序性能或稳定性出现问题。本节介绍这种情况的症状和故障排除步骤。

## 症状
<a name="troubleshooting-rt-stateleaks-symptoms"></a>

这种情况可能具有以下症状：
+ 该`lastCheckpointDuration`指标正在逐渐增加或激增。
+ 该`lastCheckpointSize`指标正在逐渐增加或激增。

## 原因和解决方案
<a name="troubleshooting-rt-stateleaks-causes"></a>

以下情况可能会导致您的应用程序积累状态数据：
+ 您的应用程序保留状态数据的时间超过了所需的时间。
+ 您的应用程序使用持续时间过长的窗口查询。
+ 您没有为状态数据设置 TTL。有关更多信息，请参阅 Apache Flink [文档中的状态 Time-To-Live (TTL)](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/dev/datastream/fault-tolerance/state/#state-time-to-live-ttl)。
+ 您正在运行的应用程序依赖于 Apache Beam 版本 2.25.0 或更高版本。你可以选择退出新版本的读取转换，方法是 BeamApplicationProperties使用关键实验和值来[扩展你的](https://docs.aws.amazon.com/managed-flink/latest/java/examples-beam.html#examples-beam-configure)读取转换`use_deprecated_read`。有关更多信息，请参阅 [Apache Beam 文档](https://beam.apache.org/blog/beam-2.25.0/#highlights)。

有时，应用程序会面临不断增加的状态规模增长，从长远来看，这是不可持续的（毕竟 Flink 应用程序可以无限期运行）。有时，这可以追溯到应用程序将数据存储在状态中，而旧信息没有正确过期。但是有时候人们对 Flink 能提供的功能抱有不合理的期望。应用程序可以在跨几天甚至几周的大时间窗口内使用聚合。[AggregateFunctions](https://nightlies.apache.org/flink/flink-docs-stable/docs/dev/datastream/operators/windows/#aggregatefunction)除非使用允许增量聚合，否则 Flink 需要保持整个窗口的事件处于状态。

此外，在使用流程函数实现自定义运算符时，应用程序需要从状态中删除业务逻辑不再需要的数据。在这种情况下，可以使用[状态存活时间](https://nightlies.apache.org/flink/flink-docs-stable/docs/dev/datastream/fault-tolerance/state/#state-time-to-live-ttl)来根据处理时间自动使数据过期。Managed Service for Apache Flink使用增量检查点，因此状态 ttl 基于 [RocksDB 压缩](https://github.com/facebook/rocksdb/wiki/Compaction)。只有在压缩操作发生后，您才能观察到状态大小的实际缩小（由检查点大小表示）。特别是对于小于 200 MB 的检查点大小，您不太可能观察到由于状态过期而导致检查点大小缩小。但是，保存点基于不包含旧数据的状态的干净副本，因此您可以在 Managed Service for Apache Flink中触发快照，以强制删除过期的状态。

出于调试目的，禁用增量检查点以更快地验证检查点大小是否确实减小或稳定下来（并避免 RockSB 中压缩的影响）将很有用。不过，这需要向服务团队创建工单。