Skip to content

Commit

Permalink
Add docs for global memory control GA (#12085)
Browse files Browse the repository at this point in the history
  • Loading branch information
wshwsh12 authored Dec 6, 2022
1 parent c1f5cad commit 4da9880
Show file tree
Hide file tree
Showing 5 changed files with 11 additions and 49 deletions.
32 changes: 4 additions & 28 deletions configure-memory-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,7 @@ SET tidb_mem_quota_query = 8 << 10;

## 如何配置 tidb-server 实例使用内存的阈值

可以在配置文件中设置 tidb-server 实例的内存使用阈值。相关配置项为 [`server-memory-quota`](/tidb-configuration-file.md#server-memory-quota-从-v409-版本开始引入)

例如,配置 tidb-server 实例的内存使用总量,将其设置成为 32 GB:

{{< copyable "" >}}

```toml
[performance]
server-memory-quota = 34359738368
```

在该配置下,当 tidb-server 实例内存使用到达 32 GB 时,正在执行的 SQL 语句会被随机强制终止,直至 tidb-server 实例内存使用下降到 32 GB 以下。被强制终止的 SQL 操作会向客户端返回 `Out Of Global Memory Limit!` 错误信息。

> **警告:**
>
> + `server-memory-quota` 目前为实验性特性,不建议在生产环境中使用。
> + `server-memory-quota` 默认值为 0,表示无内存限制。
自 v6.4.0 版本起,可以通过系统变量 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 设置 tidb-server 实例的内存使用阈值。
自 v6.5.0 版本起,可以通过系统变量 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 设置 tidb-server 实例的内存使用阈值。

例如,配置 tidb-server 实例的内存使用总量,将其设置成为 32 GB:

Expand All @@ -73,24 +55,18 @@ SET GLOBAL tidb_server_memory_limit = "32GB";
当前 `tidb_server_memory_limit` 所设的内存限制**不终止**以下 SQL 操作:

- DDL 操作
- INSERT、UPDATE、DELETE 操作
- 包含窗口函数和公共表表达式的 SQL 操作

> **警告:**
>
> + tidb-server 全局内存控制功能目前为实验性特性,不建议在生产环境中使用。
> + TiDB 在启动过程中不保证 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 限制生效。如果操作系统的空闲内存不足,TiDB 仍有可能出现 OOM。你需要确保 TiDB 实例有足够的可用内存。
> + 在内存控制过程中,TiDB 的整体内存使用量可能会略微超过 `tidb_server_memory_limit` 的限制。
> + 为了保证兼容性,当开启 `tidb_server_memory_limit` 功能后,系统会忽略 `server-memory-quota` 的值,使用 `tidb_server_memory_limit` 的全局内存控制机制来进行内存控制。在关闭 `tidb_server_memory_limit` 功能后,系统会使用配置项 `server-memory-quota` 的值以及旧的内存控制机制
> + `server-memory-quota` 配置项自 v6.5.0 起被废弃。为了保证兼容性,在升级到 v6.5.0 或更高版本的集群后,`tidb_server_memory_limit` 会继承配置项 `server-memory-quota` 的值。如果集群在升级至 v6.5.0 或更高版本前没有配置 `server-memory-quota``tidb_server_memory_limit` 会使用默认值,即 `80%`
在 tidb-server 实例内存用量到达总内存的一定比例时(比例由系统变量 [`tidb_server_memory_limit_gc_trigger`](/system-variables.md#tidb_server_memory_limit_gc_trigger-从-v640-版本开始引入) 控制), tidb-server 会尝试主动触发一次 Golang GC 以缓解内存压力。为了避免实例内存在阈值上下范围不断波动导致频繁 GC 进而带来的性能问题,该 GC 方式 1 分钟最多只会触发 1 次。

## 使用 INFORMATION_SCHEMA 系统表查看当前 tidb-server 的内存用量

> **警告:**
>
> 目前以下系统表是在 v6.4.0 引入的实验特性,提供的内存使用信息仅供参考,不建议在生产环境中使用以下系统表获取内存使用信息供决策判断。
要查看当前实例或集群的内存使用情况,你可以查询系统表 [`INFORMATION_SCHEMA.(CLUSTER_)MEMORY_USAGE`](/information-schema/information-schema-memory-usage.md)

要查看本实例或集群中内存相关的操作和执行依据,可以查询系统表 [`INFORMATION_SCHEMA.(CLUSTER_)MEMORY_USAGE_OPS_HISTORY`](/information-schema/information-schema-memory-usage-ops-history.md)。对于每个实例,该表保留最近 50 条记录。
Expand Down Expand Up @@ -140,12 +116,12 @@ SET GLOBAL tidb_server_memory_limit = "32GB";
4. 检查 `tidb.log` 文件,其中会记录系统总内存、系统当前内存使用量、tidb-server 实例的内存使用量以及状态文件所在目录。

```
[2022/10/11 16:39:02.281 +08:00] [WARN] [memoryusagealarm.go:212] ["tidb-server has the risk of OOM because of memory usage exceeds alarm ratio. Running SQLs and heap profile will be recorded in record path"] ["is server-memory-quota set"=false] ["system memory total"=33682427904] ["system memory usage"=22120655360] ["tidb-server memory usage"=21468556992] [memory-usage-alarm-ratio=0.85] ["record path"=/tiup/deploy/tidb-4000/log/oom_record]
[2022/10/11 16:39:02.281 +08:00] [WARN] [memoryusagealarm.go:212] ["tidb-server has the risk of OOM because of memory usage exceeds alarm ratio. Running SQLs and heap profile will be recorded in record path"] ["is tidb_server_memory_limit set"=false] ["system memory total"=33682427904] ["system memory usage"=22120655360] ["tidb-server memory usage"=21468556992] [memory-usage-alarm-ratio=0.85] ["record path"=/tiup/deploy/tidb-4000/log/oom_record]
```

以上 Log 字段的含义如下:

* `is server-memory-quota set`表示配置项 [`server-memory-quota`](/tidb-configuration-file.md#server-memory-quota-从-v409-版本开始引入) 是否被设置
* `is tidb_server_memory_limit set`表示系统变量 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 是否被设置
* `system memory total`:表示当前系统的总内存
* `system memory usage`:表示当前系统的内存使用量
* `tidb-server memory usage`:表示 tidb-server 实例的内存使用量
Expand Down
1 change: 0 additions & 1 deletion experimental-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ aliases: ['/docs-cn/dev/experimental-features-4.0/','/zh/tidb/dev/experimental-f
+ [Cost Model Version 2](/cost-model.md#cost-model-version-2)(v6.2.0 实验特性)
+ [FastScan](/develop/dev-guide-use-fastscan.md)(v6.2.0 实验特性)
+ [随机采样约 10000 行数据来快速构建统计信息](/system-variables.md#tidb_enable_fast_analyze)(v3.0 实验特性)
+ [全局控制 tidb-server 实例的内存使用量](/configure-memory-usage.md#如何配置-tidb-server-实例使用内存的阈值)(v6.4 实验特性)

## 稳定性

Expand Down
21 changes: 4 additions & 17 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -2131,9 +2131,8 @@ v5.0 后,用户仍可以单独修改以上系统变量(会有废弃警告)
- 当配置该变量的值为 `0``1` 时,表示关闭内存阈值报警功能。
- 当配置该变量为 `0``1` 之间的值时,表示开启内存阈值报警功能:
- 如果系统变量 [`tidb_server_memory_limit`](#tidb_server_memory_limit-从-v640-版本开始引入) 等于 0,且配置项 [`server-memory-quota`](/tidb-configuration-file.md#server-memory-quota-从-v409-版本开始引入) 未设置,则内存报警阈值为 `tidb_memory-usage-alarm-ratio * 系统内存大小`。
- 如果系统变量 `tidb_server_memory_limit` 等于 0,且配置项 `server-memory-quota` 被设置为大于 0,则内存报警阈值为 `tidb_memory-usage-alarm-ratio * server-memory-quota`
- 如果系统变量 `tidb_server_memory_limit` 被设置为大于 0,则内存报警阈值为 `tidb_memory-usage-alarm-ratio * tidb_server_memory_limit`
- 如果系统变量 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 等于 0,则内存报警阈值为 `tidb_memory_usage_alarm_ratio * 系统内存大小`。
- 如果系统变量 `tidb_server_memory_limit` 被设置为大于 0,则内存报警阈值为 `tidb_memory_usage_alarm_ratio * tidb_server_memory_limit`
### `tidb_memory_usage_alarm_keep_record_num` <span class="version-mark">从 v6.4.0 版本开始引入</span>
Expand Down Expand Up @@ -2905,13 +2904,9 @@ EXPLAIN FORMAT='brief' SELECT COUNT(1) FROM t WHERE a = 1 AND b IS NOT NULL;
### `tidb_server_memory_limit` <span class="version-mark">从 v6.4.0 版本开始引入</span>
> **警告:**
>
> `tidb_server_memory_limit` 目前为实验性特性,不建议在生产环境中使用。
- 作用域:GLOBAL
- 是否持久化到集群:是
- 默认值:`0`
- 默认值:`80%`
- 取值范围:
- 你可以将该变量值设为百分比格式,表示内存用量占总内存的百分比,取值范围为 `[1%, 99%]`
- 你还可以将变量值设为内存大小,取值范围为 `[0, 9223372036854775807]`,单位为 Byte。支持带单位的内存格式 "KB|MB|GB|TB"`0` 值表示不设内存限制。
Expand All @@ -2921,10 +2916,6 @@ EXPLAIN FORMAT='brief' SELECT COUNT(1) FROM t WHERE a = 1 AND b IS NOT NULL;
### `tidb_server_memory_limit_gc_trigger` <span class="version-mark">从 v6.4.0 版本开始引入</span>
> **警告:**
>
> `tidb_server_memory_limit_gc_trigger` 目前为实验性特性,不建议在生产环境中使用。
- 作用域:GLOBAL
- 是否持久化到集群:是
- 默认值:`70%`
Expand All @@ -2933,14 +2924,10 @@ EXPLAIN FORMAT='brief' SELECT COUNT(1) FROM t WHERE a = 1 AND b IS NOT NULL;
### `tidb_server_memory_limit_sess_min_size` <span class="version-mark">从 v6.4.0 版本开始引入</span>
> **警告:**
>
> `tidb_server_memory_limit_sess_min_size` 目前为实验性特性,不建议在生产环境中使用。
- 作用域:GLOBAL
- 是否持久化到集群:是
- 默认值:`134217728`(即 128 MB)
- 取值范围:`[128, 9223372036854775807]`单位 Byte。
- 取值范围:`[128, 9223372036854775807]`单位为 Byte。支持带单位的内存格式“KB|MB|GB|TB”
- 开启内存限制后,TiDB 会终止当前实例上内存用量最高的 SQL 语句。本变量指定此情况下 SQL 语句被终止的最小内存用量。如果 TiDB 实例的内存超限是由许多内存使用量不明显的会话导致的,可以适当调小该变量值,使得更多会话成为 Cancel 的对象。
### `tidb_shard_allocate_step` <span class="version-mark">从 v5.0 版本开始引入</span>
Expand Down
2 changes: 1 addition & 1 deletion tidb-configuration-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ TiDB 配置文件比命令行参数支持更多的选项。你可以在 [config/

> **警告:**
>
> `server-memory-quota` 目前为实验性特性,不建议在生产环境中使用
> 自 v6.5.0 起,该配置项被废弃。请使用 [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入) 系统变量进行设置
+ 设置 tidb-server 实例的最大内存用量,单位为字节。
+ 默认值:0
Expand Down
4 changes: 2 additions & 2 deletions troubleshoot-tidb-oom.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ TiDB 节点启动后需要加载统计信息到内存中。统计信息的收集
- `mem-quota-query`
- `oom-action`
- `tidb_enable_rate_limit_action`
- `server-memory-quota`
- `tidb_server_memory_limit`
- `oom-use-tmp-storage`
- `tmp-storage-path`
- `tmp-storage-quota`
Expand All @@ -189,7 +189,7 @@ TiDB 节点启动后需要加载统计信息到内存中。统计信息的收集
- 执行 `grep "tidb-server has the risk of OOM" tidb.log` 查看 TiDB Server 收集的告警文件路径,例如:
```shell
["tidb-server has the risk of OOM. Running SQLs and heap profile will be recorded in record path"] ["is server-memory-quota set"=false] ["system memory total"=14388137984] ["system memory usage"=11897434112] ["tidb-server memory usage"=11223572312] [memory-usage-alarm-ratio=0.8] ["record path"="/tmp/0_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA=/tmp-storage/record"]
["tidb-server has the risk of OOM. Running SQLs and heap profile will be recorded in record path"] ["is tidb_server_memory_limit set"=false] ["system memory total"=14388137984] ["system memory usage"=11897434112] ["tidb-server memory usage"=11223572312] [memory-usage-alarm-ratio=0.8] ["record path"="/tmp/0_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA=/tmp-storage/record"]
```
## 探索更多
Expand Down

0 comments on commit 4da9880

Please sign in to comment.