TIDB 两个节点内存飙升

289ms 是比较高的了。

我先整理一下思路吧。首先一开始的问题从日志上看就是每个节点之间的互联互通有问题,那么我想到如果每个节点之间的互通有问题,获取tso肯定会慢,就值得看看tso wait指标是否正常。tso wait这里现在看是个有优化空间的地方,不过很难说和原始内存升高的问题有多大的相关性。

默认的slow sql的阈值是300ms。tso wait需要289ms的意思就是,几乎所有的sql在默认设置下都会变成慢查询。很显然留给其他环节的时间必须小于11ms才会不进慢查询,这是很难做到的。

https://docs.pingcap.com/zh/tidb/stable/latency-breakdown/#通用-sql-层

在整个通用sql的阶段如上图所示。tso wait正常值应该也就20ms左右(对应着每个节点到pd leader的ping值小于1ms)。你现在这个值是偏高的。应该说大概率有个别节点到pd leader的ping值是大于10ms的。

以我的经验来说,tso wait一高,所有sql都慢。
建议检查一下其他节点到pd的ping值。另外部署的节点,最好不要跨子网,你上面的3个能看到ip的节点,分别是44.132,45.83,40.106。已经是3个pd/tidb节点跨了3个子网了。

grafana里面有个图可以看到ping值。黄框这个地方设置为你当前的pd leader。

这边IP都是在B类172的私网网段的,不算跨网络吧?ping值是有点高,平均在2ms左右



故障时候Tso很高,但一般也都在20ms下。

看前面那个pd日志,出现故障时是15:38 这边tso开始升高的地方是15:41,从这点看tso变高不是因反而是果吧?

1 个赞

ping值2ms左右,确实可以接受。

后面的结论我也同意是果不是因。是当时不能互通的一种佐证。我已经没什么思路了。这个oom的原因让人困惑。

https://docs.pingcap.com/zh/tidb/stable/system-variables/#tidb_schema_cache_size-从-v800-版本开始引入

tidb_schema_cache_size tidb_schema_version_cache_limit 这两个变量设置的是多少?

https://docs.pingcap.com/zh/tidb/stable/saas-best-practices/#缓存配置

我注意到infoschema是一块缓存,而且有明确的大小限制。不应该膨胀到4-5g。

https://docs.pingcap.com/zh/tidb/stable/schema-cache/#已知限制

已知限制里面也提到如果设置为0,表很多的情况下会导致oom。


印象中没配置过这些参数,应该是默认的吧
tidb_schema_cache_size:536870912
tidb_schema_version_cache_limit:16

你这确实是默认值,最大只有512Mb,但你这个图里面看怎么都不止512Mb。

起码3-4g了。bug的概率很高了。

再看看这个图吧,如果说这个图统计的内存占用和heap profiling也不对上,我感觉就是bug了。


看起来是512,其他时间段也都是512

1 个赞

有一个类似的issue。
里面提到,当有100w表的时候,执行下面这个语句,

select count(1) from information_schema.tables;

导致了oom。

感觉和这个问题很像。你可以自己判断一下是不是类似这种表或者information库下元数据非常多的场景。

进一步的问题在于修复。这个issue修复直接合到了master上,没有在8.5分支上合并,我对比了一下修复代码和8.5.2版本,确实这部分修复不在8.5分支上。
这也就造成了目前还没有可用的子版本,可以通过升级修复这个问题。

我理解上面issue问题是SQL占用内存超过tidb_mem_quota_query时,才可能触发的吧。


突然想起来,我们这边有500+张表的健康值低于50(这其中大半健康值为0),因为会频繁auto_analyze,所以有次优化把tidb_auto_analyze_ratio调整为0.95了。

可能是这块的问题不?

期望看到的是2,也就是select 可以被tidb_mem_quota_query限制住。

实际结果是3,tidb oom了。

如果是auto_analyze的问题,应该只有ddl owner会oom。也就是说只会有一个tidb节点内存升高,不会是2个tidb节点都升高。

空region有点多是个问题,但我感觉和这个内存的问题关系不大。

多条日志中出现了 context canceled 错误,这通常表示某个请求或任务在执行过程中被取消了。这种情况可能是因为客户端超时、服务器资源不足(如内存耗尽)或者其他原因导致的。

aws ECS购买的带宽/iops这种指标是多大的,印象是要单独买。

tidb几台都是c5.4xlarge规格
tikv是c5a.8xlarge规格

断开这种情况可能是有多,业务上有查询超时相关的设定,可能会断开。

这边慢SQL里看auto_analyze,有运行几分钟的。如果不是这方面导致的,目前版本BUG的可能性比较大吧?

1 个赞

我现在感觉就是上面那个bug。

感谢您的帮助。
目前这种这个问题,除了升级外,有啥临时规避措施嘛?

不,你还是仔细阅读一下我上面的关于bug的那个帖子。

如果确定是扫描information_schema下的表,引起的oom。
我判断你这个问题和这个issue相关,主要是你之前发的帖子里面提到有频繁的ddl,所以我怀疑你的information_schema下的元数据会比较多。如果对这些数据做扫描,极有可能触发这个bug。不过这个推断目前还没有得到你的证实。

而且现在问题棘手的地方就在于,没有可用的LTS分支包含这个修复。
那个issue下的修复是合并在master分支上的,生产环境不太可能从master分支做修复的。还要等这个修复合并到8.5分支上去,才有可用的LTS子版本用。


这边information_schema没有那么大数据量,可能是某种新问题

1 个赞

确实不像了。