为什么需要write stall
我们知道, 当flush/compaction赶不上write rate的速度时,rockdb会降低write rate,甚至直接停写, 如果没有这个策略,会有什么问题?其实主要是两个
- 增加空间放大,耗尽磁盘空间
- 增加读放大, 极大的降低读性能
但是, 有时候,database容易对突然暴增的写太过敏感,或者容易低估hardware的处理能力, 这个时候就会反馈给用户的就是意想不到的slowness 甚至query timeout
一般情况下, 通过这几个地方你可以知道你数据库是不是在进行write stall
- LOG file, info log
- Compaction stats found in Log file
write stall 触发的条件
-
Too many memtable
延缓写: 如果max_write_buffer_number 大于3, 将要flush的memtables大于等于max_write_buffer_number - 1, write 延缓
停写: 如果将要flush 的memtable的个数大于等于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的文件数量达到了level0_slowdown_writes_trigger,write 延缓写
停写: 如果文件数量达到了level0_stop_writes_trigger, 直接停写直到L0->L1的compactiom减少了L0的文件数。
以上两种情况时, 会出现这样的日志
Stalling writes because we have 4 level-0 files
Stopping writes because we have 20 level-0 files -
Too many pending compaction bytes
延缓写: 如果要compation的的字节数达到soft_pending_compaction_bytes,延缓写
停写: 如果该字节数目大于hard_pending_compaction_bytes, 直接停写
Stalling writes because of estimated pending compaction bytes 500000000
Stopping writes because of estimated pending compaction bytes 1000000000
write stall vs write stop
当发生延缓写的时候,rocksdb 会把写速率降低到delayed_write_rate, 如果待compaction的字节数量持续增加, rocksdb的写速率会降低到低于delayed_write_rate。 note: slowdow/停写/待compaction的字节都是针对单个cf的, 而write stall 是针对整个DB的,也就是说:如果某个cf 触发了write stall, 整个DB都会stall (延缓)
如何减少stall
如果stall是由pending flush引起的,可以设置这两个参数
- 增加max_background_flushes 使更多的thread用来flush
- 增加max_write_buffer_number 是待flush的memtable更小
如果stall 是因为L0的文件太多/或者太多的compaction bytes字节数,compaction的速率赶不上write, 注意任何减少写放大的行为都可以减少compaction时需要的字节数,因此为了加速compaction, 可以设置这几个参数:
- 增加max_background_compactiom 使得有更多的compaction thread
- 增加write_buffer_size, 可以减少写方法
- 增加min_write_buffer_number_to_merge
当然, 可以增加stop/slowdow的触发条件、compaction bytes limit, 这些都可以防止write stall