翻译自官方wiki:https://github.com/facebook/rocksdb/wiki/Write-Stalls

转载请注明出处:https://www.cnblogs.com/morningli/p/16791706.html

write stall

当flush或compaction无法跟上写入的速率时,rocksdb有旁路系统来减慢写入速率。如果没有这样的系统,用户如果持续写入比硬件能处理的数据,数据库会发生下面的问题:

  • 增加空间放大,会导致磁盘空间用光
  • 增加读放大,严重损害读性能

这个想法是将写入减慢到数据库可以处理的速度。然而,有时候数据库会对临时的突发写过于敏感,或者低估了硬件的处理能力,所以你可能会看到预料外的慢或者查询超时。

为了找出你的数据库是否有write stall的问题,你可以检查:

  • LOG文件,当write stall发生时会包含info日志
  • 在LOG文件中找到 Compaction stats

write stall的原因

可能会因以下原因触发stall:

  • 太多memtable。当等待flush的memtable的数量大于或者等于max_write_buffer_number,写入会完全停止写来等待flush结束。另外如果max_write_buffer_number 大于3,等待flush的memtable大于或等于max_write_buffer_number-1,写入则会stall。在这些情况下,你将在 LOG 文件中获得类似于以下内容的info日志:

    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

  • 太多0层sst文件。 当0层的sst文件数量达到level0_slowdown_writes_trigger, 写入则会stall。当0层的sst文件数量达到level0_stop_writes_trigger,写入会完全停止,等待0层到1层的compaction减少0层的文件数。在这些情况下,你将在 LOG 文件中获得类似于以下内容的info日志:

    Stalling writes because we have 4 level-0 files

    Stopping writes because we have 20 level-0 files

  • 太多等待compaction的字节数。 当估计等待compaction的字节数达到soft_pending_compaction_bytes,写入则会stall。当评估等待的字节数达到hard_pending_compaction_bytes,写入会完全停止等待compaction。在这些情况下,你将在 LOG 文件中获得类似于以下内容的info日志:

    Stalling writes because of estimated pending compaction bytes 500000000

    Stopping writes because of estimated pending compaction bytes 1000000000

每当stall条件被触发,rocksdb会减少写速度到delayed_write_rate,如果等待compaction的字节还在增加,也有可能会减少到比delayed_write_rate更低。值得注意的一键式是减慢/停止的触发和等待compaction的字节数限制是每个column family单独配置的,但是write stall 是应用到整个数据库的,这意味着如果一个column family触发write stall,整个数据库都会被stall。

非阻塞写

如果触发了一个写减慢/停止,执行Put/Merge/Delete等的程序线程会被阻塞。如果一个减慢在生效中,每个写在处理之前会睡眠一段时间(一般是1ms)。如果写是stall的,线程可以无限制地阻塞。如果不希望线程被阻塞,应用可以通过在WriteOptions中设置no_slowdown = true来避免。在这个选项下,如果写请求因为减慢/stall导致没有完成,会立马返回Status::Incomplete()。

在内部,为了增加性能,rocksdb在写到WAL之前会尝试将来自不同线程的写入请求批处理在一起。然而设置了no_slowdown 的写请求不会这样做,这可能会导致轻微的性能损失。

减轻 write stall

有很多选项你可以调整来减轻write stall。如果你有一些负载可以接受write stall,有些不能,你可以设置一些写请求为 Low Priority Write 来避免延迟敏感的写请求被stall。

如果write stall是由待处理的flush引起的,你可以尝试:

  • 增加 max_background_jobs 使用更多的flush线程
  • 增加 max_write_buffer_number 减少flush的memtable大小(这里是不是写错了??)

如果write stall是由太多0层文件或者太多等待compaction的字节数引起的,compaction跟不上写入的速度。请注意,任何减少写放大的操作都会减少compaction需要写入的字节数,从而加快压缩速度。尝试的选项:

  • 增加 max_background_jobs 使用更多的compaction线程
  • 增加write_buffer_size拥有更大的memable,减少写放大
  • 增加min_write_buffer_number_to_merge

你可以设置停止/减慢触发器和待compacrion字节数限制为一个很大的数字来避免发生write stall。如果你正在批量导入数据到rocksdb也可以看一下在 FAQ 中的“What's the fastest way to load data into RocksDB?”。

写缓冲区管理器stall

WriteBufferManager 提供一个了选项allow_stall可以传递给WriteBufferManager的构造函数。如果设置为true,当内存使用超过buffer_size (软限制)时会stall所有写入。它将等待刷新完成并且内存使用量下降。应用可以通过在设置WriteOptions中设置no_slowdown = true来避免。

【翻译】rocksdb write stall的更多相关文章

  1. tikv性能参数调优

    tiKV 最底层使用的是 RocksDB(tidb3.0版本中将使用tian存储引擎) 做为持久化存储,所以 TiKV 的很多性能相关的参数都是与 RocksDB 相关的.TiKV 使用了两个 Roc ...

  2. 【翻译】rocksdb调试指引

    rocksdb调试指引 翻译自官方wiki:https://github.com/facebook/rocksdb/wiki/RocksDB-Tuning-Guide 转载请注明出处:https:// ...

  3. Rocksdb Compaction原理

    概述 compaction主要包括两类:将内存中imutable 转储到磁盘上sst的过程称之为flush或者minor compaction:磁盘上的sst文件从低层向高层转储的过程称之为compa ...

  4. Android官方多媒体API Mediacodec翻译(一)

    因近期工作调整,关于Mediacodec部分的翻译会暂停,后续有时间一定补上,非常抱歉. 本文章为根据Android Mediacodec官方英文版的原创翻译,转载请注明出处:http://www.c ...

  5. [翻译]Kafka Streams简介: 让流处理变得更简单

    Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Ka ...

  6. 通向码农的道路(enet开源翻译计划 一)

    QQ 324186207群 enet交流技术.主要是为了研究tcp内部执行机制,欢迎大家增加探讨.小弟水平有限.翻译难免有误. . Features: ENet evolved specificall ...

  7. 【翻译】Jay Kreps - 为何流处理中局部状态是必要的

    译者注: 原文作者是 Jay Kreps,也是那篇著名的<The Log: What every software engineer should know about real-time da ...

  8. 聊聊RocksDB Compact

    | 导语 对于 LevelCompact 策略,RocksDB会根据每一层不同的策略计算出CompactScore,根据CompactScore大小来决定那一层将会优先进行Compact,然后选择Le ...

  9.  Meltdown论文翻译【转】

    转自:http://www.wowotech.net/basic_subject/meltdown.html#6596 摘要(Abstract) The security of computer sy ...

  10. [翻译]HLS实践

    最近公司项目没事做,课余实践研究一下技术,算是积累,也可以用到项目里,从零开始记录 HLS:Http Live Streaming 官方文档 https://developer.apple.com/s ...

随机推荐

  1. 建木在 Rainbond 上使用实践

    建木 是一个面向 DevOps 领域的极易扩展的开源无代码(图形化)/低代码(GitOps)工具,可以帮助用户轻松编排各种DevOps流程并分发到不同平台执行. 建木的图形化编排提供了多个节点,节点可 ...

  2. day05-SpringCloud Eureka-服务注册与发现02

    SpringCloud Eureka-服务注册与发现02 3.搭建EurekaServer集群-实现负载均衡&故障容错 3.1为什么需要集群EurekaServer? 微服务RPC远程服务调用 ...

  3. elasticsearch 官方优化建议

    1.一般建议   a.不要返回过大的结果集.这个建议对一般数据库都是适用的,如果要获取大量结果,可以使用search_after api,或者scroll (新版本中已经不推荐).   b.避免大的文 ...

  4. AtCoder Beginner Contest 061 - D Score Attack

    给定一张边带权的有向图.从节点\(1\)出发,每经过一条边一次,得分加上这条边的边权.(可以多次经过,多次累加 必须在点\(n\)结束游戏 判断是否能使得分无限大,如果否,求最大得分. sol 题目所 ...

  5. 基于sanic和爬虫创建的代理ip池

    搭建免费的代理ip池 需要解决的问题: 使用什么方式存储ip 文件存储 缺点: 打开文件修改文件操作较麻烦 mysql 缺点: 查询速度较慢 mongodb 缺点: 查询速度较慢. 没有查重功能 re ...

  6. Node工程的依赖包管理方式

    作者:京东零售 陈震 在前端工程化中,JavaScript 依赖包管理是非常重要的一环.依赖包通常是项目所依赖的第三方库.工具和框架等资源,它们能够帮助我们减少重复开发.提高效率并且确保项目可以正确的 ...

  7. 从原理到应用,人人都懂的ChatGPT指南

    作者:京东科技 何雨航 引言 如何充分发挥ChatGPT潜能,已是众多企业关注的焦点.但是,这种变化对员工来说未必是好事情.IBM计划用AI替代7800个工作岗位,游戏公司使用MidJourney削减 ...

  8. 长文多图一步步讲清楚:DDD理论、建模与代码实现全流程

    欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 六个问题 1.1 ...

  9. 2023-04-13:给定一个字符串数组strs,其中每个字符串都是小写字母组成的, 如果i < j,并且strs[i]和strs[j]所有的字符随意去排列能组成回文串, 那么说(i,j)叫做一个互补

    2023-04-13:给定一个字符串数组strs,其中每个字符串都是小写字母组成的, 如果i < j,并且strs[i]和strs[j]所有的字符随意去排列能组成回文串, 那么说(i,j)叫做一 ...

  10. 2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆

    2021-04-29:给定一个数组 arr,代表一排有分数的气球.每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆 ...