目前 TiDB 已经能够做到追踪单条 SQL 查询过程中的内存使用情况,当内存使用超过一定阈值后也能采取一些操作来预防 OOM 或者排查 OOM 原因。你可以使用系统变量 tidb_mem_oom_action 来控制查询超过内存限制后所采取的操作:
- 如果变量值为
LOG
,那么当一条 SQL 的内存使用超过一定阈值(由 session 变量tidb_mem_quota_query
控制)后,这条 SQL 会继续执行,但 TiDB 会在 log 文件中打印一条 LOG。 - 如果变量值为
CANCEL
,那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 SQL 的执行,并给客户端返回一个错误,错误信息中会详细写明在这条 SQL 执行过程中占用内存的各个物理执行算子的内存使用情况。
如何配置一条 SQL 执行过程中的内存使用阈值
使用系统变量 tidb_mem_quota_query 来配置一条 SQL 执行过程中的内存使用阈值,单位为字节。例如:
配置整条 SQL 的内存使用阈值为 8GB:
SET tidb_mem_quota_query = 8 << 30;
配置整条 SQL 的内存使用阈值为 8MB:
SET tidb_mem_quota_query = 8 << 20;
配置整条 SQL 的内存使用阈值为 8KB:
SET tidb_mem_quota_query = 8 << 10;
如何配置 tidb-server 实例使用内存的阈值
可以在配置文件中设置 tidb-server 实例的内存使用阈值。相关配置项为 server-memory-quota 。
例如,配置 tidb-server 实例的内存使用总量,将其设置成为 32 GB:
[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,表示无内存限制。
tidb-server 内存占用过高时的报警
默认配置下,tidb-server 实例会在机器内存使用达到总内存量的 80% 时打印报警日志,并记录相关状态文件。该内存使用率可