在tidb-server服务出现内存快要消耗怠尽时,对tidb-server有没有快速回收内存的办法或参数?

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
在tidb-server服务出现内存快要消耗怠尽时,对tidb-server有没有快速回收内存的办法或参数?


【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

同问!


研发人员反馈,tidb-server服务器的总内存为:94.3 GiB,
参数: tidb_server_memory_limit配置:内存限制是64G ,
tidb_server_memory_limit_gc_trigger:0.9,触发GC应该在64*0.9=57.6g
为啥会跑到70多G最终才导致OOM,实例重启

TiDB-Server的内存统计不是很准,有些场景的内存会统计不到,最好是用Cgroup从操作系统限制,不过一旦限制后,那就是tidb-server会触发操作系统的OOM Kill,导致服务重启了

另外TiDB在终止SQL时候,是逐个处理的,如果处理速度赶不上增加速度,还是可能会超过限制的。
同理GC也是有速度的,可以看文档说明: 该 GC 方式 1 分钟最多只会触发 1 次。

1 个赞

https://docs.pingcap.com/zh/tidb/v7.3/configure-memory-usage#如何配置-tidb-server-实例使用内存的阈值

详细可以看下这个文档

没办法回收内存 只能限制大内存sql

tidb_mem_quota_query这个参数设置的多少?

https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage#设置环境变量-gomemlimit-缓解-oom-问题

GOMEMLIMIT 这个参数值得尝试。

能用的手段都用上吧。

1 个赞

解决问题的核心还是要优化消耗资源大的sql,业务上不能优化的话可以考虑上tiflash。
最后如果是钱能解决的问题都不是问题,赶紧扩容tidb。

单个sql15G啊,你这随便来几个并发大sql直接就把tidb干停了,我觉得你还是先找下大sql优化下吧

没有什么好办法,参数调整只能选择kill掉sql或者tidb server自己。
根本解决办法还是要解决sql内存占用

这个给的真猛,哈哈哈。还是改小一点吧

期待能有回收内存的参数,关键设置了 tidb_mem_quota_query也没用呀,没有sql执行没有任何连接之后,这些内存也不释放 :sob: :joy: :sweat_smile:

设置查询的最大内存

是6.5吗,6.5限制比较好

TiDB应该会自动会回收的,确定是connection也都释放了么?执行下下面的SQL,看下对应INSTANCE还有没有遗留的大事务没有释放

select INSTANCE,START_TIME,SESSION_ID,USER,STATE from INFORMATION_SCHEMA.CLUSTER_TIDB_TRX order by START_TIME;

基于6.5而言没有彻底的解决办法,挡不住持续的大量慢SQL。只能是通过top-sql具体案例具体分析,找到当时哪些SQL导致的OOM,让业务优化一下。
彻底解决办法,可以期待资源管控的自动限流。不过7.1的资源管控的功能也比较少,也不支持。7.2的资源管控倒是能解决,但是不是LTS版本,至少得等到年底的7.5 LTS版本上线了。可以先看下7.3的资源管控功能,已经可以做到自动slowdown/block同一类型的慢查询了
https://docs.pingcap.com/zh/tidb/v7.3/tidb-resource-control#管理资源消耗超出预期的查询-runaway-queries

1 个赞

上面截图那个实例重启过了,换了一个tidb-server, 版本v5.2.2