项目使用的是 dubbo 框架, 注册中心使用的是 zookeeper。项目自发布以来平稳迭代运行了18个月,但在某个周五,正等待下班之际,突然传出噩耗,app打开非常卡顿且有大量报错。20分钟之后,网关服务(consumer)宕机了。
网关服务器cpu爆了。
通过 netstat -anp|grep port
查看发现有大量的 TIME_WAIT
的线程。
搜寻网关日志,重点发现有两个报错:
java.io.IOException: Packet len4235458 is out of range!
Background retry gave up
org.apache.curator.CuratorConnectionLossException: KeeperErrorCode = ConnectionLoss
上网搜了很多,都说是要增加 jute.maxbuffe
参数,通过本人亲自验证,确实如此。
原因:
ZooKeeper
为了提高读的速度,把数据都加载到内存中,读取数据都是通过内存。
为了快速读取和集群节点数据同步,ZNode
的大小做了限制,默认最大不能超过1M
。
解决办法:
1、server端:修改 zkServer.sh
启动脚本文件,设置增加内存 jute.maxbuffer
为 10M
,重启zk使配置生效:
此处修改能让
zookeeper
每个节点接收最多10M
的服务注册信息
2、client端:修改网关服务(consumer)启动脚本文件,增加参数
JAVA_OPTS=" -Djute.maxbuffer=10240000 [其他参数xxxxxxxx]"
此处修改能让
consumer
接收最多接收10M
的服务注册信息