暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiDB 内存控制

原创 wzf0072 2023-05-27
592

TiDB 内存控制

TiDB 能够做到追踪单条 SQL 查询过程中的内存使用情况,当内存使用超过一定阈值后也能采取一些操作来预防 OOM 或者排查 OOM 原因。你可以使用系统变量 tidb_mem_oom_action 来控制查询超过内存限制后所采取的操作:

如果变量值为 LOG,那么当一条 SQL 的内存使用超过一定阈值(由 session 变量 tidb_mem_quota_query 控制)后,这条 SQL 会继续执行,但 TiDB 会在 log 文件中打印一条 LOG。

如果变量值为 CANCEL,那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 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 实例使用内存的阈值配置

自 v6.5.0 版本起,可以通过系统变量 tidb_server_memory_limit 设置 tidb-server 实例的内存使用阈值。

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

SET GLOBAL tidb_server_memory_limit = "32GB";

设置该变量后,当 tidb-server 实例的内存用量达到 32 GB 时,TiDB 会依次终止正在执行的 SQL 操作中内存用量最大的 SQL 操作,直至 tidb-server 实例内存使用下降到 32 GB 以下。被强制终止的 SQL 操作会向客户端返回报错信息 Out Of Memory Quota!

当前 tidb_server_memory_limit 所设的内存限制不终止以下 SQL 操作:

  • DDL 操作
  • 包含窗口函数和公共表表达式的 SQL 操作


警告

  • TiDB 在启动过程中不保证 tidb_server_memory_limit 限制生效。如果操作系统的空闲内存不足,TiDB 仍有可能出现 OOM。你需要确保 TiDB 实例有足够的可用内存。
  • 在内存控制过程中,TiDB 的整体内存使用量可能会略微超过 tidb_server_memory_limit 的限制。
  • server-memory-quota 配置项自 v6.5.0 起被废弃。为了保证兼容性,在升级到 v6.5.0 或更高版本的集群后,tidb_server_memory_limit 会继承配置项 server-memory-quota 的值。如果集群在升级至 v6.5.0 或更高版本前没有配置 server-memory-quotatidb_server_memory_limit 会使用默认值,即 80%

在 tidb-server 实例内存用量到达总内存的一定比例时(比例由系统变量 tidb_server_memory_limit_gc_trigger 控制), tidb-server 会尝试主动触发一次 Golang GC 以缓解内存压力。为了避免实例内存在阈值上下范围不断波动导致频繁 GC 进而带来的性能问题,该 GC 方式 1 分钟最多只会触发 1 次。






「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论