RocksDB配置优化 #
一、配置概述 #
1.1 配置层次 #
text
RocksDB配置层次:
┌─────────────────────────────────────┐
│ Options │
│ (数据库级别配置) │
├─────────────────────────────────────┤
│ ColumnFamilyOptions │
│ (列族级别配置) │
├─────────────────────────────────────┤
│ WriteOptions │
│ (写入选项) │
├─────────────────────────────────────┤
│ ReadOptions │
│ (读取选项) │
├─────────────────────────────────────┤
│ FlushOptions │
│ (刷新选项) │
└─────────────────────────────────────┘
1.2 配置原则 #
| 原则 | 说明 |
|---|---|
| 按场景配置 | 不同场景使用不同配置 |
| 逐步调优 | 一次调整一个参数 |
| 监控验证 | 调整后监控效果 |
| 权衡取舍 | 平衡各性能指标 |
二、内存配置 #
2.1 Block Cache #
cpp
#include <rocksdb/cache.h>
#include <rocksdb/table.h>
rocksdb::Options GetBlockCacheOptions() {
rocksdb::Options options;
rocksdb::BlockBasedTableOptions table_options;
// LRU缓存
table_options.block_cache = rocksdb::NewLRUCache(
1024 * 1024 * 1024, // 1GB容量
8, // 分片数
false, // 是否使用高优先级
0.0 // 高优先级比例
);
// 压缩块缓存
table_options.block_cache_compressed = rocksdb::NewLRUCache(
256 * 1024 * 1024 // 256MB
);
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
2.2 MemTable配置 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetMemTableOptions() {
rocksdb::Options options;
// MemTable大小
options.write_buffer_size = 64 * 1024 * 1024; // 64MB
// 最大MemTable数量
options.max_write_buffer_number = 4;
// 最小合并数量
options.min_write_buffer_number_to_merge = 2;
return options;
}
2.3 内存预算 #
cpp
#include <rocksdb/options.h>
// 内存预算计算
// 总内存 = Block Cache + MemTable + 索引 + 过滤器
rocksdb::Options GetMemoryBudgetOptions(size_t total_memory) {
rocksdb::Options options;
// Block Cache: 50%总内存
size_t block_cache_size = total_memory * 0.5;
// MemTable: 25%总内存
size_t memtable_size = total_memory * 0.25;
options.write_buffer_size = memtable_size / 4; // 4个MemTable
options.max_write_buffer_number = 4;
// 配置Block Cache
rocksdb::BlockBasedTableOptions table_options;
table_options.block_cache = rocksdb::NewLRUCache(block_cache_size);
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
三、写入优化 #
3.1 写入吞吐优化 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetWriteThroughputOptions() {
rocksdb::Options options;
// 增大MemTable
options.write_buffer_size = 128 * 1024 * 1024; // 128MB
options.max_write_buffer_number = 8;
// 减少WAL同步
// WriteOptions.sync = false
// 增加后台线程
options.max_background_jobs = 16;
options.max_background_compactions = 8;
options.max_background_flushes = 4;
// 调整Compaction触发阈值
options.level0_file_num_compaction_trigger = 8;
options.level0_slowdown_writes_trigger = 30;
options.level0_stop_writes_trigger = 50;
return options;
}
3.2 写入延迟优化 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetWriteLatencyOptions() {
rocksdb::Options options;
// 减小MemTable大小
options.write_buffer_size = 32 * 1024 * 1024; // 32MB
// 更快触发Flush
options.max_write_buffer_number = 3;
// 更快触发Compaction
options.level0_file_num_compaction_trigger = 2;
// 增加后台线程
options.max_background_flushes = 4;
return options;
}
3.3 批量写入优化 #
cpp
#include <rocksdb/options.h>
#include <rocksdb/write_batch.h>
rocksdb::WriteOptions GetBatchWriteOptions() {
rocksdb::WriteOptions options;
// 禁用WAL(适合批量导入)
options.disableWAL = true;
// 异步写入
options.sync = false;
return options;
}
void BatchImport(rocksdb::DB* db, const std::vector<std::pair<std::string, std::string>>& data) {
rocksdb::WriteBatch batch;
for (const auto& [key, value] : data) {
batch.Put(key, value);
}
rocksdb::WriteOptions options;
options.disableWAL = true;
options.sync = false;
db->Write(options, &batch);
// 导入完成后Flush
db->Flush(rocksdb::FlushOptions());
}
四、读取优化 #
4.1 Block Cache优化 #
cpp
#include <rocksdb/cache.h>
#include <rocksdb/table.h>
rocksdb::Options GetReadCacheOptions() {
rocksdb::Options options;
rocksdb::BlockBasedTableOptions table_options;
// 大容量Block Cache
table_options.block_cache = rocksdb::NewLRUCache(
2 * 1024 * 1024 * 1024 // 2GB
);
// 增加缓存分片数
table_options.block_cache = rocksdb::NewLRUCache(
2 * 1024 * 1024 * 1024, // 2GB
16 // 16分片
);
// Pin L0 Filter和Index
table_options.pin_l0_filter_and_index_blocks_in_cache = true;
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
4.2 布隆过滤器优化 #
cpp
#include <rocksdb/table.h>
#include <rocksdb/filter_policy.h>
rocksdb::Options GetFilterOptions() {
rocksdb::Options options;
rocksdb::BlockBasedTableOptions table_options;
// 布隆过滤器
table_options.filter_policy.reset(
rocksdb::NewBloomFilterPolicy(10) // 10 bits per key
);
// 全键过滤
table_options.whole_key_filtering = true;
// 过滤器位置优化
table_options.optimize_filters_for_memory = true;
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
4.3 读取选项优化 #
cpp
#include <rocksdb/options.h>
rocksdb::ReadOptions GetOptimizedReadOptions() {
rocksdb::ReadOptions options;
// 验证校验和
options.verify_checksums = true;
// 填充缓存
options.fill_cache = true;
// 设置预读大小
options.readahead_size = 256 * 1024; // 256KB
// 异步IO
options.async_io = false;
return options;
}
// 大范围扫描优化
rocksdb::ReadOptions GetScanOptions() {
rocksdb::ReadOptions options;
// 不填充缓存
options.fill_cache = false;
// 更大的预读
options.readahead_size = 2 * 1024 * 1024; // 2MB
return options;
}
五、Compaction优化 #
5.1 Compaction线程配置 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetCompactionThreadOptions() {
rocksdb::Options options;
// 后台任务总数
options.max_background_jobs = 16;
// Compaction线程数
options.max_background_compactions = 8;
// Flush线程数
options.max_background_flushes = 4;
return options;
}
5.2 Compaction触发配置 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetCompactionTriggerOptions() {
rocksdb::Options options;
// L0文件数量触发
options.level0_file_num_compaction_trigger = 4;
// 写入减速触发
options.level0_slowdown_writes_trigger = 20;
// 写入停止触发
options.level0_stop_writes_trigger = 36;
// 层级大小配置
options.max_bytes_for_level_base = 256 * 1024 * 1024; // 256MB
options.max_bytes_for_level_multiplier = 10;
return options;
}
5.3 Compaction速率限制 #
cpp
#include <rocksdb/rate_limiter.h>
#include <rocksdb/options.h>
rocksdb::Options GetRateLimitOptions() {
rocksdb::Options options;
// 创建速率限制器
options.rate_limiter.reset(
rocksdb::NewGenericRateLimiter(
100 * 1024 * 1024, // 100MB/s
1000, // refill周期(微秒)
10, // 公平性
rocksdb::RateLimiter::Mode::kWritesOnly
)
);
return options;
}
六、压缩配置 #
6.1 分层压缩 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetLayeredCompressionOptions() {
rocksdb::Options options;
// 各层压缩配置
options.compression_per_level = {
rocksdb::CompressionType::kNoCompression, // L0: 无压缩
rocksdb::CompressionType::kLZ4Compression, // L1: LZ4
rocksdb::CompressionType::kLZ4Compression, // L2: LZ4
rocksdb::CompressionType::kZSTD, // L3: ZSTD
rocksdb::CompressionType::kZSTD, // L4: ZSTD
rocksdb::CompressionType::kZSTD, // L5: ZSTD
rocksdb::CompressionType::kZSTD // L6: ZSTD
};
// 底层最高压缩
options.bottommost_compression = rocksdb::CompressionType::kZSTD;
return options;
}
6.2 压缩选项 #
cpp
#include <rocksdb/options.h>
rocksdb::Options GetCompressionOptions() {
rocksdb::Options options;
rocksdb::CompressionOptions compression_opts;
compression_opts.window_bits = -14;
compression_opts.level = 3;
compression_opts.strategy = 0;
compression_opts.max_dict_bytes = 0;
options.compression_opts = compression_opts;
return options;
}
七、场景配置模板 #
7.1 高吞吐场景 #
cpp
rocksdb::Options GetHighThroughputOptions() {
rocksdb::Options options;
// MemTable
options.write_buffer_size = 128 * 1024 * 1024;
options.max_write_buffer_number = 8;
// 后台线程
options.max_background_jobs = 16;
// Compaction
options.level0_file_num_compaction_trigger = 8;
// 压缩
options.compression = rocksdb::CompressionType::kLZ4Compression;
// Block Cache
rocksdb::BlockBasedTableOptions table_options;
table_options.block_cache = rocksdb::NewLRUCache(2 * 1024 * 1024 * 1024);
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
7.2 低延迟场景 #
cpp
rocksdb::Options GetLowLatencyOptions() {
rocksdb::Options options;
// MemTable
options.write_buffer_size = 32 * 1024 * 1024;
options.max_write_buffer_number = 3;
// 后台线程
options.max_background_flushes = 4;
// Compaction
options.level0_file_num_compaction_trigger = 2;
// Block Cache
rocksdb::BlockBasedTableOptions table_options;
table_options.block_cache = rocksdb::NewLRUCache(4 * 1024 * 1024 * 1024);
table_options.filter_policy.reset(rocksdb::NewBloomFilterPolicy(10));
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
return options;
}
7.3 内存受限场景 #
cpp
rocksdb::Options GetMemoryConstrainedOptions() {
rocksdb::Options options;
// MemTable
options.write_buffer_size = 16 * 1024 * 1024;
options.max_write_buffer_number = 2;
// Block Cache
rocksdb::BlockBasedTableOptions table_options;
table_options.block_cache = rocksdb::NewLRUCache(256 * 1024 * 1024);
table_options.no_block_cache = false;
options.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(table_options)
);
// 压缩
options.compression = rocksdb::CompressionType::kZSTD;
return options;
}
八、配置验证 #
8.1 验证配置 #
cpp
#include <rocksdb/db.h>
#include <iostream>
void ValidateOptions(const rocksdb::Options& options) {
// 检查MemTable配置
std::cout << "write_buffer_size: "
<< options.write_buffer_size / 1024 / 1024 << " MB" << std::endl;
std::cout << "max_write_buffer_number: "
<< options.max_write_buffer_number << std::endl;
// 检查Compaction配置
std::cout << "level0_file_num_compaction_trigger: "
<< options.level0_file_num_compaction_trigger << std::endl;
// 检查后台线程
std::cout << "max_background_jobs: "
<< options.max_background_jobs << std::endl;
}
九、总结 #
9.1 关键配置参数 #
| 参数 | 说明 | 推荐值 |
|---|---|---|
| write_buffer_size | MemTable大小 | 64-128MB |
| max_write_buffer_number | MemTable数量 | 4-8 |
| block_cache | 块缓存大小 | 总内存50% |
| max_background_jobs | 后台任务数 | CPU核心数 |
| compression | 压缩算法 | LZ4/ZSTD |
9.2 配置调优流程 #
- 确定场景:明确性能目标
- 选择模板:使用合适的配置模板
- 逐步调优:一次调整一个参数
- 监控验证:观察性能变化
- 迭代优化:持续改进
下一步,让我们学习内存管理!
最后更新:2026-03-27