春节假期第一天,运维同事反馈系统使用的一个ActiveMQ服务连接不上了, 频繁报错,经查看日志, 异常信息为: Could not accept connection : org.apache.activemq.transport.tcp.ExceededMaximumConnectionsException: Exceeded the maximum number of allowed client connections. See the ‘maximumConnections’ property on the TCP transport configuration URI in the ActiveMQ configuration file (e.g., activemq.xml)。
当时身边没有电脑,找其他同事先帮调大了activeMQ的连接数(activemq.xml中maximumConnections=1500)后重启服务,先恢复服务。
有时间后开始研究为什么会出现这个问题,出现问题时activeMQ配置的连接数为1000,该mq服务平时基本最多几百个连接(生产者+消费者,可通过netstat命令查看网络连接数量),正常情况下不应该出现该问题,猜测是有激增的连接或者未释放的连接导致的。询问了当时涉及的系统同事是否有调整生产者消费者连接数相关操作,反馈是都没有,那应该就是未释放的连接导致的,使用ss -aoen|grep 9203|grep ESTAB (9203为mq服务的端口号)查看连接信息,发现基本都没有timer信息,而使用sysctl -a |grep keepalive查看keepalive配置的为7200秒检查一次(net.ipv4.tcp_keepalive_time = 7200),也就是说操作系统的本身keepalive并不会检查和清理activeMQ的连接,经查找mq相关配置,在activemq.xml上配置了transport.keepalive=true后,再使用ss命令查看连接信息,已经有了timer(keepalive,120min,0)的信息,这个120min表示剩余探测时间,第一次探测,需要 net.ipv4.tcp_keepalive_time 这个时间倒计时,如果探测失败继续探测,后边会按照 net.ipv4.tcp_keepalive_intvl 这个时间值进行探测,重试tcp_keepalive_probes配置的次数。
问题解决。总结一下:
1,activemq.xml中配置transport.keepalive=true,按照系统配置的保活时间定时检测假连接,防止假连接占用连接数,到时无法接入新的连接;
2,也要考虑实际连接数情况,配置一个合理的连接数大小;
记录一次ActiveMQ连接数过多问题(含解决方案)
于 2023-01-29 11:00:06 首次发布