bigywater.tech
ZooKeeper · 61

ZooKeeper 延迟与吞吐

ZooKeeper 能扛多少请求?延迟随并发怎么变?这篇用不同数量的并发客户端(每个客户端一个请求接一个请求)压单机与 3 节点集群,画出吞吐与延迟的变化。

330 → 5130
单机同步写吞吐:1 个 → 64 个并发客户端(次/秒)
84%
3 节点集群相对单机的写吞吐(64 个客户端)
读被客户端限制
Python GIL 让读吞吐封顶约 4700 次/秒

单机

实测 · 本机执行输出
  [单机]
     并发客户端   写 ops/s   写 p50 ms   写 p99 ms   读 ops/s   读 p50 ms   读 p99 ms
         1       330       3.01       5.03      7187       0.14       0.19
         4       733       5.87       7.31      5090       0.76       1.40
        16      3298       4.87       7.40      4764       3.25       6.21
        64      5130      12.06      21.09      4687      13.19      24.55

每个客户端都是一个线程、一个独立的 kazoo 连接,同步调用(上一个请求返回才发下一个)。

3 节点集群

实测 · 本机执行输出
  [3 节点]
     并发客户端   写 ops/s   写 p50 ms   写 p99 ms   读 ops/s   读 p50 ms   读 p99 ms
         1       187       5.09       9.34      6647       0.15       0.21
         4       471       8.15      12.75      4884       0.79       1.44
        16      2076       7.57      11.96      4572       3.38       6.56
        64      4306      14.41      24.04      4573      13.55      25.40

客户端连接均匀分布在 3 个节点上;写请求仍然由 leader 排序。

这些数字的局限

客户端和服务端在同一台机器上抢 CPU;客户端是 Python,读吞吐很早就被 GIL 限制了;磁盘是本机 SSD。这些数字只用来看曲线的形状(吞吐随并发上升、延迟随并发上升、集群写比单机慢),不要当作容量规划的依据——需要用真实的压测工具和真实的硬件重测。

分步演示

延迟与吞吐
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。每个并发级别运行 5 秒;写 100 字节;客户端是同一进程里的 kazoo 线程
    • 没有验证:更大的并发(数百到数千个客户端)、读为主的混合负载、observer 的读吞吐、客户端换成 Java / Go 后的上限、跨机器网络
    京ICP备2026067502号-1京公网安备11010502063487号