古詩詞大全網 - 字典詞典 - rocksdb性能調優

rocksdb性能調優

壹、關鍵參數

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