这个配置指定了等待处理的最大请求数量的限制(zookeeper.globalOutstandingLimit)
client发送请求的速度可能会比server端处理的速度快,会导致请求在server端排队,最终(在若干秒内)会使server的内存耗尽。
为了避免这一点,如果等待的请求数量达到了globalOutstandingLimit,server端会拒绝client的请求。
但是这个限制不是hard限制。每一个client至少能有一个outstanding请求,否则连接会开始出现超时。
所以,当达到globalOutstandingLimit之后,只有在没有任何的pending请求时,server才会从client连接读取数据
为了决定某一台确定的server的限制,可以简单的用这个配置项的值除以server的数量。
现在没有一种聪明的方式来决定这个值来进行限制,总的说来,这个配置项的值就是outstanding请求的上限。
实际上,负载无法在server间进行均衡,总有一些server的负载会高一些,即使没有达到上限。
默认的限制为1000个请求。通常不需要改变这个配置,如果有很多client会发送非常大的请求,你需要调低这个值,但是在实践中通常不需要改变这个值。
//最大请求堆积数。默认是1000。ZK运行的时候, 尽管server已经没有空闲来处理更多的客户端请求了,但是还是允许客户端将请求提交到服务器上来,以提高吞吐性能。当然,为了防止Server内存溢出,这个请求堆积数还是需要限制下的。
(Java system property:zookeeper.globalOutstandingLimit. )
globalOutstandingLimit 的配置
export JVMFLAGS="-Xloggc:$ZOOBINDIR/../../logs/zk.gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -Dzookeeper.globalOutstandingLimit=2000 $JVMFLAGS"
生效, 可以看出 如果设置了2000, 3台机器, 那么每台机器限制是 2000/(3-1) = 1000
@Override public int getGlobalOutstandingLimit() { return super.getGlobalOutstandingLimit() / (self.getQuorumSize() - 1); }