JMeter分布式测试大并发异常:部分线程提前结束报RMI连接拒绝
问题原因分析与解决方案
这问题我之前帮不少做分布式JMeter压测的朋友排查过,结合你提供的日志和场景,核心原因是SSH隧道的并发承载瓶颈叠加RMI通信的资源限制,具体拆解如下:
一、直接触发异常的原因
日志里的java.rmi.ConnectException: Connection refused to host: 127.0.0.1,本质是当用户量涨到5200时,Slave通过SSH隧道向Master发送采样数据的RMI连接请求被拒绝了,主要有几个诱因:
- SSH隧道的并发连接数不足:SSH服务默认对单会话的最大并发连接数(
MaxSessions)和新连接的启动限制(MaxStartups)有默认值(通常是10-100左右),当5200个用户同时产生采样数据时,需要的并发RMI连接数远超SSH隧道能承载的上限,导致新的连接请求被直接拒绝。 - RMI通信的资源瓶颈:JMeter默认用RMI做Master和Slave的样本传输,默认配置下RMI的连接超时、端口范围、传输效率都没针对高并发优化。当负载上来后,Master的RMI接收队列可能被占满,或者Slave端无法及时通过SSH隧道建立到127.0.0.1的RMI连接,最终触发连接拒绝。
- 系统资源耗尽:5200用户的压测对Slave/Master的CPU、内存、网络带宽都是不小的考验,如果某台机器资源跑满(比如CPU 100%、内存不足),会导致RMI服务无法正常处理新的连接请求,间接引发连接拒绝。
二、针对性解决方案
1. 调整SSH隧道的并发限制
修改Slave端的SSH服务配置(/etc/ssh/sshd_config),增大相关参数:
# 允许的最大并发会话数,设为足够大的值 MaxSessions 10000 # 调整新连接的启动策略:前10000个连接无限制,之后超过30%的连接概率性拒绝,直到10000个后全部拒绝 MaxStartups 10000:30:10000
修改后重启SSH服务:
# Ubuntu/Debian系统 sudo systemctl restart sshd # CentOS/RHEL系统 sudo service sshd restart
另外,建立SSH隧道时加上保活参数,防止连接超时断开:
ssh -L 1099:localhost:1099 -R 4000:localhost:4000 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 user@slave-ip
2. 优化JMeter的RMI通信配置
在Master和所有Slave的jmeter.properties文件里调整以下参数:
# 禁用RMI SSL,减少加密开销(如果不需要安全传输的话) rmi.ssl.disable=true # 延长RMI连接超时时间,避免因网络延迟导致连接失败 rmi.connection.timeout=60000 # 改用更高效的二进制样本发送器,替代默认的StandardSampleSender,大幅降低RMI传输开销 sample_sender_classname=org.apache.jmeter.samplers.BinaryTCPSampleSender # 固定RMI端口,避免端口耗尽,同时方便防火墙配置 server.rmi.localport=1099 client.rmi.localport=4000
修改后重启所有JMeter Server和Master。
3. 扩容与负载分摊
如果单台Slave扛不住5200用户的压力,建议:
- 增加Slave节点数量,把用户数均匀分摊到多台Slave上,降低单台机器的负载和SSH隧道的并发压力。
- 调整JMeter的堆内存配置,比如在
jmeter.sh(Linux)或jmeter.bat(Windows)里修改HEAP参数:
HEAP="-Xms4g -Xmx8g"
根据机器内存情况调整,确保JMeter有足够的内存处理高并发请求。
4. 排查系统资源与端口
- 用
top或htop命令实时监控Master和Slave的CPU、内存使用率,确保没有资源耗尽的情况。 - 用
ss -tulpn(Linux)或netstat -anp命令检查端口使用情况,确认是否出现端口耗尽(比如大量TIME_WAIT状态的连接)。
内容的提问来源于stack exchange,提问作者Prital
相关产品推荐
相关产品推荐

