packet len* is out of range!

项目使用的是 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.maxbuffer10M ,重启zk使配置生效:

此处修改能让 zookeeper 每个节点接收最多10M 的服务注册信息

2、client端:修改网关服务(consumer)启动脚本文件,增加参数
JAVA_OPTS=" -Djute.maxbuffer=10240000 [其他参数xxxxxxxx]"

此处修改能让 consumer 接收最多接收10M 的服务注册信息

你可能感兴趣的:(packet len* is out of range!)