tidb-server 对于 SQL 的内存占用限制

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.8
  • 【问题描述】:tidb当前对于sql占用的内存限制貌似是mem-quota-query这种硬限制,超过限制就被取消执行操作的这种硬限制,对于一些本身就比较大的消耗内存的查询,有什么办法可以解决吗?而不是直接把该sql查询杀死,既能避免tidb-server触发的操作系统出现oom,也不杀掉正在执行的sql

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

您好,

  1. mem-quota-query 可以根据目前服务器的内存进行设置
  2. 该参数也需要和 oom-action=cancel 配合使用,避免 tidb server 出现 oom。
    image

您好: 对于您说的这种情况,当前的方法就是使用cancel,在日志里记录这个大sql,方便之后来优化sql。 不可能说这个sql又要不杀掉,又要不OOM,你总要选择一种方式,优化sql是关键,或者增加tidb的内存,保证所有的sql,都不会超过内存最大值

您好,我的意思是说类似于mysql的innodb_buffer_pool这种,我测试同样的数据和sql在低配置mysql服务器里设置了innodb_buffer_pool等内存限制使用之后就不会出现sql被杀死且oom问题,但是tidb里这种情况就只能做做内存限制超过即kill掉,要不只能等着被oom

您好,

对于超过参数限制的语句 kill 操作其实是预期的。

tidb-server oom 可以通过上面提到的两个参数进行限制,防止 tidb oom。

谢谢~

感谢回复,如有问题,可开新帖哦~

Hi @rongyilong-PingCAP,TiDB 4.0 RC 版本已经发布了,可以试试。我们在这个版本中默认支持了部分算子(比如 Hash Join)的中间结果落盘,这时候可以在不杀掉 SQL,也不过多使用系统内存的情况下执行完该 SQL 了。不过因为中间结果落盘了,执行性能会有所损失。

2 个赞

好的 赞

:call_me_hand:

比如,这种情况,都是批量写入,内存足够多,64g,tidb节点不间断的oom,有没有办法加快上次insert占用的缓存内存呢,加快gc释放回收?

此问题久远,可以开新帖继续帮你看下

问题的根因应该是 tidb oom,向你所描述的,在内存充足的情况下 tidb-server 不会被 oom,可以看下是否同时间有其他语句执行。insert into 形式可以写成如下。

begin;
insert into xx values(),(),()...;   
commit;

我开个新贴吧。

ok/·

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。