本文来源于阿里云社区电子书《阿里云产品四月刊》
《阿里云产品四月刊》—得物 ZooKeeper SLA 也可以 99.99%丨最佳实践(2)https://developer.aliyun.com/article/1554139
性能压测
JMH 微基准测试
ZooKeeper 3.6.4 源码编译, JMH micor 压测 WatchBench。
- pathCount:表示测试中使用的 ZNode 路径数目。
- watchManagerClass:表示测试中使用的 WatchManager 实现类。
- watcherCount:表示测试中使用的观察者(Watcher)数目。
- Mode:表示测试的模式,这里是 avgt,表示平均运行时间。
- Cnt:表示测试运行的次数。
- Score:表示测试的得分,即平均运行时间。
- Error:表示得分的误差范围。
- Units:表示得分的单位,这里是毫秒/操作(ms/op)。
ZNode 与 Watcher 100 万条订阅关系,默认版本使用 50MB,优化版只需要 0.2MB,而且不会线性增加。
添加 Watch,优化版(0.406 ms/op)比默认版(2.669 ms/op)提升 6.5 倍。
大量触发 Watch ,优化版(17.833 ms/op)比默认版(84.455 ms/op)提升 5 倍。
性能压测
接下来在一台机器 (32C 60G) 搭建一套 3 节点 ZooKeeper 3.6.4 使用优化版与默认版进行容量压测对比。
Znode 短路径: /demo/znode1
Znode 长路径:
/sentinel-cluster/dev/xx-admin-interfaces/lock/_c_bb0832d5-67a5-48ab-8fe0
-040b9ddea-lock/12
Watch 内存占用跟 ZNode 的 Path 长度有关。
Watch 的数量在默认版是线性上涨,在优化版中表现非常好,这对内存占用优化来说改善非常明显。
灰度测试
基于前面的基准测试和容量测试,优化版在大量 Watch 场景内存优化明显,接下来开始对测试环境的 ZK 集群进行灰度升级测试观察。
第一套 ZooKeeper 集群 & 收益
默认版
优化版
效果收益:
- election_time (选举耗时):降低 60%
- fsync_time (事务同步耗时):降低 75%
- 内存占用:降低 91%
第二套 ZooKeeper 集群 & 收益
效果收益:
- 内存:变更前 JVM Attach 响应无法响应,采集数据失败。
- election_time(选举耗时):降低 64%。
- max_latency(读延迟):降低 53%。
- proposal_latency(选举处理提案延迟):1400000 ms --> 43 ms。
- propagation_latency(数据的传播延迟):1400000 ms --> 43 ms。
第三套 ZooKeeper 集群 & 收益
默认版
优化版
效果收益:
- 内存:节省 89%
- election_time(选举耗时):降低 42%
- max_latency(读延迟):降低 95%
- proposal_latency(选举处理提案延迟):679999 ms --> 0.3 ms
- propagation_latency(数据的传播延迟):928000 ms--> 5 ms
总结
通 过 之 前 的 基 准 测 试 、 性 能 压 测 以 及 灰 度 测 试 , 发 现 了 ZooKeeper 的WatchManagerOptimized。这项优化不仅节省了内存,还通过锁的优化显著提高了节点之间的选举和数据同步等指标,从而增强了 ZooKeeper 的一致性。还与阿里 MSE 的同学进行了深度交流, 各自在极端场景模拟压测, 并达成了一致的看法:
WatchManagerOptimized 对 ZooKeeper 的稳定性提升显著。总体而言,这项优化使得 ZooKeeper 的 SLA 提升了一个数量级。
ZooKeeper 有许多配置选项,但大部分情况下不需要调整。为提升系统稳定性,建议进行以下配置优化:
- 将 dataDir(数据目录)和 dataLogDir(事务日志目录)分别挂载到不同的磁盘上,并使用高性能的块存储。
- 对于 ZooKeeper 3.8 版本,建议使用 JDK 17 并启用 ZGC 垃圾回收器;而对于
3.5 和 3.6 版本,可使用 JDK 8 并启用 G1 垃圾回收器。针对这些版本,只需要简单配置 -Xms 和 -Xmx 即可。
- 将 SnapshotCount 参数默认值 100,000 调整为 500,000,这样可以在高频率ZNode 变动时显著降低磁盘压力。
- 使用优化版的 Watch 管理器 WatchManagerOptimized。