如何有效防止TiDB Server重启

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

  • 【TiDB 版本】:3.0.9
  • 【问题描述】: TiDB-Server有64GB GC有10分钟的限制; mem-quota-query=5GB 同时只有一个查询,TiDB-Server能占用到50GB,提示超过内存限制; 然后还没有进行GC前,再查询一次,TiDB就OOM被linux kill掉重启了

如何防止重启

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

除了这个参数意外以外,还需要设置一个 oom-action 参数配合着用。

恩,这个设置成为cancel,但连续执行sql,第一次会触发cancel,第二次tidb就整体oom了

如果等待10分钟下次GC之后,再执行就行

:handshake::handshake:

所以这个问题怎么解决呀: 10分钟内,连续执行sql,即使有cancel配置,也会让tidb-server OOM被kill掉

请问下,是什么样的 sql ,可以根据执行计划看下是否还有可优化空间

另外这个问题,猜测是可能存在多个同样的大 SQL,其他的 SQL 还在做运算,数据还没有全部到内存里面,导致内存逐渐涨到内存撑满。可以从业务层面排查下是否有其他 sql 并发执行导致 OOM。

是OLAP场景的sql语句,十亿级别表的group order,在没有用tispark和tiflash前,先用tidb-server查询的

我们测试后的时候确认同一时刻只有一个人在操作,一个sql在运行,现象是: 一次gc内(十分钟内)执行两次,第一次提示cancel,第二次就会OOM被kill 如果间隔10分钟执行两次,就不会OOM

目的是: 在保证同一时刻只有一个sql运行的情况下,如何保证tidb-server不重启

场景:

  1. 我们的离线pipeline会共享几个链接,持续点查tidb,查询语句占用资源很少
  2. 期间也需要做一些大的统计分析查询,但这个行为可控,数据人员能保证只有一个大型分析sql在运行;但如果因为这个导致tidb-server重启,1的连接就会断掉,pipeline运行中断

语句参考: select jra.entity_type, jra.entity_value, count(distinct jra.xzqh) as xzqh_count, count(distinct jra.jq_id) as jq_id_count, MIN(jra.jq_id) as jqbh FROM jingqing_related_all jra group by jra.entity_type,jra.entity_value order by xzqh_count desc,jq_id_count desc limit 1000

  1. 确认 jingqing_related_all 表中的数据是否是持续变化的那种 ,举个例子 第一次提示cancel,第二次执行前,数据量是否是恒定的 ?
  2. 确认第一次和第二次操作间隔是多久 ?

这个和 TiDB 中的 GC 没有关系,可能和 Go 的 GC 有关系,但是 Go 的 GC 是很快的,如果操作完成,应该会在秒级别释放空间。所以要明确执行间隔,第一次 cancel 以后,第二次什么时间执行的。

  1. 提供监控数据,TiDB 的监控页面有一个 memory 监控,可以再复现一下问题,然后将 Memory 监控栏的监控截图发出来。

这个是在互联网我们的测试环境,执行了一个sql select bjsj, SUBSTR(JQBH, 1, 3), count(distinct JQBH) from delta_jingqing_billion.jingqing_table group by bjsj, SUBSTR(JQBH, 1, 3);

执行用了289秒,返回正常,但是内存下降的很慢,这个正常嘛,我们马上再试一下连续执行

OK,最好将完整的测试情况反馈出来,比如操作时间点,现象和返回的结果,监控的 memory 完整的内存。

您好:

我这边测试了一下,看到同一个session里,同一条sql是可以连续被cancel的,请问您这边可以复现问题吗?

mysql> select a.id,b.id,count(*) from sbtest1 a, sbtest1 b group by a.id,b.id order by a.id limit 10; ERROR 1105 (HY000): Out Of Memory Quota![conn_id=5]

mysql> select a.id,b.id,count(*) from sbtest1 a, sbtest1 b group by a.id,b.id order by a.id limit 10; ERROR 1105 (HY000): Out Of Memory Quota![conn_id=5]

mysql> select a.id,b.id,count(*) from sbtest1 a, sbtest1 b group by a.id,b.id order by a.id limit 10; ERROR 1105 (HY000): Out Of Memory Quota![conn_id=5]

是在中控机/conf/tidb.yml 修改了 oom-action = “cancel” 和 mem-quota-query ,并且滚动重启了tidb吗?