rocksdb 的write stall

2019-11-09  本文已影响0人  luomoxyz

为什么需要write stall

我们知道, 当flush/compaction赶不上write rate的速度时,rockdb会降低write rate,甚至直接停写, 如果没有这个策略,会有什么问题?其实主要是两个

但是, 有时候,database容易对突然暴增的写太过敏感,或者容易低估hardware的处理能力, 这个时候就会反馈给用户的就是意想不到的slowness 甚至query timeout

一般情况下, 通过这几个地方你可以知道你数据库是不是在进行write stall

write stall 触发的条件

延缓写: 如果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

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引起的,可以设置这两个参数

如果stall 是因为L0的文件太多/或者太多的compaction bytes字节数,compaction的速率赶不上write, 注意任何减少写放大的行为都可以减少compaction时需要的字节数,因此为了加速compaction, 可以设置这几个参数:

上一篇 下一篇

猜你喜欢

热点阅读