bigywater.tech
ZooKeeper · 18

连接数、Watcher 数量和内存关系

ZooKeeper 服务端要为每个连接、每个 watch 付出多少内存?这篇在 20000 个 znode 的树上,先加 400 个空闲连接,再加 20000 个 watch,每一步都先 GC 再读 JVM 堆,得到每个连接、每个 watch 的大致内存代价。

约 2.6 KiB
每个空闲连接占用的 JVM 堆
约 278 字节
每个 watch 占用的 JVM 堆
去重
同一连接对同一路径的重复注册只算 1 个

连接的代价

实测 · 本机执行输出

watch 的代价

实测 · 本机执行输出
  zk_num_alive_connections = 402;JVM 已用堆 13.4 MiB(+1.0),RSS 127 MiB(+3)

这些数字是在 JVM 堆 256 MiB、小路径的条件下得到的粗略值,只用来估数量级。容量规划见第 60 篇。

重复注册

实测 · 本机执行输出
  zk_watch_count = 20000;JVM 已用堆 18.7 MiB(比只有连接时 +5.3),RSS 144 MiB
  wchs → 400 connections watching 20000 paths Total watches:20000

分步演示

连接与 watch 的内存
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机,maxClientCnxns=2000;连接是 kazoo 客户端;堆用 jcmd GC.run + GC.heap_info 读取;路径形如 /w/n00000
    • 没有验证:Netty 连接(NIO 之外)的内存、路径很长时 watch 的开销、集群里每个节点的 watch 内存、持久 watch 的内存(第 16 篇)、连接的堆外内存
    京ICP备2026067502号-1京公网安备11010502063487号