要给 ZooKeeper 配多大的堆、多大的磁盘?拍脑袋不如拟合:用几组真实的 znode 数与数据大小测出堆占用,拟合一个线性模型,再拿一个没测过的配置验证预测。
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
同样 50000 × 100 字节的树,加 300 个连接和 6000 个 watch:堆增量 40.3 MiB(没有连接时 36.0 MiB,多了 4.2 MiB)
这篇只量了堆。磁盘要按「快照大小 × 保留份数 + 事务日志」估算(第 54 篇);堆要在预测值之上留出 GC 余量(第 62 篇看 GC 停顿);连接数、watch 数按第 18 篇的单价估算。这些是规划思路,不是本文实验的结论。