TiDB 内存控制文档

目前 TiDB 已经能够做到追踪单条 SQL 查询过程中的内存使用情况,当内存使用超过一定阈值后也能采取一些操作来预防 OOM 或者排查 OOM 原因。在 TiDB 的配置文件中,我们可以使用如下配置来控制内存使用超阈值时 TiDB 的行为:

# Valid options: ["log", "cancel"]
oom-action = "log"
  • 如果上面的配置项使用的是 “log”,那么当一条 SQL 的内存使用超过一定阈值(由 session 变量 tidb_mem_quota_query 来控制)后,TiDB 会在 log 文件中打印一条 LOG,然后这条 SQL 继续执行,之后如果发生了 OOM 可以在 LOG 中找到对应的 SQL。
  • 如果上面的配置项使用的是 “cancel”,那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 SQL 的执行并给客户端返回一个 error,error 信息中会详细写明这条 SQL 执行过程中各个占用内存比较多的物理执行算子的内存使用情况。

如何配置一条 SQL 执行过程中的内存使用阈值

可以在配置文件中设置每个 Query 默认的 Memory Quota,例如将其设置为 32GB:

mem-quota-query = 34359738368

此外还可通过如下几个 session 变量来控制一条 Query 中的内存使用,大多数用户只需要设置 tidb_mem_quota_query 即可,其他变量是高级配置,大多数用户不需要关心:

变量名 作用 单位 默认值
tidb_mem_quota_query 配置整条SQL的内存使用阈值 Byte 32<<30
tidb_mem_quota_hashjoin 配置HashJoin的内存使用阈值 Byte 32<<30
tidb_mem_quota_mergejoin 配置MergeJoin的内存使用阈值 Byte 32<<30
tidb_mem_quota_sort 配置Sort的内存使用阈值 Byte 32<<30
tidb_mem_quota_topn 配置TopN的内存使用阈值 Byte 32<<30
tidb_mem_quota_indexlookupreader 配置IndexLookupReader的内存使用阈值 Byte 32<<30
tidb_mem_quota_indexlookupjoin 配置IndexLookupJoin的内存使用阈值 Byte 32<<30
tidb_mem_quota_nestedloopapply 配置NestedLoopApply的内存使用阈值 Byte 32<<30

几个使用例子:

-- 配置整条 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;

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""