JMeter单机及分布式压测出现SSLProtocolException等异常咨询
5000+用户规模Web应用压测报错排查与解决方案
当前12G JMeter堆内存配置已足够支撑该并发规模,报错与堆内存不足无关,核心问题集中在JMeter配置冲突、压测机操作系统参数限制、网络链路拦截、服务端/中间件连接瓶颈、TLS配置不匹配五类,具体排查与解决步骤如下:
一、先修正现有JMeter配置冲突与无效项
当前配置存在重复定义、格式错误、参数失效问题,先完成配置清理:
- 修复格式错误:jmeter.properties中
httpsampler.max_redirects=20 httpclient4.retrycount=1为错误写法,两个参数写在同一行时第二个参数不会被加载,需拆分为两行单独配置 - 统一重复配置:
httpclient4.retrycount在user.properties设为3、jmeter.properties设为1,最终会以最后加载的配置值为准。压测场景下不要开启自动重试,会导致流量失真、放大服务端压力,统一将该值设为0 - 删除无效配置:
http.connection.stalecheck$Boolean在HttpClient4版本中已废弃,开启反而会增加每次请求的校验开销,直接从所有配置文件中移除该配置项 - 修正TLS配置:当前同时启用TLSv1和TLSv1.2,若目标服务端已禁用TLSv1,会触发SSL握手失败导致连接重置。统一将
https.default.protocol和https.socket.protocols均设为TLSv1.2;将https.use.cached.ssl.context设为false,避免复用失效的SSL上下文触发连接重置 - 调整超时阈值:当前
httpclient.timeout=300000(5分钟超时)设置过长,无法快速识别失败请求,将连接超时设为10000ms、响应超时设为30000ms即可。
二、解决压测机本地端口耗尽问题(对应java.net.BindException: Address already in use报错)
该报错是典型的TCP临时端口耗尽、TIME_WAIT状态连接堆积导致,需调整压测机操作系统内核参数:
- Windows压测机调整:
- 打开注册表编辑器,定位到路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 新增DWORD类型值
TcpTimedWaitDelay,设为十进制30(将TIME_WAIT状态保留时间从默认240秒缩短到30秒) - 新增DWORD类型值
MaxUserPort,设为十进制65534(将最大可用临时端口数从默认16384扩展到最大值) - 修改完成后重启机器生效
- 打开注册表编辑器,定位到路径
- Linux压测机调整:
编辑/etc/sysctl.conf文件,添加以下配置:
执行net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.ip_local_port_range = 1024 65535 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535sysctl -p命令使配置即时生效,无需重启。 - 若单台压测机调整参数后仍出现端口耗尽,直接扩容压测节点做分布式压测,单台Linux压测机极限可支撑1.5w-2w并发,5000并发单台理论可承载,需确保压测时没有其他进程占用端口资源。
三、排查连接超时、读取超时、连接重置问题
这三类报错占比最高,按以下优先级从低到高排查:
- 排查网络链路拦截问题
- 压测过程中在压测机持续ping目标服务IP,执行
tracert(Windows)/traceroute(Linux)检测路由,确认是否存在丢包、延迟过高问题 - 压测时用
tcpdump抓包,观察SYN包是否正常发出、服务端是否返回SYN+ACK,如果SYN包发出后无响应,说明请求被防火墙/安全组拦截,或服务端连接队列已满直接丢包 - 确认压测机出口IP没有被目标服务的WAF、CDN、限流策略拉黑,多数云WAF默认会拦截短时间发起大量请求的来源IP,直接返回连接重置
- 压测过程中在压测机持续ping目标服务IP,执行
- 排查服务端侧配置瓶颈
- 先检查Nginx/Ingress网关配置:确认
worker_connections、keepalive_timeout、limit_conn、limit_req参数值,若连接数阈值低于5000,网关连接队列满后会直接拒绝新连接,返回超时、连接重置 - 检查应用服务器(Tomcat、SpringBoot内置容器等)配置:确认最大线程数、连接队列长度是否大于压测并发数,请求堆积时会直接触发超时、连接重置
- 压测过程中实时监控服务端CPU、内存、带宽、磁盘IO使用率,任一资源跑满都会导致服务拒绝请求触发报错
- 检查服务端TCP内核参数,重点关注
net.core.somaxconn、tcp_abort_on_overflow配置:如果tcp_abort_on_overflow=1,连接队列满时内核会直接返回RST包重置连接,和当前绝大多数样本触发Connection reset的特征完全匹配
- 先检查Nginx/Ingress网关配置:确认
- 排查TLS握手兼容性问题
- 执行
openssl s_client -connect beta.headlite.com:443 -tls1_2命令验证TLSv1.2握手是否正常,确认服务端没有禁用JMeter支持的加密套件 - 若目标站点接入CDN,确认CDN的SSL配置没有强制开启TLS1.3、0-RTT等和JMeter HttpClient4不兼容的特性。
- 执行
四、压测验证注意事项
- 不要直接启动5000并发压测,从100、500、1000、2000阶梯式加压,每个梯度稳定运行3-5分钟,定位报错出现的并发拐点,区分是压测机瓶颈、网络瓶颈还是服务端瓶颈
- 分布式压测时,确保所有压测节点的操作系统参数、JMeter版本、JDK版本、插件版本完全一致,避免单节点配置不一致导致偶发报错
- 正式压测使用非GUI模式启动JMeter,GUI模式仅用于脚本调试,避免图形界面消耗额外资源影响压测结果准确性。
内容的提问来源于stack exchange,提问作者Ankit Patel
相关产品推荐
相关产品推荐

