

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

# 使用性能最佳实践
<a name="performance-improving"></a>

本节介绍在设计性能应用程序时需要考虑的特殊注意事项。

## 正确管理扩展
<a name="performance-improving-scaling"></a>

本节包含有关管理应用程序级和操作员级扩展的信息。

**Topics**
+ [正确管理应用程序扩展](#performance-improving-scaling-app)
+ [正确管理运算符扩展](#performance-improving-scaling-op)

### 正确管理应用程序扩展
<a name="performance-improving-scaling-app"></a>

您可以使用自动缩放来处理应用程序活动中的意外峰值。如果满足以下条件，您的申请 KPUs 将自动增加：
+ 已为应用程序启用自动扩展。
+ CPU 使用率在 15 分钟内保持在 75% 以上。

如果启用了自动缩放，但 CPU 使用率未保持在此阈值，则应用程序将无法向上 KPUs扩展。如果您遇到 CPU 使用率峰值未达到此阈值，或者遇到其他使用量指标的峰值（例如）`heapMemoryUtilization`，请手动增加扩展，让您的应用程序能够处理活动峰值。

**注意**  
如果应用程序通过 auto Scaling 自动添加了更多资源，则应用程序将在闲置一段时间后释放新资源。缩减资源规模会暂时影响性能。

有关扩展的更多信息，请参阅 [实施应用程序扩展](how-scaling.md)。

### 正确管理运算符扩展
<a name="performance-improving-scaling-op"></a>

您可以通过验证应用程序的工作负载在工作进程之间均匀分配，以及应用程序中的操作员是否拥有稳定和高性能所需的系统资源，来提高应用程序的性能。

您可以使用设置为应用程序代码中的每个运算符设置并行度。`parallelism`如果您没有为运算符设置并行度，它将使用应用程序级的并行度设置。使用应用程序级并行度设置的操作员可能会使用应用程序可用的所有系统资源，从而使应用程序变得不稳定。

为了最好地确定每个运算符的并行度，请考虑该运算符与应用程序中其他运算符相比的相对资源需求。将资源密集度较高的运算符设置为较高的运算符并行度设置，而不是资源密集度较低的运算符。

应用程序的运算符总并行度是应用程序中所有运算符的并行度之和。您可以通过确定总运算符并行度与应用程序可用任务槽总数之间的最佳比率来调整应用程序的总运算符并行度。操作员总并行度与任务槽的典型稳定比率为 4:1，也就是说，应用程序每四个可用的运算符子任务就有一个任务槽可供使用。具有更多资源密集型运算符的应用程序可能需要的比率为 3:1 或 2:1，而资源密集型运算符较少的应用程序可能需要以 10:1 的比率保持稳定。

您可以使用为运算符设置比率[使用运行时属性](how-properties.md)，这样您就可以在不编译和上传应用程序代码的情况下调整运算符的并行度。

下面的代码示例演示了如何将运算符并行度设置为当前应用程序并行度的可调比率：

```
Map<String, Properties> applicationProperties = KinesisAnalyticsRuntime.getApplicationProperties();
operatorParallelism = 
    StreamExecutionEnvironment.getParallelism() / 
    Integer.getInteger(
        applicationProperties.get("OperatorProperties").getProperty("MyOperatorParallelismRatio")
    );
```

有关子任务、任务槽和其他应用程序资源的信息，请参阅[审核 Managed Service for Apache Flink 应用程序资源](how-resources.md)。

要控制如何在应用程序的工作进程中分配工作负载，请使用 `Parallelism` 设置和 `KeyBy` 分区方法。有关更多信息，请参阅 [Apache Flink 文档](https://ci.apache.org/projects/flink/flink-docs-release-1.8/)中的以下主题：
+ [并行执行](https://ci.apache.org/projects/flink/flink-docs-stable/dev/parallel.html)
+ [DataStream 转换](https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/#datastream-transformations)

## 监控外部依赖资源使用情况
<a name="performance-improving-destinations"></a>

如果目标（例如 Kinesis Streams、Firehose、DynamoDB OpenSearch 或服务）存在性能瓶颈，则您的应用程序将面临背压。验证您的外部依赖项是否已针对应用程序吞吐量进行了适当的配置。

**注意**  
其他服务中的故障可能会导致您的应用程序出现故障。如果您的应用程序出现故障，请检查目标服务的 CloudWatch 日志中是否存在故障。

## 在本地运行您的 Apache Flink 应用程序
<a name="performance-improving-local"></a>

要解决内存问题，可以在本地 Flink 安装中运行应用程序。这将允许您访问调试工具，例如堆栈跟踪和堆转储，这些工具在 Managed Service for Apache Flink 中运行应用程序时不可用。

有关创建本地 Flink 设置的信息，请参阅 Apache Flink 文档中的[独立](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/resource-providers/standalone/overview/)。