TiKV的角色内存驻留为什么总是很高,基本维持在20~30G的样子

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.7
  • 【问题描述】:

1、我们集群资源比较紧张,我在3台节点上部署了TiDB,目前里面的存储的数据量不是很大,几个G的样子。好几个小时没有进行任何写入,写出和分析操作了。但是tikv-server进程依然占用20~30G内存。请问这个能不能让它及时释放掉?
2、我不太懂这块的原理,请问为什么要维持这么高的驻留内存?我之前了解PD节点会使用go预言申请一块内存用于分析,但是tikv这块我不清楚为何要驻留这个多内存。
3、我预计使用TiSpark读TiKV的数据,进行分析,分析完之后,写出到HDFS中。请问,这种情况下,TiKV会一直维持这么高的驻留内存吗?


4、我确实是进行了一些大的OLAP操作,数据源表在2000w条左右,但是距离上次查询已经好几小时了,TiKV内存没有自动释放掉,我希望能有办法及时自动释放掉。

我手动的把几台节点上的tikv-server 进程kill 掉之后,在执行同样的SQL,可以正常运行。内存也没有那么高了。所以我猜测,是不是内存释放时间这块,可以调下参数之类的?

目前 block cache 这块不会自动释放,之前使用到最大的 block-cache 值之后就会一直保持在相应状态。

好的。我目前的应用场景,不需要保存热点数据,查询一次就完事了,下次会查询其他表,执行其他SQL,很长时间之后才会执行同一个SQL。
1、这种场景下,我是不是可以把block-cache-size这个值调小一点,每次从tikv直接读取数据?可以调多小呢?1G可以吗?我是越小越好,因为我短时间内不会重复从一张表中查询数据,我们是OLAP的需求。用来跑离线数仓的SQL的。
2、调小之后,会产生内存溢出之类的错误吗?
3、如果不能自动释放block-cache的话,有什么办法手动释放吗?我试过一个极端的办法,就是把某个节点的tikv-server进程kill掉,内存可以释放,同时不影响tidb使用。如果实在没办法,我就轮询各个节点,把tikv-serve r kill掉?有更好的办法吗?

  1. 可以考虑调小,具体调整数值可以根据对应的业务量进行调整。
    block cache 调小只会影响 block cache 的命中率,也就是数据无法从 block cache 中命中的时候,需要从磁盘上2. 读取数据,这个影响的是 SQL 的执行效率。
  2. 如果要手动释放内存可以考虑动态调整 block-cache-size 参数,具体可以参考:
    https://docs.pingcap.com/zh/tidb/stable/dynamic-config

但是目前动态调整参数属于实验特性,不建议在生产环境使用,使用之前最好测试一下具体影响。

好的,谢谢

请问TiKV的block-cache除了执行SQL时,会缓存热点数据之外。在往TiKV里面插入数据的时候,会缓存数据吗?

block cache 主要缓存读取的数据
写入的数据先先 memtable 再 compact 到 SST 文件的
http://alexstocks.github.io/html/rocksdb.html

1 个赞

我刚刚通过tiup cluster edit-config配置了block-cache-size参数
rocksdb.defaultcf.block-cache-size: “10MB”
目的是让TiDB每次从TiKV读数据分析时,尽量不在内存中保存数据,因为我们集群资源比较紧张。
调完这个参数后,我发现执行SQL后,TiKV-server内存仍然会从0增大到3~4G的样子,好像还是缓存了很多数据。如果分析大表的话,可能tikv-server还是要驻留多内存。所以想请教下,是不是还需要设置其他参数?
我就希望tikv-server不要缓存太多数据,占的内存越少越好。


配置rocksdb.defaultcf.block-cache-size参数前后,block-cache大小好像没减少


4.0 中默认应该是通过 storage.block-cache.capacity 参数来总的 block-cache 大小,可以调整这个参数再看下

1 个赞

好的,谢谢

非常感谢,这次确实tikv-server占的内存不多了。
但是我还有个问题想请教下。就是我执行一个SQL,第一次执行用了14秒,设置rocksdb基本不缓存数据,同时把SQL略作修改,比如原来是desc排序,现在是asc排序,应该用不上缓存的最终结果,为什么第二次及以后执行,就只用了3~4秒呢?
我们每次会执行不同的SQL,所以每次应该都相当于是第一次执行。我想知道的是,每次执行的时间,是像14s这样比较慢的,还是3~4秒这种比较快的?

https://docs.pingcap.com/zh/tidb/dev/coprocessor-cache
可以确认一下是否开了 coprocessor cache

我用的全部是默认配置,如果默认是不开的话,那我应该就是没有开。
我们一般是每30分钟,会重复的执行同一个SQL一次。然后不同的SQL会间隔着执行,同时数据源表会不断更新。这种情况下,缓存的数据会相互顶掉吗?或者说,我能用得上缓存的结果吗?

这个是expalin analysis的执行结果,我看copr_cache_hit_ratio的值为0,意思就是每次都没有使用下推计算结果缓存是吧
缓存.txt (12.5 KB)
这个是我们的完整配置
tidb完整配置.txt (3.2 KB)
请问我这个应该是没有用计算结果下推是吧。如果配置使用计算结果下推,会占据很多内存吗?
也许,是我刚启动tidb,执行第一条大SQL会比较慢?

嗯,默认的话是没有开启的。

1 个赞

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