bigywater.tech
ZooKeeper · 26

请求限流与 request_throttler

ZooKeeper 有两层限制「同时在处理的请求数」的机制:globalOutstandingLimit 和 request_throttle_max_requests。它们的效果、副作用和能在 mntr 里看到什么,这篇都实测一遍。

9089 → 492 次/秒
默认 → request_throttle_max_requests=1 时的异步写吞吐
266.0441 ms
request_throttle_max_requests=10 时 throttle 队列的平均等待
两个机制
globalOutstandingLimit 在读数据前限流;RequestThrottler 是处理链里的一个排队线程

限流参数与吞吐

实测 · 本机执行输出
  默认                                               吞吐    9089 次/秒  max_latency 12 ms  throttle 队列平均等待 0.0064 ms  zk_throttled_ops 0
  -Dzookeeper.globalOutstandingLimit=10            吞吐    2723 次/秒  max_latency 12 ms  throttle 队列平均等待 0.0015 ms  zk_throttled_ops 0
  -Dzookeeper.request_throttle_max_requests=10     吞吐    3299 次/秒  max_latency 354 ms  throttle 队列平均等待 266.0441 ms  zk_throttled_ops 0
  -Dzookeeper.request_throttle_max_requests=1      吞吐     492 次/秒  max_latency 2421 ms  throttle 队列平均等待 1947.8596 ms  zk_throttled_ops 0

这些参数是保护服务端不被突发流量压垮的「刹车」:设得太紧,正常流量也会被排队。数值只是本机单机的测量,不是推荐值。

指标里的痕迹

实测 · 本机执行输出
   ['zk_avg_request_throttle_queue_time_ms', 'zk_cnt_request_throttle_queue_time_ms', 'zk_max_request_throttle_queue_time_ms', 'zk_min_request_throttle_queue_time_ms', 'zk_request_throttle_wait_count', 'zk_sum_request_throttle_queue_time_ms', 'zk_throttled_ops']
  线程: ['RequestThrottler']

分步演示

请求限流
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / ZooKeeper 3.9.6(brew 安装的 jar,用 java -cp 直接启动自己的实例,OpenJDK 17 Temurin,JVM 堆 128 MiB)/ 本机回环端口 7300+,数据在临时目录;默认 tickTime=2000;计时用 time.perf_counter,数字每次运行会有小幅抖动。单机;参数通过 JVM 系统属性设置;20000 次异步 create(100 字节),每个配置只测一次
    • 没有验证:集群里的限流、连接限流 connection throttling(BlueThrottle)、大请求限制(large request)、客户端侧的反压、参数的官方默认值(只测了「不设置」的行为)
    京ICP备2026067502号-1京公网安备11010502063487号