RocksDB 7 终于解决了 Compaction 时性能下降问题
RocksDB 社区提到在 7.5.3 版本在修复 Compaction 计算问题之后优化效果十分明显。Kvrocks 社区贡献者 @zhaoxiaobiao 对此进行验证,证明了新版本 Compaction 过程写入性能的确很平稳,十分值得期待。
Kvrocks 的社区用户 Juan Crescente 在 RocksDB 社区的 Google Group 里发起了一个讨论: Performance of compactions (kvrocks),主要的意思是 RocksDB 在大批量持续导入数据场景下 Write Stall 会导致服务不可用:
RocksDB 社区的 Mark 回复可以尝试 7.5.3 版本,该版本大大优化了 Compaction 的 Write Stall 时间,具体如下:
Kvrocks 社区的贡献者 @zhaoxiaobiao 之前也遇到过类似的问题,对于该优化十分感兴趣,尝试验证之后将测试数据结果分享到社区。 从整体测试结果来看,RocksDB 7.7.3 的 Compaction 过程对于写入 QPS 和延时基本没有影响,而对比组的 RocksDB 6.29.5 在 Compaction 期间 QPS 会几乎掉到 0。
带来这个优化的主要原因是 RocksDB 7.5.3 修复了一个 Compaction Pending Bytes 计算放大的问题,具体见: rocksdb #issue 9423[6]
测试环境
分别使用 RocksDB 6.29.5/7.7.3 编译 Kvrocks,然后按照如下图部署测试环境:
其中
VM - A
和 VM - B
配置都为:
- CPU: 4 核
- 内存: 32 GiB
- 磁盘: 890G NVME SSD
压测机器 VM - C
是 4 CPU / 8GiB 内存并使用 memtier_benchmark
作为客户端来给 Kvrocks 写入数据。
具体命令如下:
docker run -d --rm redislabs/memtier_benchmark:latest -t 2 -c 20 -s 172.27.255.231 -p 6666 --distinct-client-seed --key-minimum=100000000 --key-maximum=10000000000 --random-data --data-size=10000 -n 10000000000 --command "set __key__ __data__"
其中 memtier_benchmark
的 -c -t 参数是多次实验后,综合吞吐量和超时后选定的最优解。同时设置了定时任务,每隔两小时向 Kvrocks 发起一次手动 Compact 请求 (也可使用 Kvrocks Compact Cron)。
测试结果
以下是来自 @zhaoxiaobiao 的测试数据,对比图统一使用绿色线表示 RocksDB 6.x (6.29.5
) ,使用黄色表示新版本 RocksDB 7.x (7.7.3
)。但由于篇幅有限,下面展示对照组中的差异指标:
CPU 对比
从 CPU 来看,Compaction 期间 RocksDB 6.x 波动范围比较大,波谷主要是由于 6.x 的 Compaction 和写入有锁竞争导致 CPU 利用率急剧下降,而 7.x 几乎没有波动。同时,最后一段时间停掉写之后,7.x 的 Compaction 的 CPU 利用率也比 6.x 少 40% 左右。
OPS 对比
从 OPS 的对比来看, RocksDB 6.x 的 OPS 波谷和 CPU 几乎是一致的,Compaction 期间可能会几乎掉到 0,而 7.x 则是十分稳定。
延时对比
同样,RocksDB 6.x 的延时在 Compaction 期间也会有剧烈的波动,而 RocksDB 7.x 则表现十分平稳,甚至低到在对比图中几乎看不到。
为了可以更清楚看到 7.x 的延时情况,下图把 RocksDB 6.x 去掉,可以看到新版本的延时几乎没有波动。
Compaction 耗时对比
同样的数据量,RocksDB 7.x 会比 RocksDB 6.x Compaction 的持续周期会更长一些。说明了 RocksDB 7.x 除了锁优化之外,也将后台的 Compaction 相关的周期拉得更长来规避影响正常的读写请求。
其他关键指标
从 Estimate Keys 数量以及 DB 大小来看,两个版本存储的数据量比较接近,整体上符合预期。
磁盘读写也印证了 RocksDB 7.X 在 Compact 策略上会比 6.x 更加缓和,从本次测试结果来看几乎对于实时读写没有造成任何影响。
总结
从以上单次的压测数据来看,RocksDB 7.x 版本的 Compaction 几乎没有对写入造成太大影响。主要优化来自两方面:
- RocksDB 修复了 Compaction Pending Bytes 计算放大问题导致长时间 Write Stall 问题,具体讨论见: rocksdb #issue 9423
- 减少了 Compaction 和写入的锁竞争,从而规避了 Compaction 期间阻塞写入问题
其实在更早之前 @aleksraiden 就在 Kvrocks 社区发起过将 RocksDB 升级到 7.x 的讨论: Change RocksDB to 7.х?,考虑到稳定性以及当时还没有看到明显收益,所以没有继续往前推进。但有了这次具体的测试案例和数据,社区可以更快去推进 RocksDB 7.x 在 Kvrocks 的落地。目前 @zhaoxiaobiao 也已经提了 PR #1056,欢迎更多用户的测试和反馈。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker 与 WasmEdge 合作,发布 WebAssembly 支持
在 KubeCon NA 2022 的 Cloud native Wasm day 活动上, Docker 与 CNCF 的 WasmEdge Runtime 项目发布了 Docker+Wasm 技术预览。 只需一个命令 docker compose up, 上千万的 Docker 开发者可以立即构建、共享并运行一个完整的 Wasm 应用。 Wasm 最初是作为 Web 浏览器中的安全沙箱而开发的。近年来,它在服务器端作为 VM 和 Linux 容器 (LXC) 的安全、轻量级、快速和可移植的替代方案,有了很多应用程序。Linux 容器这一领域最初由 Docker 开创。 Docker+Wasm 中的标准 demo 应用是由 Second State 提供的。这是一个数据库驱动的 Web 应用程序,它有一个用于整个 Web 服务(微服务)的 WasmEdge “容器”,以及两个用于支持服务的 Linux 容器:一个用于 MySQL 数据库,一个用于 Niginx,为前端 UI 提供静态 HTML 页面。 这三个容器在同一个网络中并排运行并形成一个应用程序。 微服务用 Rust 编写并编...
- 下一篇
EMQX 规则引擎集成新的可观测性框架
十月,EMQX 在产品质量和用户体验方面进行了进一步提升,同时 QUIC 相关开发工作也在持续进行中。 此外,EMQX Cloud 在订阅渠道、部署地区、操作体验等方面均有更新。 EMQX 产品质量提升 在过去的 10 月,EMQX 团队的工作重点是提升所有支持版本的产品质量。我们解决了共享订阅的问题,以及 HTTP auth 与 Webhook 中 HTTPS 长期连接时可能导致的请求大量超时问题。 更好的运维体验 我们在 EMQX 5.0 企业版的规则引擎指标中集成了 Open telemetry 框架,它是一个供应商中立的开源可观测性框架,可用于生成、收集、可视化以及导出包括 Trace、指标、日志等遥测数据。 QUIC 更新 quicer 中多条流(Stream)传输的开发工作已经接近尾声,经过一些调整后我们会将其引入 EMQX 以及 EMQ 开发的 Erlang 客户端库 emqtt。 用户体验改进 我们改进了用于消息发布的 REST API,使其更成熟稳定。我们已经开始了一个针对 REST API 的专项行动,旨在为用户提供一致的 REST API 体验并解决其中不合理的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19