本文翻译自 RocksDB 官方 Wiki《Write Buffer Manager》:

https://github.com/facebook/rocksdb/wiki/Write-Buffer-Manager

翻译者:fanrui

Write buffer manager 帮助用户控制多个 column family 和 DB 实例的 MemTable 内存消耗。通过 Write Buffer Manager,用户可以实现:

  1. 尝试将多个 Column Family 和 DB 的 MemTable 总内存限制在一个阈值以下。
  2. 允许 MemTable 使用 Block Cache 的内存

Write buffer manager 的使用与 rate_limiter 和 sst_file_manager 类似。用户可以创建一个 write buffer manager 对象,并将其传递给你希望由该对象控制 MemTable 大小的 Column Family 或 DB 选项。看 write_buffer_manager.h 的代码注释可以看到如何使用。

限制 MemTable 的总内存

创建 write buffer manager 对象时可以给出内存限制。RocksDB 将会尽量控制总的使用内存在限制以下。

在 5.6 及其之后的版本,如果可变的 MemTable 的总大小超过了内存限制的 90%,那么 RocksDB 的相应 Column Family 就会触发 flush。如果实际的内存使用超过了限制,即使可变的 MemTable 使用的内存低于 90%,也会非常积极地触发 flush。在 5.6 版本之前,如果可变的 MemTable 大小超过了限制,则会触发 flush。

在 5.6 及其之后的版本,所有被 write buffer manager 管理的内存都会被计算在内,不仅仅是 MemTable 的内存使用。5.6 之前的版本,内存的计算仅仅按照 MemTable 的实际使用来计算的。

MemTable 使用 Block Cache 的内存

从 5.6 版本之后,用户可以配置 MemTable 使用 Block Cache 的内存。这个配置不管是否开启了 MemTable 内存的限制。

大多数情况,Block Cache 中 MemTable 相比 data block 仅仅占比较小的比例。所以当用户开启这个功能,Block Cache 的容量将会包含所有 Block Cache 和 MemTable 的内存使用。如果用户启用 cache_index_and_filter_blocks,那么 RocksDB 中三个主要的内存使用都会被单个上限进行限制。

下面是实现原理:每次分配给 MemTable 1MB 的内存,WriteBufferManager 将会放 1MB 的虚拟项到 Block Cache 中,这样 Block Cache 就可以知道实际的使用大小,从而淘汰 Block 来获取内存空间。对于 MemTable 内存使用减少的情况,WriteBufferManager 并不会立即删除这些虚拟项,而是在内存使用量显著降低时再缓慢地删除这些虚拟项。这是因为 MemTable 的内存总是在自然地上下浮动,因此我们尝试减少对 Block Cache 的干扰。

通过以下方式开启这个功能:

  • 将 Block Cache 传递给即将使用的 WriteBufferManager
  • 将 MemTable 期望使用的最大内存传递给 WriteBufferManager
  • 设置 Block Cache 的容量为 data block 缓存和 MemTable 的总大小

rocksdb原理_手摸手学习 RocksDB 的 Write Buffer Manager相关推荐

  1. 招聘行业颠覆者【伯小乐】| 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 作者微信:weihe2416 "伯小乐" 是 ...

  2. 短视频Gif快手-有点意思 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告.                                 ...

  3. IN-我的生活in记 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 引言 IN是一款基于女性和品牌的时尚品位分享移动端社区,以图片社 ...

  4. 玩美自由行体验报告 | 手摸手产品研究院

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 个人微信:Hm_VS_Zyf 玩美自由行app是一款在线境外旅行 ...

  5. 手摸手产品研究院 | 玲珑沙龙-一个可以“撕逼”的女性文化社区

    手摸手产品研究院是由PMCAFF发起的深度研究产品的产品经理精华小分队,旨在每天一起研究一款产品,并且由阿德老师手摸手指导写分析报告. 1-玲珑沙龙? 什么是玲珑沙龙,那些人在玩玲珑沙龙,为什么会玩? ...

  6. 手摸手,带你用vue撸后台 系列一(基础篇) - 掘金

    完整项目地址:vue-element-admin 系列文章: 手摸手,带你用 vue 撸后台 系列一(基础篇) 手摸手,带你用 vue 撸后台 系列二(登录权限篇) 手摸手,带你用 vue 撸后台 系 ...

  7. 带你手摸手搭建vuepress站点

    vuePress是什么? VuePress 俺简单介绍下,是国内有名大神的尤雨溪发布的全新基于 vue 静态网站的生成器,内置的有 webpack组件,可以拿来写文档,主要是md格式.做出的感觉就是简 ...

  8. 手摸手带你学移动端WEB开发

    HTML常用标签总结 手摸手带你学CSS HTML5与CSS3知识点总结 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP ...

  9. 微信小程序开发❤手摸手撸小程序一篇就够!

    手摸手撸小程序!!超简单,一篇就够! 微信小程序介绍 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用 ...

  10. 微服务(三) 【手摸手带你搭建Spring Cloud】 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡?ribbon负载均衡有几种策略?Ribbon是什么?

    在上一章,我介绍了springcloud的eureka搭建.我们做了服务注册.最后我们还介绍了一些续约,失效剔除等参数配置.已经不需要再通过手动输入ip去访问服务,而是通过中心只需要通过服务名就可以获 ...

最新文章

  1. Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)
  2. 【深度学习】深度学习之对抗样本问题和知识蒸馏技术
  3. [Python]网络爬虫(三):异常的处理和HTTP状态码的分类
  4. word排版案例报告_停工不停学丨项目部开展Word办公软件使用技能培训
  5. P1975 [国家集训队]排队(三维偏序)
  6. php 检测网址是否有效
  7. net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.console.demo.web.model.XXX
  8. AngularJS 后台交互
  9. 【学亮IT手记】Ajax跨域问题精讲--jQuery解决跨域操作
  10. 【经验总结—2】:深度学习数据集下载网站总结
  11. 无线蓝牙耳机选购小知识,2020新款上市五大高人气蓝牙耳机推荐
  12. word论文封面下划线对齐
  13. WGCLOUD部署对服务器硬件配置的一些建议
  14. Halcon 识别DataMatrix二维码
  15. Docker入门详解
  16. 很真实的语音转文字,微软厉害
  17. 如何优雅的抄袭代码?天下代码一大抄,这才是正确的姿势
  18. 防孤岛保护装置在光伏行业的应用
  19. Arnold折射中使用LPE单独提取某个材质的渲染结果
  20. 几乎必问,Spring 面试题开胃菜

热门文章

  1. 自定义滚动条Js简版
  2. HTML a 标签的正则表达式
  3. 翻译JScript中的面向对象系列文章
  4. 浅谈多进程多线程的选择(转)
  5. ESP8266-SDK编写的TM1668程序驱动数码管
  6. BLE 绑定流程(转自襄坤在线)
  7. (chap2 简单的Http协议) HTTP性能优化之持久连接Keep Alive
  8. 《研磨设计模式》chap18 状态模式state(3)应用到场景
  9. 【python】数据结构与算法之二分查找
  10. 02-Armv8-A Instruction Set Architecture