rocksdb_block_cache 的配置项的说明不够清晰,可能导致 OOM

  • nebula 版本:3.5.0
  • 部署方式:分布式
  • 安装方式:RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD):INTEL SSDPE2KX040T8
    • CPU、内存信息:32core,128GB

nebula-storage.conf 下的 rocksdb_block_cache 配置项,从注释信息和官方文档的信息来。给人的预期是整个 storaged 服务共享。

# The default block cache size used in BlockBasedTable. (MB)
# recommend: 1/3 of all memory
--rocksdb_block_cache=4096

但实际上每个图空间,每块ssd硬盘单独算的。参考 nebula/src/kvstore/RocksEngine.cpp的代码。

RocksEngine::RocksEngine(GraphSpaceID spaceId,
                         int32_t vIdLen,
                         const std::string& dataPath,
                         const std::string& walPath,
                         std::shared_ptr<rocksdb::MergeOperator> mergeOp,
                         std::shared_ptr<rocksdb::CompactionFilterFactory> cfFactory,
                         bool readonly)
  rocksdb::Options options;
  rocksdb::DB* db = nullptr;
  // 对于每个 spaceId 和 dataPath,都 init 了一次 rocksdb::Options。
  rocksdb::Status status = initRocksdbOptions(options, spaceId, vIdLen); 
}

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

这里可能有2个优化点吧

  1. 明确告知使用者 rocksdb_block_cache 是单独计算的。
  2. rocksdb的文档 https://github.com/facebook/rocksdb/wiki/Block-Cache,多个 rocksdb 实例可以共享一个cache的。nebula-storaged服务是否可以利用这个特性?
1 个赞

@Chris1 请文档同学看下这个建议

实际上,每个storage进程只有一个共享的block_cache,并不是独立计算的。可以再往里面翻翻代码。

3 个赞

官方提供.conf.default和.conf.production两个版本,请问该如何选择,生产环境是不是安装production合适?

嗯,是的。

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