RocksDB纯写入场景下降低内存占用的额外调优参数问询
纯写入场景下RocksDB降低内存占用的核心可调参数
你仅调整write_buffer_size无法抑制内存增长的核心原因是,RocksDB的内存占用不止来自当前活跃的memtable,还包括等待刷盘的不可变memtable、读场景用的块缓存、压缩缓冲区、WAL缓冲区等多个模块,以下是针对性的可调参数:
1. 限制memtable总占用
- 单实例最多保留的等待刷盘的不可变memtable数量:
options.max_write_buffer_number = 2,默认值为4,纯写入场景如果刷盘速度跟不上写入速度,堆积的不可变memtable会占用大量内存,可降到2甚至1,如果触发写入停顿可以配合后台刷盘参数调整。 - 触发合并刷盘的不可变memtable阈值:
options.min_write_buffer_number_to_merge = 1,默认值为1无需修改,调高会攒多个memtable合并后再刷盘,反而会额外占用内存。 - 如果你使用了多个列族,需要提前核算memtable总占用=列族数 *
max_write_buffer_number*write_buffer_size,避免总规模超出预期。
2. 完全禁用读相关内存缓存
你的场景不需要读取功能,读相关的缓存可以直接关闭,这是降内存最有效的手段:
- 禁用块缓存:
options.block_cache = nullptr,RocksDB默认会分配当前物理内存的1/3作为块缓存加速读,纯写入场景完全无用,关闭后可以直接释放这部分内存。 - 禁用布隆过滤器:
options.filter_policy.reset(),布隆过滤器是用来加速点查的,纯写入场景无意义,直接关闭即可。
3. 限制压缩相关内存占用
你使用了ZSTD压缩,压缩过程的临时缓冲区和工作线程都会占用内存:
- 限制压缩后台线程数:
options.max_background_compactions = 2,默认值远大于2,压缩线程越多,每个线程持有的压缩缓冲区总占用越高,纯写入场景不需要追求过高压缩速度,线程数只要能跟上写入速度即可。 - 关闭ZSTD字典压缩:
options.compression_opts.max_dict_bytes = 0,字典生成和存储会占用额外内存,如果不需要极高压缩率可以直接关闭。 - 对压缩率没有要求的话,可以直接把
options.compression设为rocksdb::kNoCompression,完全释放压缩相关的内存开销。
4. 限制WAL相关内存
- 如果你的场景允许掉电丢失少量刚写入的数据,写入时直接关闭WAL:使用
rocksdb::WriteOptions().disable_wal = true进行写入,可以完全省掉WAL的缓冲区开销。 - 不能关闭WAL的话,手动限制WAL缓冲区大小:
options.wal_buffer_size = 1 * 1024 * 1024,默认值为0会自动按write_buffer_size分配内存,手动设为固定小值即可。
5. 其他辅助参数
- 关闭统计信息采集:
options.statistics = nullptr,如果开启了统计功能,会持续累加监控指标占用内存,纯写入不需要监控的话直接关闭即可。 - 限制后台刷盘线程数:
options.max_background_flushes = 1,纯写入场景不需要多线程并行刷盘,单线程足够,减少线程栈的内存占用。
调整后的配置参考
rocksdb::Options options; // 原有保留配置 options.compression = rocksdb::CompressionType::kZSTD; options.create_if_missing = true; options.create_missing_column_families = true; options.write_buffer_size = 512 * 1024; // 新增降内存配置 options.max_write_buffer_number = 2; options.min_write_buffer_number_to_merge = 1; options.block_cache = nullptr; options.filter_policy.reset(); options.max_background_compactions = 2; options.max_background_flushes = 1; options.wal_buffer_size = 1 * 1024 * 1024; options.statistics = nullptr; // 允许关WAL的场景,写入时使用该配置 rocksdb::WriteOptions write_opt; write_opt.disable_wal = true;
内容的提问来源于stack exchange,提问作者user997112
相关产品推荐
相关产品推荐

