bigywater.tech
ZooKeeper · 22

大 value 对性能的影响

ZooKeeper 的 value 上限约 1 MiB,但这不代表可以放心用到上限。这篇量不同大小的 value 的读写延迟、频繁改大 value 对事务日志的影响,以及大 value 配上 watch 的放大效应。

约 3 ms
1 KiB~100 KiB 的同步写延迟几乎不变(fsync 主导)
143 MiB
对 100 KiB 的 znode 连续 set 1000 次后事务日志的增长
通知小、重读大
watch 事件不带数据,但每个 watcher 重读都读整份值

延迟与大小

实测 · 本机执行输出
        大小     写 ms     读 ms      写吞吐 MiB/s
      1 KiB     3.01     0.29            0.3
     10 KiB     2.97     0.27            3.3
    100 KiB     2.96     0.27           33.0
    500 KiB     3.98     0.52          122.7
   1000 KiB     4.50     0.73          216.8

这是单机、本机回环的数字,真实网络下大 value 的传输时间会更显著(本文没有测)。

事务日志的增长

实测 · 本机执行输出
  1000 次 set(每次 100 KiB)用时 3.3 s;事务日志实际占盘增长 143.2 MiB(≈ 98 MiB 的写入量);当前只有 1 个这样的 znode,内存里只占 100 KiB

大 value 与 watch

实测 · 本机执行输出
  set 1000 KiB → 通知到达 7.2 ms;通知后读取这 1000 KiB 用 1.9 ms

分步演示

大 value
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机,JVM 堆 256 MiB;每种大小 30 次中位数;事务日志占盘取自 st_blocks
    • 没有验证:集群里大 value 的复制延迟、网络带宽受限时的表现、压缩后的快照大小、小于 1 KiB 的极小 value、客户端侧序列化开销
    京ICP备2026067502号-1京公网安备11010502063487号