美文网首页
rocksdb 的write stall

rocksdb 的write stall

作者: luomoxyz | 来源:发表于2019-11-09 16:44 被阅读0次

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

相关文章

  • rocksdb 的write stall

    为什么需要write stall 我们知道, 当flush/compaction赶不上write rate的速度时...

  • rocksdb系列之write stall

    为什么需要write stall 我们知道, 当flush/compaction赶不上write rate的速度时...

  • Tuning RocksDB - Options

    在先前我们讨论了 RocksDB 的 statistics 和 write stall,但这些只能让我们发现问题,...

  • Tuning RocksDB - Write Stalls

    RocksDB 使用 LSM 的方式用来提升写入的性能,但如果写入过快,超过了 RocksDB 处理的极限,Roc...

  • RocksDB源码分析 Write

    写入流程 将一条或者多条操作的记录封装到WriteBatch 将记录对应的日志写到WAL文件中 将WriteBat...

  • RocksDB 的 Group Write 机制

    RocksDB 是 LSM-tree 结构的 KV 存储,写入的数据先通过 WAL 持久化,再写入到 memtab...

  • RocksDB系列六:Write Ahead Log

    对RocksDB的每一次update都会写入两个位置:1) 内存表(内存数据结构,后续会flush到SST fil...

  • RocksDB系列七:Write Buffer Manager

      Write buffer mnager帮助开发者管理列族或者DB instance的内存表的内存使用。 管理内...

  • stall

    场景:职场发展停滞不前。 造句:It seems my career stalls.

  • stall

    1. 认识这个词(基础篇) 词:stall 英英释义:to stop making progress or dev...

网友评论

      本文标题:rocksdb 的write stall

      本文链接:https://www.haomeiwen.com/subject/risnbctx.html