缓存占用的数据量过高如何解决

  • nebula 版本:3.4.1
  • 部署方式:分布式
  • 安装方式: RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘 350GB
    • CPU、内存信息 8C 128G

内存使用比例过高, 超过了90%, 其中大部分是缓存的使用, 如果某个时刻有大量的数据写入, 担心会出现内存不够用的情况, 所以想请问一下有什么方法可以有效的限制缓存? 看到可以修改enable_partitioned_index_filter来减少内存的占用率, 但是这种方式还是没有办法降低缓存的占用率.


同问,在大批量写入的时候,cache的占比非常大

参考这2篇文章。在我的业务场景下,我直接设置了rocksdb_block_cache=-1,关闭了缓存。内存就保持一个稳定的水位了。相当于直接读SSD,只用OS page cache。读写速度也还能接受。
https://zhuanlan.zhihu.com/p/559175147

3 个赞

感谢老哥的技术支持, 还有一个问题想请教一下, 我在测试环境已经设置了rocksdb_block_cache=-1, 内存也确实降下来了, 但是降低的内存是实际使用的内存, 缓存(buffer和cache)一点都没有降低, 缓存的数据量比磁盘中的数据量还要大, 感觉有点浪费内存, 有什么办法降低缓存占用的内存而不是实际占用的内存吗?

image
image
image

我不太确定这个 memory_cached_buffer_used 的统计口径是什么。如果是类似 free 命令的统计口径的话,那大于硬盘文件大小,是符合预期的。

只要关注 top 命令下,storaged 进程的 rss 没有持续增加就好了吧。

我们在持续高并发写的时候也遇到了这个问题,我们一台机器挂载12个盘,128G的内存110G+是Buffer/Cache,无论怎么配置参数都无法控制Cache大小,我感觉跟单台机器使用目录相关,因为每个storage的data_path是一个rocksdb实例,写入的时候就是占用更多的Cache。我们这边的解决方案:定时清理Cache(我们写的时候不会进行读)

的确是和硬盘数量有关的,参考我提问的这个issue:

举个例子,如果有2个ssd硬盘,创建了3个图空间,rocksdb_block_cache=4096。预期只占用4GB的内存。实际的缓存占用是 2 * 3 * 4096 = 24GB。

2 个赞

如果写入的时候,有部分数据出错(脏数据)的情况,会不会导致buffer和cache内存量飙升
graphd报错信息类似E20230926 18:12:21.617722 43814 StorageAccessExecutor.h:47] InsertVerticesExecutor failed, error E_NOT_NULLABLE, part 2
Storage Error: The not null field cannot be null

这个报错信息,感觉是数据和 schema 匹配出问题了呀。:thinking: 你有帖子记录这个问题么

监控中的cache是整个操作系统的,其中一部分是rocksdb_block_cache,看你实际设置的大小,其他的应该都是可以被覆盖的,是由操作系统控制的。cache越大不是说明缓存了更多数据吗?cache大不代表可用内存小呀

怎么清理

我是写了个脚本,不断的监控内存使用情况,当小于一个阈值就执行清理命令

while true;
        do
              free_mem=$(free -m | grep Mem | awk '{print $4}')
              if [[ $free_mem -lt 2000 ]]; then
                      echo "start clean page cache `date +'%Y-%m-%d %H:%M:%S'`"
                      sync;sync;sync;
                      sleep 10
                      echo 3 > /proc/sys/vm/drop_caches
              fi
              sleep 10
       done
2 个赞

buff/cache和内存不足没啥关系,干嘛要清理?

buff/cache存储的地方就是主存,另外大量写的情况下,就会存在过多的占用pageCache,不清理然后storage在申请内存的时候直接跪了,错误原因就是内存不足

buff/cache是可以被回收的,你说的内存不足的具体错误是啥,OOM吗?

是的,我当时为了解决buff/cache占用过的情况,还调整过系统参数尽快回收,但是仍然赶不上写操作申请内存的速度,当时我们一个服务器有挂载12个盘,写入速度非常高每秒60w+的速度,每个磁盘写入的时候都先写了pageCache,可用内存下降的非常快,90%的内存都消耗在buff/Cache了,导致storage申请内存的时候直接oom了

神奇了,buff/cache可以被操作系统回收,一般不会引起OOM吧。

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