bigywater.tech
ZooKeeper · 60

ZooKeeper 容量规划

要给 ZooKeeper 配多大的堆、多大的磁盘?拍脑袋不如拟合:用几组真实的 znode 数与数据大小测出堆占用,拟合一个线性模型,再拿一个没测过的配置验证预测。

≈ 629 B + 数据
每个 znode 的堆开销(路径 8 字符)
0.9%
预测 10 万 × 500 字节的误差
56 MiB
该配置的快照文件大小(磁盘规划用)

三个测量点

实测 · 本机执行输出
    50000 个 znode ×  100 字节:堆增量   36.0 MiB;快照    8.8 MiB
    50000 个 znode × 1000 字节:堆增量   79.7 MiB;快照   51.7 MiB
   150000 个 znode ×  100 字节:堆增量  104.5 MiB;快照   26.5 MiB
  拟合:每个 znode 约 629 字节的固定开销,每个数据字节约 1.04 字节(最小二乘,只有 3 个数据点,只用来估数量级)

拟合只用了 3 个点、2 个参数,所以它只是「数量级估计」。路径越长、子节点越多,每个 znode 的开销越大(本文没有改变路径长度)。

预测与验证

实测 · 本机执行输出
  预测堆增量 109.7 MiB;实测 110.7 MiB;误差 0.9%;快照文件 55.8 MiB

连接和 watch

实测 · 本机执行输出
  同样 50000 × 100 字节的树,加 300 个连接和 6000 个 watch:堆增量 40.3 MiB(没有连接时 36.0 MiB,多了 4.2 MiB)

规划时还要考虑的

这篇只量了堆。磁盘要按「快照大小 × 保留份数 + 事务日志」估算(第 54 篇);堆要在预测值之上留出 GC 余量(第 62 篇看 GC 停顿);连接数、watch 数按第 18 篇的单价估算。这些是规划思路,不是本文实验的结论。

分步演示

容量估算
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。JVM 堆 512 MiB,堆增量 = GC 之后的已用堆 − 空节点基线;路径固定 8 个字符;3 个拟合点 + 1 个验证点 + 1 个连接 / watch 点
    • 没有验证:路径长度、父子层级、临时节点、ACL 对每个 znode 开销的影响;G1 之外的垃圾回收器;堆使用率到多少会引起明显的 GC 压力
    京ICP备2026067502号-1京公网安备11010502063487号