CentOS下JMeter测试失败的定位与修复指南
一 快速定位与通用修复
- 查看日志:优先检查 JMETER_HOME/bin/jmeter.log 与命令行输出,定位 Java 异常、端口冲突、脚本语法 等根因。
- 检查 Java:执行 java -version;JMeter 5.x 建议使用 Java 8/11。未安装可用:sudo yum install -y java-1.8.0-openjdk-devel。
- 环境变量:配置 JAVA_HOME(如:/usr/lib/jvm/java-1.8.0-openjdk)与 PATH=$JAVA_HOME/bin:$PATH,执行 source /etc/profile 生效。
- 安装与权限:JMeter 目录权限不足会报 Permission denied,执行 chmod -R 755 $JMETER_HOME;必要时确认 JMETER_HOME 与 PATH 已设置。
- 运行方式:压测尽量使用 非 GUI 模式:jmeter -n -t testplan.jmx -l result.jtl,减少资源占用与结果偏差。
二 常见错误与对应修复
| 症状 |
快速检查 |
修复建议 |
| java.lang.OutOfMemoryError: Java heap space |
日志出现 OOM |
提升堆内存:编辑 jmeter 脚本的 HEAP 参数,如 -Xms1g -Xmx2g(按服务器内存调整)。 |
| Address already in use / 端口耗尽 |
大量短连接后失败 |
扩大本地端口与回收 TIME_WAIT:在 /etc/sysctl.conf 设置 net.ipv4.ip_local_port_range=1024 65534、net.ipv4.tcp_tw_reuse=1、net.ipv4.tcp_fin_timeout=30,执行 sysctl -p。 |
| Connection refused / Read timed out |
目标服务或网络不通 |
检查目标服务、路由与安全组;在 HTTP Request Defaults 增加 Connect Timeout/Response Timeout(如 5000–10000 ms)。 |
| Command not found / 无法启动 JMeter |
命令找不到或 PATH 错误 |
确认 JMETER_HOME/bin 已加入 PATH,或到 $JMETER_HOME/bin 下执行 ./jmeter -v。 |
| CSV 参数文件读取失败 |
Linux 路径错误或文件不存在 |
将 CSV 放到 /opt/jmeter/data/params.csv 等绝对路径,并在 CSV Data Set Config 中使用 /opt/jmeter/data/params.csv。 |
| 分布式:Cannot start. localhost is a loopback address |
RMI 绑定到 127.0.0.1 |
Slave 启动前指定本机 IP:./jmeter-server -Djava.rmi.server.hostname=SLAVE_IP;或在 jmeter.properties 设置 RMI_HOST_DEF。 |
| 分布式:Connection timed out / 端口被拒 |
防火墙或端口未放行 |
开放 1099(RMI)与自定义 server_port(如 1567):firewall-cmd --add-port=1099/tcp --permanent && firewall-cmd --reload;云环境同步放通安全组。 |
| 分布式:rmi_keystore.jks 找不到 |
RMI SSL 默认开启但无密钥库 |
测试环境可在 jmeter.properties 设置 server.rmi.ssl.disable=true;或生成密钥库并分发到所有节点 bin/ 目录。 |
| 版本不一致导致兼容性问题 |
Master/Slave 版本不同 |
统一 JMeter 版本(各节点执行 jmeter -v 校验)。 |
三 分布式压测专项排查
- 版本一致:所有节点安装相同版本的 JMeter 与 Java 8/11。
- 通信配置:
- Master 的 jmeter.properties 设置 remote_hosts=SLAVE_IP:1099(如有多台用逗号分隔)。
- Slave 启动时绑定本机 IP:./jmeter-server -Djava.rmi.server.hostname=SLAVE_IP;必要时在 jmeter.properties 设置 server.rmi.ssl.disable=true(测试环境)。
- 自定义端口:在 jmeter.properties 设置 server_port=1567,并在防火墙放行对应端口。
- 结果返回异常:Master 端可将 mode=Standard(避免 StrippedBatch 过滤响应数据导致排查困难)。
- 网络连通:确保 Master ↔ 所有 Slave 的 1099 与自定义端口双向可达,云服务器需同步配置安全组。
四 性能与稳定性优化
- 系统网络:高并发短连接建议优化内核参数(示例):
- net.ipv4.ip_local_port_range=1024 65535
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_fin_timeout=15~30
- 可选:net.ipv4.tcp_tw_recycle=1(NAT/云环境慎用)
- 可选:net.ipv4.tcp_max_tw_buckets=55000
- 文件句柄:在 /etc/security/limits.conf 增加
- soft nofile 65535 / hard nofile 65535
- soft nproc 65535 / hard nproc 65535
执行 ulimit -n 65535 并重启会话或 sshd 生效。
- JMeter 侧:压测使用 非 GUI;精简监听器;必要时在 user.properties 增加保存字段以便排查:
- jmeter.save.saveservice.output_format=xml
- jmeter.save.saveservice.response_data=true
- jmeter.save.saveservice.samplerData=true
- jmeter.save.saveservice.requestHeaders=true
- jmeter.save.saveservice.url=true
- jmeter.save.saveservice.responseHeaders=true
- 日志级别:命令行临时开启调试:-Jlog_level.jmeter=DEBUG;或在 bin/log4j2.xml 调整 Root level。
五 一键排查命令清单
- 环境与权限:
- java -version;echo $JAVA_HOME $JMETER_HOME $PATH
- chmod -R 755 $JMETER_HOME
- 端口与连通:
- 占用检查:ss -lntp | grep 1099 或 netstat -lnp | grep 1099
- 临时放行:firewall-cmd --add-port=1099/tcp --permanent && firewall-cmd --reload
- 系统参数与句柄:
- JMeter 运行与日志:
- jmeter -n -t testplan.jmx -l result.jtl
- 查看 $JMETER_HOME/bin/jmeter.log 与 jmeter-server.log 的错误堆栈与时间点