CentOS 上运行 JMeter 的实用指南与常见问题排查
一 快速安装与运行
- 安装 Java 8(JMeter 5.x 建议使用 Java 8 或 11):sudo yum install -y java-1.8.0-openjdk-devel;验证:java -version。
- 下载并解压 Apache JMeter(示例版本 5.4.3):
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.tgz
tar -xzf apache-jmeter-5.4.3.tgz -C /opt/
ln -sfn /opt/apache-jmeter-5.4.3 /opt/jmeter
- 将 /opt/jmeter/bin 加入 PATH,便于直接执行 jmeter。
- 非 GUI 模式执行压测:
jmeter -n -t /path/to/testplan.jmx -l /path/to/results.jtl
- 稳定性建议:压测尽量使用 非 GUI 模式,减少资源占用与结果偏差。
二 常见报错与快速修复
- Java 版本不兼容或环境变量异常:JMeter 5.x 建议使用 Java 8/11;检查 JAVA_HOME、PATH 是否正确,必要时重装或切换版本。
- 权限被拒绝:对 JMeter 目录执行 chmod -R 755 授权,避免因权限不足导致脚本或 RMI 失败。
- 分布式压测连接失败或卡住:
- 关闭防火墙或放行端口:firewall-cmd --state;systemctl stop firewalld(测试环境)。
- 双网卡/多网卡导致 RMI 绑定错误:在 jmeter-server 启动前设置本机 IP:RMI_HOST_DEF=-Djava.rmi.server.hostname=SLAVE_IP;在 Master 的 jmeter.properties 设置 remote_hosts=SLAVE_IP:1099。
- 禁用 SSL(测试环境):jmeter.properties 中设置 server.rmi.ssl.disable=true。
- 自定义端口:server_port=1567(默认 1099)。
- 卡在 “waiting for possible shutdown message”:多为 HTTP 请求未设超时,给 HTTP Request Defaults 设置 Connect 与 Response 超时(如 10000 ms),并尽量升级到较新版本。
- 内存不足 OOM:编辑 jmeter 或 jmeter.sh,通过 JVM_ARGS 调整堆内存,例如:JVM_ARGS=“-Xms8g -Xmx12g”。
三 性能与稳定性优化
- 系统网络参数(应对高并发短连接):
- 扩大本地端口范围:net.ipv4.ip_local_port_range = 1024 65535
- 开启端口复用:net.ipv4.tcp_tw_reuse = 1
- 降低 TIME_WAIT 回收时间:net.ipv4.tcp_fin_timeout = 15~30
- 可选:net.ipv4.tcp_tw_recycle = 1(NAT/云环境慎用)
- 调整 TIME_WAIT 桶数量:net.ipv4.tcp_max_tw_buckets = 55000
修改后执行 sysctl -p 生效。
- 文件句柄限制(避免 “too many open files”):
/etc/security/limits.conf 增加:
- soft nofile 65535
- hard nofile 65535
- soft nproc 65535
- hard nproc 65535
重启 sshd 或执行 ulimit -n 65535 并写入 /etc/profile 使其持久。
- JMeter 自身:压测使用 非 GUI 模式;按需精简监听器,避免额外内存与 I/O 开销。
四 日志与结果分析
- 定位问题的首要位置:JMeter 安装目录 bin/jmeter.log;如需永久调整日志级别,修改 bin/log4j2.xml 中的 Root level。
- 命令行运行建议始终输出 JTL 结果文件,便于事后分析。
- 需要更详细的请求/响应信息用于排查时,可在 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
- 自定义业务日志(无界面压测尤为有效):在 BeanShell 断言中使用
import org.apache.log4j.Logger;
String result = prev.getResponseDataAsString();
if (!“0”.equals(vars.get(“code”))) {
Failure = true;
log.error(“业务失败,响应=” + result);
} else {
log.info(“业务成功,orderId=” + vars.get(“orderId”));
}
结合 jmeter.log 可快速统计成功率、错误率、QPS/吞吐等关键指标。
五 分布式压测快速配置
- 环境:准备 1 台 Master 与 1~N 台 Slave(CentOS),各节点安装相同版本 JMeter 与 Java 8/11。
- Slave 节点:
- 编辑 bin/jmeter.properties:server.rmi.ssl.disable=true(测试环境);如需自定义端口,设置 server_port=1567。
- 启动:在 Slave 上执行 RMI_HOST_DEF=-Djava.rmi.server.hostname=SLAVE_IP ./jmeter-server。
- Master 节点:
- 编辑 bin/jmeter.properties:remote_hosts=SLAVE1_IP:1099,SLAVE2_IP:1099。
- 启动压测:jmeter -n -t testplan.jmx -R SLAVE1_IP:1099,SLAVE2_IP:1099 -l result.jtl。
- 网络与安全:确保 Master 与所有 Slave 之间 1099(及自定义端口)可达,必要时关闭防火墙或配置安全组放行。