4. 集群环境搭建(一):操作系统与JDK版本选择、网络配置要求、防火墙与端口开放策略
分布式压测集群的底层环境是稳定性的基石。本章聚焦于搭建前的环境选型与网络规划,涵盖操作系统与JDK的版本匹配、网络延迟与带宽要求、防火墙端口策略三个核心维度。错误的版本组合或端口遗漏会导致节点间通信失败、RMI调用超时、聚合报告数据丢失等严重问题。
4.1 操作系统与JDK版本选择
JMeter 是纯 Java 应用,其运行稳定性高度依赖 JDK 版本与操作系统的兼容性。以下为经过大规模压测验证的推荐组合:
| 组件 | 推荐版本 | 最低版本 | 关键说明 |
|---|---|---|---|
| 操作系统 | CentOS 7.9 / Rocky Linux 8.6+ | CentOS 7.0 / Ubuntu 20.04 | 生产环境优先选择 RHEL 系,避免桌面版 OS |
| JDK | JDK 11 (LTS) 或 JDK 17 (LTS) | JDK 8u202 | JMeter 5.5+ 已移除对 JDK 8 的官方支持 |
| JMeter | 5.6.3 / 5.7 | 5.4.1 | 建议统一集群内所有节点的 JMeter 大版本 |
⚠️ 版本避坑: 切勿在 Controller 节点使用 JDK 8、在 Worker 节点使用 JDK 17。RMI 序列化机制在跨大版本 JDK 间存在兼容风险,轻则报
UnmarshalException,重则导致聚合数据乱码。集群内所有节点必须使用完全相同的 JDK 主版本。
4.1.1 JDK 安装与验证
以下为 CentOS 7.9 环境下的 JDK 11 安装步骤:
# 1. 卸载系统自带 OpenJDK(如有)
sudo yum remove -y java-1.8.0-openjdk*
# 2. 下载并安装 JDK 11(以 tar.gz 方式,避免 yum 源版本不一致)
wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
sudo tar -zxf openjdk-11.0.2_linux-x64_bin.tar.gz -C /usr/local/
sudo mv /usr/local/jdk-11.0.2 /usr/local/java
# 3. 配置环境变量
cat >> ~/.bashrc << 'EOF'
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
EOF
source ~/.bashrc
# 4. 验证版本
java -version
# 输出示例:openjdk version "11.0.2" 2019-01-15 LTS
4.2 网络配置要求
分布式压测对网络质量敏感。Controller 与 Worker 之间通过 RMI 协议交换测试计划、采样结果和控制指令,网络延迟和丢包会直接拉低压测吞吐上限。
4.2.1 网络拓扑与延迟要求
- 同机房部署: Controller 与所有 Worker 必须位于同一内网网段,建议二层互通。RTT(往返延迟)应 < 1ms。
- 跨机房/云区域: 必须通过专线或高带宽 VPN 连接,RTT 不得超过 5ms,否则需启用
mode=StrippedAsynch或调整 RMI 超时参数。 - 禁止通过公网 IP 直连: 公网延迟高、丢包不可控,且存在安全风险。所有节点间通信必须走内网或隧道。
4.2.2 带宽估算公式
每个 Worker 节点所需的网络带宽下限:
带宽下限 (Mbps) = (单请求响应体大小 KB × 目标TPS) × 8 / 1024 × 1.5(冗余系数)
示例:单响应 50KB,目标 TPS 2000
带宽 = (50 × 2000) × 8 / 1024 × 1.5 ≈ 1171 Mbps → 需万兆网卡
💡 经验值: 当单 Worker TPS > 5000 或单响应体 > 100KB 时,建议将网卡升级为 10GbE,并启用 jumbo frame(MTU 9000)以降低 CPU 开销。
4.3 防火墙与端口开放策略
JMeter 分布式压测依赖 RMI 动态端口分配,这是防火墙配置中最容易出错的环节。默认情况下,JMeter 的 RMI 端口是随机分配的,必须强制固定端口范围才能通过防火墙白名单。
4.3.1 端口规划清单
| 用途 | 协议 | 默认端口 | 推荐固定端口 | 开放方向 |
|---|---|---|---|---|
| Controller → Worker RMI 注册 | TCP | 1099 | 1099 | Controller 出 → Worker 入 |
| Worker → Controller 数据回传 | TCP | 随机 (0-65535) | 40000-40100 | Worker 出 → Controller 入 |
| Controller 自身 RMI 服务 | TCP | 随机 | 40101-40110 | Controller 本机监听 |
| SSH 管理 | TCP | 22 | 22 或自定义 | 运维跳板机 → 所有节点 |
4.3.2 固定 RMI 端口配置
在 所有 Worker 节点 的 jmeter.properties 中追加:
# 固定 Worker RMI 注册端口
server.rmi.port=1099
# 固定 Worker RMI 数据回传端口范围
server.rmi.localport=40000-40100
# 关闭 SSL(内网环境)
server.rmi.ssl.disable=true
在 Controller 节点 的 jmeter.properties 中追加:
# 固定 Controller 端 RMI 监听端口范围
client.rmi.localport=40101-40110
# 关闭 SSL
server.rmi.ssl.disable=true
4.3.3 iptables / firewalld 配置示例
以 CentOS 7 的 firewalld 为例,在 Worker 节点执行:
# 开放 RMI 注册端口
sudo firewall-cmd --permanent --add-port=1099/tcp
# 开放 RMI 数据回传端口范围
sudo firewall-cmd --permanent --add-port=40000-40100/tcp
# 重新加载规则
sudo firewall-cmd --reload
# 验证
sudo firewall-cmd --list-ports
🔑 关键检查点: 配置完成后,在 Controller 节点执行
telnet <worker-ip> 1099,确认端口可达。若超时,请检查 Worker 侧防火墙、云平台安全组、以及 iptables 规则链顺序。
4.4 集群网络架构总览
下图展示了 1 个 Controller + 3 个 Worker 的标准分布式压测集群网络拓扑与端口流向:
4.5 环境验证清单
完成上述配置后,按以下清单逐项确认,避免遗漏:
- JDK 版本一致性: 所有节点
java -version输出完全一致。 - 主机名解析:
/etc/hosts中配置所有节点的 IP 与主机名映射,避免 RMI 反向解析失败。 - 端口连通性: Controller 节点执行
telnet <worker-ip> 1099和telnet <worker-ip> 40000均返回成功。 - 防火墙规则持久化:
firewall-cmd --list-ports --permanent确认规则已持久化,重启后不丢失。 - JMeter 配置同步: 所有 Worker 的
jmeter.properties中server.rmi.port和server.rmi.localport配置一致。
✅ 快速自检命令: 在 Controller 节点执行
for ip in 192.168.1.10 192.168.1.11 192.168.1.12; do echo "Checking $ip:1099"; timeout 2 bash -c "echo > /dev/tcp/$ip/1099" && echo "OK" || echo "FAIL"; done,批量验证所有 Worker 的 RMI 注册端口。