<commit_before>---
title: "配置 TaskManager 内存"
nav-parent_id: ops_mem
nav-pos: 2
---
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

Flink 的 TaskManager 负责执行用户代码。
根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用，增强作业运行的稳定性。

* toc
{:toc}

本文接下来介绍的内存配置方法适用于 *1.10* 及以上版本。
Flink 在 1.10 版本中对内存配置部分进行了较大幅度的改动，从早期版本升级的用户请参考[升级指南]({% link ops/memory/mem_migration.zh.md %})。

<span class="label label-info">提示</span>
本篇内存配置文档<strong>仅针对 TaskManager</strong>！
与 [JobManager]({% link ops/memory/mem_setup_jobmanager.zh.md %}) 相比，TaskManager 具有相似但更加复杂的内存模型。

<a name="configure-total-memory" />

## 配置总内存

Flink JVM 进程的*进程总内存（Total Process Memory）*包含了由 Flink 应用使用的内存（*Flink 总内存*）以及由运行 Flink 的 JVM 使用的内存。
其中，*Flink 总内存（Total Flink Memory）*包括 JVM 堆内存（Heap Memory）、*托管内存（Managed Memory）*以及其他直接内存（Direct Memory）或本地内存（Native Memory）。

<center>
  <img src="{% link /fig/simple_mem_model.svg %}" width="300px" alt="Simple memory model" usemap="#simple-mem-model">
</center>
<br />

如果你是在本地运行 Flink（例如在 IDE 中）而非创建一个集群，那么本文介绍的配置并非所有都是适用的，详情请参考[本地执行](#local-execution)。

其他情况下，配置 Flink 内存最简单的方法就是[配置总内存]({% link ops/memory/mem_setup.zh.md %}#configure-total-memory)。
此外，Flink 也支持[更细粒度的内存配置方式](#configure-heap-and-managed-memory)。

Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
接下来的章节将介绍关于各内存部分的更多细节。

<a name="configure-heap-and-managed-memory" />

## 配置堆内存和托管内存

如[配置总内存](#configure-total-memory)中所述，另一种配置 Flink 内存的方式是同时设置[任务堆内存](#task-operator-heap-memory)和[托管内存](#managed-memory)。
通过这种方式，用户可以更好地掌控用于 Flink 任务的 JVM 堆内存及 Flink 的[托管内存](#managed-memory)大小。

Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
关于各内存部分的更多细节，请参考[相关文档](#detailed-memory-model)。

<span class="label label-info">提示</span>
如果已经明确设置了任务堆内存和托管内存，建议不要再设置*进程总内存*或 *Flink 总内存*，否则可能会造成内存配置冲突。

<a name="task-operator-heap-memory" />

### 任务（算子）堆内存

如果希望确保指定大小的 JVM 堆内存给用户代码使用，可以明确指定*任务堆内存*（[`taskmanager.memory.task.heap.size`]({% link ops/config.zh.md %}#taskmanager-memory-task-heap-size)）。
指定的内存将被包含在总的 JVM 堆空间中，专门用于 Flink 算子及用户代码的执行。

<a name="managed-memory" />

### 托管内存

*托管内存*是由 Flink 负责分配和管理的本地（堆外）内存。
以下场景需要使用*托管内存*：
* 流处理作业中用于 [RocksDB State Backend]({% link ops/state/state_backends.zh.md %}#the-rocksdbstatebackend)。
* [批处理作业]({% link dev/batch/index.zh.md %})中用于排序、哈希表及缓存中间结果。
* Both streaming and batch jobs can use it for executing [User Defined Functions in Python processes]({% link dev/python/table-api-users-guide/udfs/python_udfs.md %}).

可以通过以下两种范式指定*托管内存*的大小：
* 通过 [`taskmanager.memory.managed.size`]({% link ops/config.zh.md %}#taskmanager-memory-managed-size) 明确指定其大小。
* 通过 [`taskmanager.memory.managed.fraction`]({% link ops/config.zh.md %}#taskmanager-memory-managed-fraction) 指定在*Flink 总内存*中的占比。

当同时指定二者时，会优先采用指定的大小（Size）。
若二者均未指定，会根据[默认占比]({% link ops/config.zh.md %}#taskmanager-memory-managed-fraction)进行计算。

请同时参考[如何配置 State Backend 内存]({% link ops/memory/mem_tuning.zh.md %}#configure-memory-for-state-backends)以及[如何配置批处理作业内存]({% link ops/memory/mem_tuning.zh.md %}#configure-memory-for-batch-jobs)。

#### Consumer Weights

If your job contains multiple types of managed memory consumers, you can also control how managed memory should be shared across these types.
The configuration option [`taskmanager.memory.managed.consumer-weights`]({% link ops/config.md %}#taskmanager-memory-managed-consumer-weights) allows you to set a weight for each type, to which Flink will reserve managed memory proportionally.
Valid consumer types are:
* `DATAPROC`: for RocksDB state backend in streaming and built-in algorithms in batch.
* `PYTHON`: for python processes.

E.g. if a streaming job uses both RocksDB state backend and Python UDFs, and the consumer weights are configured as `DATAPROC:70,PYTHON:30`, Flink will reserve `70%` of the total managed memory for RocksDB state backend and `30%` for Python processes.

<span class="label label-info">Note</span>
For each type, Flink reserves managed memory only if the job contains managed memory consumer of that type.
E.g, if a streaming job uses heap state backend and Python UDFs, and the consumer weights are configured as `DATAPROC:70,PYTHON:30`, Flink will use all of its managed memory for Python processes, because heap state backend does not use managed memory.

<span class="label label-info">Note</span>
Flink will not reserve managed memory for consumer types that are not included in the consumer weights.
If the missing type is actually needed by the job, it can lead to memory allocation failures.
By default, all consumer types are included.
This could only happen when the weights are explicitly configured/overwritten.

<a name="configure-off-heap-memory-direct-or-native" /><commit_msg>[FLINK-19182][doc-zh] Update translation for intra-slot managed memory sharing.<commit_after>---
title: "配置 TaskManager 内存"
nav-parent_id: ops_mem
nav-pos: 2
---
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

Flink 的 TaskManager 负责执行用户代码。
根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用，增强作业运行的稳定性。

* toc
{:toc}

本文接下来介绍的内存配置方法适用于 *1.10* 及以上版本。
Flink 在 1.10 版本中对内存配置部分进行了较大幅度的改动，从早期版本升级的用户请参考[升级指南]({% link ops/memory/mem_migration.zh.md %})。

<span class="label label-info">提示</span>
本篇内存配置文档<strong>仅针对 TaskManager</strong>！
与 [JobManager]({% link ops/memory/mem_setup_jobmanager.zh.md %}) 相比，TaskManager 具有相似但更加复杂的内存模型。

<a name="configure-total-memory" />

## 配置总内存

Flink JVM 进程的*进程总内存（Total Process Memory）*包含了由 Flink 应用使用的内存（*Flink 总内存*）以及由运行 Flink 的 JVM 使用的内存。
其中，*Flink 总内存（Total Flink Memory）*包括 JVM 堆内存（Heap Memory）、*托管内存（Managed Memory）*以及其他直接内存（Direct Memory）或本地内存（Native Memory）。

<center>
  <img src="{% link /fig/simple_mem_model.svg %}" width="300px" alt="Simple memory model" usemap="#simple-mem-model">
</center>
<br />

如果你是在本地运行 Flink（例如在 IDE 中）而非创建一个集群，那么本文介绍的配置并非所有都是适用的，详情请参考[本地执行](#local-execution)。

其他情况下，配置 Flink 内存最简单的方法就是[配置总内存]({% link ops/memory/mem_setup.zh.md %}#configure-total-memory)。
此外，Flink 也支持[更细粒度的内存配置方式](#configure-heap-and-managed-memory)。

Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
接下来的章节将介绍关于各内存部分的更多细节。

<a name="configure-heap-and-managed-memory" />

## 配置堆内存和托管内存

如[配置总内存](#configure-total-memory)中所述，另一种配置 Flink 内存的方式是同时设置[任务堆内存](#task-operator-heap-memory)和[托管内存](#managed-memory)。
通过这种方式，用户可以更好地掌控用于 Flink 任务的 JVM 堆内存及 Flink 的[托管内存](#managed-memory)大小。

Flink 会根据默认值或其他配置参数自动调整剩余内存部分的大小。
关于各内存部分的更多细节，请参考[相关文档](#detailed-memory-model)。

<span class="label label-info">提示</span>
如果已经明确设置了任务堆内存和托管内存，建议不要再设置*进程总内存*或 *Flink 总内存*，否则可能会造成内存配置冲突。

<a name="task-operator-heap-memory" />

### 任务（算子）堆内存

如果希望确保指定大小的 JVM 堆内存给用户代码使用，可以明确指定*任务堆内存*（[`taskmanager.memory.task.heap.size`]({% link ops/config.zh.md %}#taskmanager-memory-task-heap-size)）。
指定的内存将被包含在总的 JVM 堆空间中，专门用于 Flink 算子及用户代码的执行。

<a name="managed-memory" />

### 托管内存

*托管内存*是由 Flink 负责分配和管理的本地（堆外）内存。
以下场景需要使用*托管内存*：
* 流处理作业中用于 [RocksDB State Backend]({% link ops/state/state_backends.zh.md %}#the-rocksdbstatebackend)。
* [批处理作业]({% link dev/batch/index.zh.md %})中用于排序、哈希表及缓存中间结果。
* 流处理和批处理作业中用于[在 Python 进程中执行用户自定义函数]({% link dev/python/table-api-users-guide/udfs/python_udfs.zh.md %})。

可以通过以下两种范式指定*托管内存*的大小：
* 通过 [`taskmanager.memory.managed.size`]({% link ops/config.zh.md %}#taskmanager-memory-managed-size) 明确指定其大小。
* 通过 [`taskmanager.memory.managed.fraction`]({% link ops/config.zh.md %}#taskmanager-memory-managed-fraction) 指定在*Flink 总内存*中的占比。

当同时指定二者时，会优先采用指定的大小（Size）。
若二者均未指定，会根据[默认占比]({% link ops/config.zh.md %}#taskmanager-memory-managed-fraction)进行计算。

请同时参考[如何配置 State Backend 内存]({% link ops/memory/mem_tuning.zh.md %}#configure-memory-for-state-backends)以及[如何配置批处理作业内存]({% link ops/memory/mem_tuning.zh.md %}#configure-memory-for-batch-jobs)。

<a name="consumer-weights" />

#### 消费者权重

对于包含不同种类的托管内存消费者的作业，可以进一步控制托管内存如何在消费者之间分配。
通过 [`taskmanager.memory.managed.consumer-weights`]({% link ops/config.zh.md %}#taskmanager-memory-managed-consumer-weights) 可以为每一种类型的消费者指定一个权重，Flink 会按照权重的比例进行内存分配。
目前支持的消费者类型包括：
* `DATAPROC`：用于流处理中的 RocksDB State Backend 和批处理中的内置算法。
* `PYTHON`：用户 Python 进程。

例如，一个流处理作业同时使用到了 RocksDB State Backend 和 Python UDF，消费者权重设置为 `DATAPROC:70,PYTHON:30`，那么 Flink 会将 `70%` 的托管内存用于 RocksDB State Backend，`30%` 留给 Python 进程。

<span class="label label-info">提示</span>
只有作业中包含某种类型的消费者时，Flink 才会为该类型分配托管内存。
例如，一个流处理作业使用 Heap State Backend 和 Python UDF，消费者权重设置为 `DATAPROC:70,PYTHON:30`，那么 Flink 会将全部托管内存用于 Python 进程，因为 Heap State Backend 不使用托管内存。

<span class="label label-info">提示</span>
对于未出现在消费者权重中的类型，Flink 将不会为其分配托管内存。
如果缺失的类型是作业运行所必须的，则会引发内存分配失败。
默认情况下，消费者权重中包含了所有可能的消费者类型。
上述问题仅可能出现在用户显式地配置了消费者权重的情况下。

<a name="configure-off-heap-memory-direct-or-native" />
{'fraction_non_alphanumeric': 0.12377882969080471, 'fraction_numerical': 0.005740759391680935, 'mean_word_length': 6.0928571428571425, 'pattern_counts': {'":': 0, '<': 44, '<?xml version=': 0, '>': 44, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7371651', 'n_tokens_mistral': 4697, 'n_tokens_neox': 4939, 'n_words': 901}