為什么需要write stall
我們知道该互, 當flush/compaction趕不上write rate的速度時,rockdb會降低write rate听哭,甚至直接停寫慢洋, 如果沒有這個策略塘雳,會有什么問題陆盘?其實主要是兩個
- 增加空間放大,耗盡磁盤空間
- 增加讀放大败明, 極大的降低讀性能
但是隘马, 有時候,database容易對突然暴增的寫太過敏感妻顶,或者容易低估hardware的處理能力酸员, 這個時候就會反饋給用戶的就是意想不到的slowness 甚至query timeout
一般情況下蜒车, 通過這幾個地方你可以知道你數(shù)據(jù)庫是不是在進行write stall
- LOG file, info log
- Compaction stats found in Log file
write stall 觸發(fā)的條件
- Too many memtable
延緩寫: 如果max_write_buffer_number 大于3幔嗦, 將要flush的memtables大于等于max_write_buffer_number - 1酿愧, write 延緩
停寫: 如果將要flush 的memtable的個數(shù)大于等于max_write_buffer_number, write 直接停止等flush完成
在以上情況下, 一般會有這樣的日志:
Stopping writes because we have 5 immutable memtables (waiting for flush), max_write_buffer_number is set to 5
Stalling writes because we have 4 immutable memtables (waiting for flush), max_write_buffer_number is set to 5
-
Too many level-0 SST file
延緩寫: 如果L0的文件數(shù)量達到了level0_slowdown_writes_trigger邀泉,write 延緩寫
停寫: 如果文件數(shù)量達到了level0_stop_writes_trigger嬉挡, 直接停寫直到L0->L1的compactiom減少了L0的文件數(shù)。在以上情況下汇恤, 會出現(xiàn)這樣的日志
Stalling writes because we have 4 level-0 files Stopping writes because we have 20 level-0 files
-
Too many pending compaction bytes
延緩寫: 如果要compation的的字節(jié)數(shù)達到soft_pending_compaction_bytes庞钢,延緩寫
停寫: 如果該字節(jié)數(shù)目大于hard_pending_compaction_bytes, 直接停寫以上兩種情況時因谎, 會出現(xiàn)這樣的日志
Stalling writes because of estimated pending compaction bytes 500000000 Stopping writes because of estimated pending compaction bytes 1000000000
write stall vs write stop
當發(fā)生延緩寫的時候基括,rocksdb 會把寫速率降低到delayed_write_rate, 如果待compaction的字節(jié)數(shù)量持續(xù)增加财岔, rocksdb的寫速率會降低到低于delayed_write_rate风皿。 note: slowdow/停寫/待compaction的字節(jié)限制都是針對單個cf的, 而write stall 是針對整個DB的使鹅,也就是說:如果某個cf 觸發(fā)了write stall, 整個DB都會stall (延緩)
如何減少stall
如果stall是由pending flush引起的揪阶,可以設置這兩個參數(shù)
- 增加max_background_flushes 使更多的thread用來flush
- 增加max_write_buffer_number 使待flush的memtable更小
如果stall 是因為L0的文件太多/或者太多的compaction bytes字節(jié)數(shù),compaction的速率趕不上write患朱, 注意任何減少寫放大的行為都可以減少compaction時需要的字節(jié)數(shù)鲁僚,因此為了加速compaction, 可以設置這幾個參數(shù):
- 增加max_background_compactiom 使得有更多的compaction thread
- 增加write_buffer_size, 可以減少寫方法
- 增加min_write_buffer_number_to_merge
當然裁厅, 可以增加stop/slowdow的觸發(fā)條件冰沙、compaction bytes limit, 這些都可以防止write stall