RocksDB 7 终于解决了 Compaction 时性能下降问题

RocksDB 社区提到在 7.5.3 版本对 Compaction 优化效果十分明显,Kvrocks 社区贡献者 @zhaoxiaobiao 对此进行验证,证明在测试过程中新版本 Compaction 过程写入性能很平稳,十分值得期待。
来自 Kvrocks 的社区用户 Juan Crescente 在 RocksDB 社区发起了一个讨论: Performance of compactions (kvrocks),主要的意思是 RocksDB 在大批量持续导入数据时会导致服务不可用:

RocksDB 社区的 Mark 回复可以尝试 7.5.3 版本,该版本大大优化了 Compaction 的时间,具体如下:

Kvrocks 社区的贡献者 @zhaoxiaobiao 之前也遇到过类似的问题,对于这个优化十分感兴趣,并将测试数据结果分享到社区里面。 从整体测试结果来看,RocksDB 7.7.3 的 Compaction 过程对于写入 QPS 和延时基本没有影响,而对比组的 RocksDB 6.29.5 在 Compaction 期间 QPS 会几乎掉到 0。
以下是来自 @zhaoxiaobiao 的测试数据,对比图中统一使用绿色线表示 RocksDB 6.x (6.29.5
) ,使用黄色表示新版本 RocksDB 7.x (7.7.3
)。
测试环境
分别使用 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 写入数据。
具体命令如下:
其中 memtier_benchmark
的 -c -t 参数是多次实验后,综合吞吐量和超时后选定的最优解。同时设置定时任务,每隔两小时向 Kvrocks 发起一次手动 Compact 请求 (也可使用 Kvrocks Compact Cron)。
测试结果
由于篇幅有限,下面只展示对照组的差异部分数据:
CPU 对比
从 CPU 来看,Compaction 期间 RocksDB 6.x 波动范围比较大,波谷主要是由于 6.x 的 Compaction 和写入会有锁竞争导致 CPU 利用率下降,而 7.x 几乎没有波动。同时,最后一段时间停掉写之后,7.x 的 Compact 的 CPU 利用率也比 6.x 少 40% 左右。

OPS 对比
可以看到 OPS 的对比来看, RocksDB 6.x 的 OPS 波谷和 CPU 几乎是一致的,Compaction 期间可能会几乎掉到 0,而 7.x 则是十分稳定。

延时对比
同样,RocksDB 6.x 的延时在 Compaction 期间会有剧烈的波动,而 RocksDB 7.x 则表现十分平稳,低到在对比图中几乎看不到。

为了看得更清楚,下图把 RocksDB 6.x 去掉,可以看到新版本的延时几乎没有波动。

Compaction 耗时对比
可以看到同样的数据量,RocksDB 7.x 会比 RocksDB 6.x 持续周期更长一些,说明是 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 就发起过将 RocksDB 升级到 7.x 的讨论: Change RocksDB to 7.х?,但考虑到稳定性以及没有看到明显收益,所以没有继续往前推进,但有了具体的测试案例和数据,社区则可以更快去推进 RocksDB 7.x 在 Kvrocks 里面的升级。目前 @zhaoxiaobiao 也提了 PR #1056,欢迎更多用户的测试和反馈。
版权声明: 本文为 InfoQ 作者【Kvrocks】的原创文章。
原文链接:【http://xie.infoq.cn/article/32f6d8814febc267cd3357592】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论