壹、關鍵參數
create_if_missing:創建缺失表
num_levels:層次數量,默認是7。如果L0大小有512MB,6層能容納512M+512M+5G+50G+500G+5T,如果配置是7,在數據量少於前面計算的5T+的數據之前,最後壹層是不會被使用的。如果num_levels配置為6,那麽最下面壹層數據量會大於5T
max_background_flushes:memtable dump成sstable的並發線程數。默認是1,線程數小,當寫入量大時,會導致無法寫入。
max_background_compactions:底層sst向高層sst compact的並發線程數。並發compaction會加快compaction的速度,如果compaction過慢,達到soft_pending_compaction_bytes_limit會發生阻塞,達到hard_pending_compaction_bytes會停寫。
max_write_buffer_number:指定memtable和immutable memtable總數。當寫入速度過快,或者flush線程速度較慢,出現memtable數量超過了指定大小,請求會無法寫入
write_buffer_size:單個memtable的大小,當memtable達到指定大小,會自動轉換成immutable memtable並且新創建壹個memtable
max_bytes_for_level_base:L1的總大小,L1的大小建議設置成和L0大小壹致,提升L0->L1的compaction效率
min_write_buffer_number_to_merge:immutable memtable在flush之前先進行合並,比如參數設置為2,當壹個memtable轉換成immutable memtable後,RocksDB不會進行flush操作,等到至少有2個後才進行flush操作。這個參數調大能夠減少磁盤寫的次數,因為多個memtable中可能有重復的key,在flush之前先merge後就避免了舊數據刷盤;但是帶來的問題是每次數據查找,當memtable中沒有對應數據,RocksDB可能需要遍歷所有的immutable memtable,會影響讀取性能。
level0_file_num_compaction_trigger:L0達到指定個數的sstable後,觸發compaction L0->L1。所以L0穩定狀態下大小為write_buffer_size min_write_buffer_number_to_merge level0_file_num_compaction_trigger
statistics:統計系統性能和吞吐信息,開啟statistics會增加5%到10%的額外開銷
stats_dump_period_sec:統計信息導出日誌時間間隔
compression_type: 壓縮類型
bloom_filter_bits:使用bloom過濾器來避免不必要的磁盤訪問
lru_cache_size:cache大小
max_open_files:最大打開文件句柄
skip_stats_update_on_db_open: 打開db時,是否跳過stats。建議設為false
二、wirte sall 常見情況及解決方法
(1)RocksDB在flush或compaction速度來不及處理新的寫入,會啟動自我保護機制,延遲寫或者禁寫。主要有幾種情況:
寫限速:如果max_write_buffer_number大於3,將要flush的memtables大於等於max_write_buffer_number-1,write會被限速。
禁寫:memtable個數大於等於max_write_buffer_number,觸發禁寫,等到flush完成後允許寫入。
寫限速:L0文件數量達到level0_slowdown_writes_trigger,觸發寫限速。
禁寫:L0文件數量達到level0_stop_writes_trigger,禁寫。
寫限速:等待compaction的數據量達到soft_pending_compaction_bytes,觸發寫限速。
禁寫:等待compaction的數據量達到hard_pending_compaction_bytes,觸發禁寫。
(2)當出現write stall時,可以按具體的系統的狀態調整如下參數:
調大max_background_flushes
調大max_write_buffer_number
調大max_background_compactions
調大write_buffer_size
調大min_write_buffer_number_to_merge
三、推薦配置示例
存儲介質flash
options.options.compaction_style = kCompactionStyleLevel;
options.write_buffer_size = 67108864; // 64MB
options.max_write_buffer_number = 3;
options.target_file_size_base = 67108864; // 64MB
options.max_background_compactions = 4;
options.level0_file_num_compaction_trigger = 8;
options.level0_slowdown_writes_trigger = 17;
options.level0_stop_writes_trigger = 24;
options.num_levels = 4;
options.max_bytes_for_level_base = 536870912; // 512MB
options.max_bytes_for_level_multiplier = 8;
全內存
options.allow_mmap_reads = true;
BlockBasedTableOptions table_options;
table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
table_options.no_block_cache = true;
table_options.block_restart_interval = 4;
options.table_factory.reset(NewBlockBasedTableFactory(table_options));
options.level0_file_num_compaction_trigger = 1;
options.max_background_flushes = 8;
options.max_background_compactions = 8;
options.max_subcompactions = 4;
options.max_open_files = -1;
ReadOptions.verify_checksums = false