nebula 内存占用

nebula 版本:3.6.0
内存:1.5T
数据量:点的数量为5亿左右
储存时nebula-storge占用内存的百分比达到了70%
查询所有节点时,内存饱满,nebula-graph占主要内存空间。无论是查询还是入库内存都得不到释放。应怎么解决

可以论坛里搜一下关键词比如 nebula storage内存使用一直增长

但是这里面好像没有给出怎么解决的方案,我不明白为什么写入之后,程序已经结束了,内存还不释放的原因

Talk to AIBot
记一次 nebula-storaged 内存占用高解决的过程,这篇帖子里面好像给出了修改一些参数的方法,但我的理解是影响运行过程,不知道和运行后内存不释放有什么关系,另外我们的服务器配置和他的不一样,所以不知怎么修改比较好

storaged 的存储是基于 rocksdb 的,内存占用大头主要是缓存: block cache、bloom filter,和 MemTables(这个是 LSM Tree 的基础概念哈)

可以结合这些上下文在论坛搜一下相关的配置~~

在 RocksDB 中,内存占用的 “大头” 通常来自以下几个方面:

  • Block Cache: 这是 RocksDB 用于缓存从 SST 文件读取的数据块的缓存。对于读密集型的工作负载,为了提高性能,Block Cache 的大小通常会被配置得相对较大。它的大小可以通过 block_cache_size 配置选项进行设置。

  • MemTables: MemTables 存储了最近的写入操作。当 MemTable 达到一定大小后,它会被刷新到 SST 文件。因此,对于写密集型的工作负载,MemTables 可能会成为一个主要的内存使用者。你可以通过 write_buffer_size 配置选项来调整 MemTable 的大小,以及通过 max_write_buffer_number 来调整可以保持在内存中的 MemTables 的最大数量。

  • 索引和过滤器: 如果索引和过滤器被配置为驻留在内存中(即它们不使用 Block Cache),那么对于大型数据库,这些数据结构可能会使用大量的内存。通常,过滤器(特别是布隆过滤器)比索引使用更少的内存,但它们的确切大小取决于数据和配置。

以上三个是最常见的主要内存使用者。然而,根据你的工作负载和配置,其他组件也可能变得显著。

为了优化 RocksDB 的内存使用,你应该考虑:

调整 Block Cache 的大小,确保它既能够满足性能需求,又不会过多地消耗内存。
根据写入速率调整 MemTable 的大小和数量。
如果可能,考虑将索引和/或过滤器配置为使用 Block Cache。

配置参考 https://docs.nebula-graph.com.cn/3.6.0/5.configurations-and-logs/1.configurations/4.storage-config/

首先,很感谢您的回答。手册中建议修改enable_partitioned_index_filter和rocksdb_block_cache这两个参数,我有两个问题:1、enable_partitioned_index_filter这个参数没有在配置文件中找到;2、我这边1.5T的内存ocksdb_block_cache设置为多少比较好呢?目前设置为了819200M

记一次 nebula-storaged 内存占用高解决的过程 看下这个帖子能不能帮助你

有看过几次了

  1. 嗯嗯,默认配置文件里没有穷尽所有的配置,如果通过二进制打印出来存在、或者看到了文档里提及,可以手动加进去
  2. 可以从 1/3 的内存开始
1 个赞

您也觉得设置的太大了是吗

:joy: 就是让你慢慢调整参数,调到一个合适的值

你的partition设置了多少个?

服务器有八个硬盘,每个硬盘有20个分区,是所以一个空间的partition设置了160。我现在将enable_partitioned_index_filter设置了false,以及rocksdb_block_cache设置为了81920M(内存为1.5T),内存占用得到了极大的降低,但性能好像也降低了好多

1 个赞

因为这个配置项本身的解释就是:设置为true可以降低 bloom 过滤器占用的内存大小,但是在某些随机寻道(random-seek)的情况下,可能会降低读取性能。

prefix bloom filter本身是一种用空间换时间的方案

2 个赞

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