Skip to content

Commit

Permalink
add doc for record OOM alarm (pingcap#11577)
Browse files Browse the repository at this point in the history
  • Loading branch information
mengxin9014 authored Nov 7, 2022
1 parent 458604c commit 870b8e6
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 31 deletions.
38 changes: 29 additions & 9 deletions configure-memory-usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,20 +97,40 @@ SET GLOBAL tidb_server_memory_limit = "32GB";

## tidb-server 内存占用过高时的报警

默认配置下,tidb-server 实例会在机器内存使用达到总内存量的 80% 时打印报警日志,并记录相关状态文件。该内存使用率可以通过系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 进行设置。具体报警规则请参考该变量的说明部分
tidb-server 实例的内存使用量超过内存阈值(默认为总内存量的 70%)且满足以下任一条件时,TiDB 将记录相关状态文件,并打印报警日志

注意,当触发一次报警后,只有在内存使用率连续低于阈值超过 10 秒并再次达到阈值时,才会再次触发报警。此外,为避免报警时产生的状态文件积累过多,目前只会保留最近 5 次报警时所生成的状态文件。
- 第一次内存使用量超过内存阈值。
- 内存使用量超过内存阈值,且距离上一次报警超过 60 秒。
- 内存使用量超过内存阈值,且 `(本次内存使用量 - 上次报警时内存使用量) / 总内存量 > 10%`

你可以通过系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 修改触发该报警的内存使用比率,从而控制内存报警的阈值。

当触发 tidb-server 内存占用过高的报警时,TiDB 的报警行为如下:

- TiDB 将以下信息记录到 TiDB 日志文件 [`filename`](/tidb-configuration-file.md#filename) 所在目录中。

- 当前正在执行的所有 SQL 语句中内存使用最高的 10 条语句和运行时间最长的 10 条语句的相关信息
- goroutine 栈信息
- 堆内存使用状态

- TiDB 将输出一条包含关键字 `tidb-server has the risk of OOM` 以及以下内存相关系统变量的日志。

- [`tidb_mem_oom_action`](/system-variables.md#tidb_mem_oom_action-从-v610-版本开始引入)
- [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query)
- [`tidb_server_memory_limit`](/system-variables.md#tidb_server_memory_limit-从-v640-版本开始引入)
- [`tidb_analyze_version`](/system-variables.md#tidb_analyze_version-从-v510-版本开始引入)
- [`tidb_enable_rate_limit_action`](/system-variables.md#tidb_enable_rate_limit_action)

为避免报警时产生的状态文件累积过多,目前 TiDB 默认只保留最近 5 次报警时所生成的状态文件。你可以通过配置系统变量 [`tidb_memory_usage_alarm_keep_record_num`](/system-variables.md#tidb_memory_usage_alarm_keep_record_num-从-v640-版本开始引入) 调整该次数。

下例通过构造一个占用大量内存的 SQL 语句触发报警,对该报警功能进行演示:

1. 配置报警比例为 `0.8`
1. 配置报警比例为 `0.85`

{{< copyable "" >}}

```toml
mem-quota-query = 34359738368
[instance]
tidb_memory_usage_alarm_ratio = 0.8
```sql
SET GLOBAL tidb_memory_usage_alarm_ratio = 0.85;
```

2. 创建单表 `CREATE TABLE t(a int);` 并插入 1000 行数据。
Expand All @@ -120,7 +140,7 @@ SET GLOBAL tidb_server_memory_limit = "32GB";
4. 检查 `tidb.log` 文件,其中会记录系统总内存、系统当前内存使用量、tidb-server 实例的内存使用量以及状态文件所在目录。

```
[2020/11/30 15:25:17.252 +08:00] [WARN] [memory_usage_alarm.go:141] ["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"=33682427904] ["system memory usage"=27142864896] ["tidb-server memory usage"=22417922896] [memory-usage-alarm-ratio=0.8] ["record path"="/tmp/1000_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA=/tmp-storage/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 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]
```

以上 Log 字段的含义如下:
Expand All @@ -132,7 +152,7 @@ SET GLOBAL tidb_server_memory_limit = "32GB";
* `memory-usage-alarm-ratio`:表示系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 的值
* `record path`:表示状态文件存放的目录

5. 通过访问状态文件所在目录(该示例中的目录为 `/tmp/1000_tidb/MC4wLjAuMDo0MDAwLzAuMC4wLjA6MTAwODA=/tmp-storage/record`),可以得到一组文件,其中包括 `goroutinue`、`heap`、`running_sql` 3 个文件,文件以记录状态文件的时间为后缀。这 3 个文件分别用来记录报警时的 goroutine 栈信息,堆内存使用状态,及正在运行的 SQL 信息。其中 `running_sql` 文件内的日志格式请参考 [`expensive-queries`](/identify-expensive-queries.md)。
5. 通过访问状态文件所在目录(该示例中的目录为 `/tiup/deploy/tidb-4000/log/oom_record`),可以看到标记了记录时间的 record 目录(例:`record2022-10-09T17:18:38+08:00`),其中包括 `goroutinue``heap``running_sql` 3 个文件,文件以记录状态文件的时间为后缀。这 3 个文件分别用来记录报警时的 goroutine 栈信息,堆内存使用状态,及正在运行的 SQL 信息。其中 `running_sql` 文件内容请参考 [`expensive-queries`](/identify-expensive-queries.md)。

## tidb-server 其它内存控制策略

Expand Down
22 changes: 18 additions & 4 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -2060,10 +2060,24 @@ v5.0 后,用户仍可以单独修改以上系统变量(会有废弃警告)
### `tidb_memory_usage_alarm_ratio`
- 作用域:GLOBAL
- 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
- 默认值:`0.8`
- TiDB 内存使用占总内存的比例超过一定阈值时会报警。该功能的详细介绍和使用方法可以参考 [`tidb_memory_usage_alarm_ratio`](/tidb-configuration-file.md#tidb_memory_usage_alarm_ratio)。
- 该变量的初始值可通过 [`tidb_memory_usage_alarm_ratio`](/tidb-configuration-file.md#tidb_memory_usage_alarm_ratio) 进行配置。
- 是否持久化到集群:是
- 默认值:`0.7`
- 范围:`[0.0, 1.0]`
- 这个变量用于设置触发 tidb-server 内存告警的内存使用比率。默认情况下,当 TiDB 内存使用量超过总内存的 70% 且满足[报警条件](/configure-memory-usage.md#tidb-server-内存占用过高时的报警)时,TiDB 会打印报警日志。
- 当配置该变量的值为 `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_memory_usage_alarm_keep_record_num` <span class="version-mark">从 v6.4.0 版本开始引入</span>
- 作用域:GLOBAL
- 是否持久化到集群:是
- 默认值:`5`
- 范围:`[1, 10000]`
- 当 tidb-server 内存占用超过内存报警阈值并触发报警时,TiDB 默认只保留最近 5 次报警时所生成的状态文件。你可以通过该变量调整该次数。
### `tidb_merge_join_concurrency`
Expand Down
18 changes: 0 additions & 18 deletions tidb-configuration-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,15 +383,6 @@ TiDB 配置文件比命令行参数支持更多的选项。你可以在 [config/
+ 默认值:0
+ 默认值为 0 表示无内存限制。

### `memory-usage-alarm-ratio` <span class="version-mark">从 v4.0.9 版本开始引入</span>

+ tidb-server 实例内存使用占总内存的比例超过一定阈值时会报警。该配置项的有效范围为 `0``1`。如果配置该选项为 `0``1`,则表示关闭内存阈值报警功能。
+ 默认值:0.8
+ 当内存阈值报警功能开启时,如果配置项 [`server-memory-quota`](/tidb-configuration-file.md#server-memory-quota-从-v409-版本开始引入) 未设置,则内存报警阈值为 `memory-usage-alarm-ratio * 系统内存大小`;如果 `server-memory-quota` 被设置且大于 0,则内存报警阈值为 `memory-usage-alarm-ratio * server-memory-quota`
+ 当 TiDB 检测到 tidb-server 的内存使用超过了阈值,则会认为存在内存溢出的风险,会将当前正在执行的所有 SQL 语句中内存使用最高的 10 条语句和运行时间最长的 10 条语句以及 heap profile 记录到目录 [`tmp-storage-path/record`](/tidb-configuration-file.md#tmp-storage-path) 中,并输出一条包含关键字 `tidb-server has the risk of OOM` 的日志。
+ 该值作为系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 的初始值。
+ 自 v6.1.0 起,已改用配置项 [`instance.tidb_memory_usage_alarm_ratio`](/tidb-configuration-file.md#tidb_memory_usage_alarm_ratio) 或系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 来设置 tidb-server 实例内存使用占总内存比例的报警阈值。`memory-usage-alarm-ratio` 仍可使用,但如果同时设置了 `memory-usage-alarm-ratio``instance.tidb_memory_usage_alarm_ratio`,TiDB 将采用 `instance.tidb_memory_usage_alarm_ratio` 的值。

### `txn-entry-size-limit` <span class="version-mark">从 v5.0 版本开始引入</span>

+ TiDB 单行数据的大小限制
Expand Down Expand Up @@ -772,15 +763,6 @@ TiDB 服务状态相关配置。
+ 该值作为系统变量 [`max_connections`](/system-variables.md#max_connections) 的初始值。
+ 在 v6.2.0 之前,该功能通过配置项 `max-server-connections` 进行设置。

### `tidb_memory_usage_alarm_ratio`

+ tidb-server 实例内存使用占总内存的比例超过一定阈值时会报警。该配置项的有效范围为 `0``1`。如果配置该选项为 `0``1`,则表示关闭内存阈值报警功能。
+ 默认值:0.8
+ 当内存阈值报警功能开启时,如果配置项 [`server-memory-quota`](/tidb-configuration-file.md#server-memory-quota-从-v409-版本开始引入) 未设置,则内存报警阈值为 `tidb_memory_usage_alarm_ratio * 系统内存大小`;如果 `server-memory-quota` 被设置且大于 0,则内存报警阈值为 `tidb_memory_usage_alarm_ratio * server-memory-quota`
+ 当 TiDB 检测到 tidb-server 的内存使用超过了阈值,则会认为存在内存溢出的风险,会将当前正在执行的所有 SQL 语句中内存使用最高的 10 条语句和运行时间最长的 10 条语句以及 heap profile 记录到目录 [`tmp-storage-path/record`](/tidb-configuration-file.md#tmp-storage-path) 中,并输出一条包含关键字 `tidb-server has the risk of OOM` 的日志。
+ 该值作为系统变量 [`tidb_memory_usage_alarm_ratio`](/system-variables.md#tidb_memory_usage_alarm_ratio) 的初始值。
+ 在版本 v6.1.0 之前,该功能通过配置项 `memory-usage-alarm-ratio` 进行设置。

### `tidb_enable_ddl`

+ 用于表示该 tidb-server 是否运行 DDL 语句。
Expand Down

0 comments on commit 870b8e6

Please sign in to comment.