TiKV 内存一直增长

【 TiDB 使用环境】生产环境
【 TiDB 版本】6.5.1
【复现路径】
1>关闭关闭透明大页,
2>设置storage.block-cache.capacity = 48G,
3> memory-usage-limit = 82G
【遇到的问题:问题现象及影响】
TiKV 内存限制在 82G ,但是观察集群内存已经增长已经超过90G

为什么内存的限制条件为什么没生效
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面

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

reload了嘛

是GOBAL级别的么?tidb_server_memory_limit
另外, 设置该变量后,当 tidb-server 实例的内存用量达到 32 GB 时,TiDB 会依次终止正在执行的 SQL 操作中内存用量最大的 SQL 操作,直至 tidb-server 实例内存使用下降到 32 GB 以下。被强制终止的 SQL 操作会向客户端返回报错信息 Out Of Memory Quota!

正常不需要设置memory-usage-limit,只需要设置storage.block-cache.capacity,tikv最大使用内存就会限制在5/3*storage.block-cache.capacity。你执行下SHOW config WHERE NAME LIKE ‘%storage.block-cache.capacity%’;
看下storage.block-cache.capacity设置都生效了吗?

1 个赞

image
都已生效 49G

是TiKV 内存无限制增长,跟TiDB 没有关系偶

限制参数配置一下

你看的是tikv节点的总内存吗?你看服务器上tikv进程的内存占用大概多少

查看Prometheus监控 TiKV 进程的内存使用情况,如果内存使用量不断增加,可能存在内存泄漏的问题。另外可以查看 TiKV 的日志文件,看看有没有警告或错误日志指示内存泄漏的存在

tikv的内存主要是storage.block-cache.capacity这个参数控制整个block-cache大小。这个参数影响rocksdb读。
然后就是write-buffer-size,这个write-buffer可能会有好几个。这个参数影响rocksdb写。

可以通过config查看个数和大小设置。
show config where name like '%write%buffer%' and type='tikv';

然后这两组参数其实是设置在rocksdb上的,tikv除了rocksdb,还有一个rust的壳,这个壳也会占用一定的内存。

简单粗暴的说,rust的部分是没有办法控制内存的。rocksdb里面,你无脑把block-cache往下压,肯定可以达到控制内存的效果。以我4c8g为例,原本的block-cache是3.5g。往下压到2g才能做到没有tikv的内存告警。不然内存大于80%的告警基本常驻。

所以我觉得你要是一定要内存的占用小于80%,干脆把block-cache设置到20g以下,等内存慢慢下去,再做一点点做调整到你的理想水位。

请教,在TIKV日志中,内存泄露 会有那些提示?

学习学习

可以查看日志文件中Error级别的错误信息,看看有没有OOM相关的错误,或者在dashboard面板中的日志模块,在线搜索tikv节点的所有error级别的信息

内存限制下

在限制tikv storage.block-cache.capacity 情况下,那些会引起内存泄露呢?

学习学习

学习学习

resolved-ts 模块有已知的造成内存持续增长的问题,见 https://github.com/tikv/tikv/issues/15458

不用 stale read 的话可以关闭 resolved-ts 模块

[resolved-ts]
enable = false