TiDB 其中一个节点的内存会不断增长

【TiDB 使用环境】生产环境
【TiDB 版本】v8.5.1
【操作系统】Linux
【部署方式】AWS tiup部署,使用LB负载转发给3个tidb 4000端口,负载方式是: 轮询。
【集群数据量】300~500G
【集群节点数】3个tidb/pd(tidb与pd在一个节点)、3个tikv、3个tiflash
【问题复现路径】曾经5个tidb/pd节点,下线两个节点。看图表是下线后出现某个tidb内存会不断增高,一直到当前机器的80%被OOM。后来剩下的3个tidb节点内存、CPU都升级过一波(目前16C 64G)。
【遇到的问题:问题现象及影响】3个tidb节点,总会出现一个tidb节点内存飙升的现象。重启该tidb节点后,又会在另外一台机器上出现内存飙升的现象。循环往复,如果这个内存异常的tidb节点运行一天左右,此时CPU会在25%~100%之间稳定波动。
【资源配置】

【复制黏贴 ERROR 报错的日志】

[2025/04/16 02:59:12.511 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.677 +00:00] [ERROR] [distsql.go:1567] ["table reader fetch next chunk failed"] [conn=1562326922] [session_alias=] [error="context canceled"]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [distsql.go:1567] ["table reader fetch next chunk failed"] [conn=1562313788] [session_alias=] [error="context canceled"]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [distsql.go:1567] ["table reader fetch next chunk failed"] [conn=1562313788] [session_alias=] [error="context canceled"]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.679 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [distsql.go:1567] ["table reader fetch next chunk failed"] [conn=1562326936] [session_alias=] [error="context canceled"]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [distsql.go:1567] ["table reader fetch next chunk failed"] [conn=1562326936] [session_alias=] [error="context canceled"]
[2025/04/16 02:59:12.693 +00:00] [ERROR] [select_result.go:562] ["invalid cop task execution summaries length"] [expected=1] [received=0]

【其他附件:截图/日志/监控】






这边通过趋势图可以看到,始终有个tidb节点内存飙升,跑挂或重启后又会换成其他tidb节点复现该问题。排查处理过程:

  1. 短暂停过大并发的业务,看不到效果。
  2. kill长连接进程,看不到效果。
  3. 调整auto_analyze相关配置,看不到效果。
  4. 重启故障节点的tidb后,把最新的故障节点的tidb剔除负载(持续一段时间后,kill该节点的数据库连接,此时该节点基本没有外部连接了),看不到效果。

这个问题困扰好几天了,实在找不到解决方案了,论坛里的要么版本和我们差很多,要么问题类型不一样,麻烦好心大佬帮忙看看吧 在此感谢 :pray:

select * from information_schema.cluster_processlist 看看这个节点上在运行什么大sql

感谢解答,我查询了该节点的当前连接进程,MEM最大134209536,也就100+MB。
总体占用很小。

1 个赞

:thinking:是内存占用高的时候查的么?那会不会是节点服务器上其他程序使用的内存?不一定是tidb使用的内存?

是在内存高的时候查的,准确说这个机器内存一直很高。这个机器上主要两个进程,一个pd、一个tidb。可以明确看到tidb进程占用的40+G,太头疼了。

dashboard 这个监控里面有个流量可视化,看看有没有明显的亮点,分别看看读取量,写入量

这个问题节点的读取量和写入量怎么样?和其它正常节点对比下

刚刚我们在负载上,已经剔除了这个内存高的节点


正在上传:img_v3_02ld_c7401f5d-1a1d-49bc-a989-fabe55e0b3ix.jpg…

可以确定不是外部连接导致的,这块有没有可能是tidb内存某个地方内存泄露?
前面分析内存里github.com/pingcap/tidb/pkg/util/chunk.(*Chunk).AppendBytes 占用24G是在做什么呢?

我们重启了故障节点,然后又在负载上剔除了新的故障节点,可以看到故障节点内存还是很高,流量是可以看到比较明显的减小

每秒100多兆。这个速度 对于你们的业务来说是正常的吗
还有最好吧PD和tidb 分开,这两个不需要多大的存储空间只要200G就够了。

我们读、写业务类型是比较多,这个100多兆也只是瞬时值,会有高低波动,总体算是正常的。PD和TiDB部署在一起会有啥异常嘛?这块是出于成本考虑才这样部署的,我们还有个tidb 7.5的集群也是类似架构,长期使用没啥问题。

哦瞬间值那还行。一起部署没什么异常,只是机器故障会减少损失,如果这3台其中一台坏了。你需要修复的是PD+TIDB两个服务器了。pd-leader和tidb server同一个服务器他的资源占用肯定会多点。

剔除故障节点的负载后
内存波动图:

CPU波动图:

这个服务器资源监控图中,内存高的tidb服务器,反而读写负载、cpu使用率这些更低?

你看看这个内存飙高的机器是不是ddl owner

https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-show-ddl/#admin-show-ddl

我看这个profilling像是ddl onwer在做auto analyze,然后analyze的表里面有个json字段。导致的内存飙高。

1 个赞

本身tidb三个节点的服务器性能已经加到较高了(超过业务平时使用情况2倍),而且从连接负载剔除了故障节点,所以不会有外部连接直连到故障节点。当前普通tidb节点机器CPU、内存都在20%以下,故障机器内存始终很高、CPU规律性飙升再降低。这现象太奇怪了。

确实是ddl owner,目前观察的现象故障节点都是ddl owner。但是集群默认 tidb_analyze_skip_column_types就是json,blob,mediumblob,longblob,mediumtext,longtext,text

我们这边有300+张表的Healthy小于50(默认auto analyze触发阈值),那时候看到auto analyze触发很频繁。之前也怀疑是这方面的原因,把阈值从50调整到95,且在固定22~24点。看了analyze历史记录,确实是22~24点才触发auto analyze的。

但是这边除了集群auto analyze的,也有业务频繁truncate table或其他操作导致的analyze表。我不确定因truncate导致的analyze表是否会忽略tidb_analyze_skip_column_types配置。

1 个赞

这个问题在7.x版本以下确实有一些反馈,在8.5这个版本上不太应该有这个问题。

我有点怀疑是不是有些连接,在seesion级改过这个变量。

不过8.5版本也有一些方法对付这个问题。
首先是假如是个analyze的话,这个analyze应该是会进慢查询的。不太可能什么都找不到。
然后就是8.5的资源管控是可以控制后台任务的资源占用的。可以考虑给这些后台任务加个资源组。这样运行的时间无非是长一些,不至于影响整体的系统稳定性。

https://docs.pingcap.com/zh/tidb/stable/tidb-resource-control-background-tasks/#使用资源管控-resource-control-管理后台任务

1 个赞

我们是TiDB组件有内存问题,我看这个功能是控制tikv组件资源的。

1 个赞

资源管控确实偏向tikv多一些。

不过,这里distsql就是去tikv上取的数据。你控制tikv的读取速度,有希望间接控制。算是个不是办法的办法。

另外就是慢查询里面找不到可疑的analyze?
如果还是慢查询里面没有,也可以尝试等内存飙高的时候去topsql界面看看。

https://docs.pingcap.com/zh/tidb/stable/top-sql/#tidb-dashboard-top-sql-页面