TiDB 节点内存持续飙升,频繁触发 OOM 被系统杀死故障

线上 TiDB Server 节点运行一段时间后内存占用不断上涨,无大批量导入、全表扫描业务,简单查询也会缓慢堆内存,最终进程因内存溢出被操作系统终止,切换其他 TiDB 节点业务可临时恢复,内存参数为默认配置。

你这个 TiDB Server 节点持续内存上涨最终 OOM 的问题,大概率是默认内存管控机制未开启、或会话级内存未及时释放导致的。建议先开启 TiDB 进程级内存保护,设置 tidb_server_memory_limit 为服务器物理内存的 70%~80%(如 SET GLOBAL tidb_server_memory_limit="32GB"),让 TiDB 在内存接近上限时主动终止高内存 SQL,避免被系统直接杀死;同时排查是否存在长时间未释放的事务 / 会话(如连接池泄漏、应用未关闭会话),可通过 SHOW PROCESSLIST 检查空闲会话,调整 wait_timeout 清理闲置连接;另外开启 oom-use-tmp-storage 配置,让内存超限的排序 / 聚合操作落盘执行,减少内存堆积;如果是 TiDB 版本较旧,也可能存在 GC 或内存泄漏的已知问题,建议升级到稳定版或定期采集 heap profile 定位内存热点,再针对性优化。

上线必配置tidb_server_memory_limit,不裸跑默认参数;
中间件 / 应用规范连接池回收逻辑;
低版本集群择机升级修复已知内存泄漏缺陷;
监控面板配置 TiDB 内存使用率告警,提前预警上涨趋势。

1、是否混布,各组件内存参数设置不合理超过了系统内存导致的;
2、连接数未限制,会话占用太多内存;
3、监控占用内存过多的SQL;

应该是大事务或者回滚导致的,可以优先在日志面板中搜索一下,组件选择tidb节点,关键字输入ttl manager,如图所示:

然后再结合如下链接,整体排查试试

排查内存泄漏、会话连接堆积、临时对象未释放,调优内存相关参数,清理闲置会话。

tidb_mem_quota_query限制单条查询内存使用。

TiDB不支持算子磁盘spill(TiFlash除外),内存预估要留buffer。

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