问题描述
困扰了一年多的问题终于解决了,主要是这些报错信息均不回影响正常的消息消费!!!总结了有以下几种现象:
1、每次服务实例重启,都会频繁报【wait response on the channel <xx.xx.xx.xx::9876> timeout, 3000(ms)
】这个错误,需要重启多次,才可以启动成功。
2、rocketmq客户端日志经常有大量报错,报错信息如下:【wait response on the channel<xx.xx.xx.xx::9876>timeout,3000(ms)】
3、日志中发现经常有大量的连接通道超时的异常记录:【close the connection to remote address[xx.xx.xx.xx:9876] result: true】
2024-05-08T23:35:35.336|[order-service,,] [NettyClientSelector_1] [INFO] RocketmqRemoting - closeChannel: close the connection to remote address[xx.xx.xx.xx:9876] result: true
资源情况
RocketMQ 客户端和服务端版本号4.9.3
3个nameserver,双主
服务实例为容器部署
问题排查
1、查看rocketmq日志
在rocketmq_client.log日志文件中发现有不停的开、不停的关的记录
2、查看jvm
监控JVM的内存使用情况,发现有频繁的FULL GC,每次FULL GC平均耗时4s左右,频繁的full gc导致RocketMQ服务连接不稳定,严重影响了系统的性能,甚至导致消费线程卡顿
累计372天,FGC次数是442w次,时间是16039743s≈4000+h,平均每次FGC要停顿4s。所以一直会报3s的超时错误
查看MQ集群启动的内存配置参数为:-Xms=16g -Xmx=16g -Xmn=16g,其中初始堆大小和最大堆大小设置为16g,确保JVM启动时能分配足够的内存,但是Xmn=16g年轻代大小设置了16g,可能会由于年轻代占用大量内存,没有分配老年代内存,从而触发频繁的FULL GC。
JVM内存配置参数一般会将年轻代的大小设置为堆大小的1/3到1/2之间,重新评估内存需求,优化JVM的启动配置参数为:-Xms=16g -Xmx=16g -Xmn=8g
完成MQ集群的配置参数优化和重启,集群连接正常,未出现连接超时的问题。