下圖是RocksDB的工作流程,一共進行三個步驟,
①將數據寫入內存中的活躍表 Active MenTable
②將活躍表轉化成只讀表 ReadOnlyMemTable
③將只讀表flush到本地磁盤上 LocalDish
具體調優方法
- ①增大整塊緩存,減小刷寫的頻率。
該塊內存為flink的管理內存,默認為全部內存的0.4倍,可以根據使用情況調大。
- ②增大block緩存
整個RocksDB共享一個block cache,讀數據時內存的chache大小,該參數越大讀數據時緩存命中率越高,默認大小為8MB,建議設置到64~256MB
state.backend.rocksdb.block.cache-size:64m //默認8MB
- ③增大write buffer和level閾值大小
RocksDB中,每個state使用一個Column Family,每個Column Family使用獨占的write buffer,默認64MB,建議調大,提高寫的效率
調整這個參數通常要適當增加L1層的大小閾值max-size-level-base,默認256m。因為write buffer增大后該值不增大會導致更快合並導致次數過多
該值太小會造成,因為合並次數過多,能存放的SST文件過少,層級變多造成查找困難
太大會造成,文件過多(沒有達到合並閾值的文件變多),並且文件太大會造成合並困難
建議設置為target_flie_size_base(默認64MB)的倍數,且不能太小,一般為5~10倍,即320~640MB
state.backend.rockdb.writebuffer,size:128m
state.backend.rocksdb.compaction.level.max-size-level-base:320m
- ④增大write buffer數量
每個Column Family對應的write buffer最大數量,這實際上是內存中“只讀內存表”的最大數量,默認值是2.
即是說一個state在只讀內存表中使用2個寫入緩沖(默認64MB),可以在內存中緩沖2次寫入等待被flush。
如果是機械硬盤且內存足夠大,可以調大到5左右
state.backend.rocksdb.writebuffer.count:5
- ⑤增大用於后台flush和合並sst文件的線程數。
默認為1,建議調大,機械硬盤用戶可以改為4等更大的值。
state.backend.rocksdb.thread.num:4
在13版本之后RocksDB的預定義選項SPINNING_DISK_OPTIMIZED中也有該值被設置為4
- ⑥增大write buffer最小合並數
將數據從writebuffer中flush到磁盤時,需要合並的writebuffer最小數量,默認值為1,可以調的大一些比如3
state.backend.rocksdb.writebuffer.number-to-merge:3
如第④條所說,如果調大了writebuffer的數量為5,那么內存中就會最多存在5個只讀的memtable,調大該參數可以一次flush3個memtable經過合並后變成SSTtable存到磁盤中。