項(xiàng)目使用的是 dubbo 框架, 注冊(cè)中心使用的是 zookeeper。項(xiàng)目自發(fā)布以來(lái)平穩(wěn)迭代運(yùn)行了18個(gè)月,但在某個(gè)周五,正等待下班之際,突然傳出噩耗,app打開非??D且有大量報(bào)錯(cuò)。20分鐘之后,網(wǎng)關(guān)服務(wù)(consumer)宕機(jī)了。
網(wǎng)關(guān)服務(wù)器cpu爆了。
通過(guò) netstat -anp|grep port 查看發(fā)現(xiàn)有大量的 TIME_WAIT 的線程。
搜尋網(wǎng)關(guān)日志,重點(diǎn)發(fā)現(xiàn)有兩個(gè)報(bào)錯(cuò):
java.io.IOException: Packet len4235458 is out of range!
Background retry gave up
org.apache.curator.CuratorConnectionLossException: KeeperErrorCode = ConnectionLoss
上網(wǎng)搜了很多,都說(shuō)是要增加 jute.maxbuffe 參數(shù),通過(guò)本人親自驗(yàn)證,確實(shí)如此。
原因:
ZooKeeper為了提高讀的速度,把數(shù)據(jù)都加載到內(nèi)存中,讀取數(shù)據(jù)都是通過(guò)內(nèi)存。
為了快速讀取和集群節(jié)點(diǎn)數(shù)據(jù)同步,ZNode的大小做了限制,默認(rèn)最大不能超過(guò)1M。
解決辦法:
1、server端:修改 zkServer.sh 啟動(dòng)腳本文件,設(shè)置增加內(nèi)存 jute.maxbuffer 為 10M ,重啟zk使配置生效:

此處修改能讓
zookeeper每個(gè)節(jié)點(diǎn)接收最多10M的服務(wù)注冊(cè)信息
2、client端:修改網(wǎng)關(guān)服務(wù)(consumer)啟動(dòng)腳本文件,增加參數(shù)
JAVA_OPTS=" -Djute.maxbuffer=10240000 [其他參數(shù)xxxxxxxx]"
此處修改能讓
consumer接收最多接收10M的服務(wù)注冊(cè)信息