rocksdb系列之write stall

为什么需要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

推荐阅读更多精彩内容