JMeter分布式测试Jenkins触发结果异常,手动执行正常求助
问题现象
通过Jenkins流水线启动1主1从的JMeter分布式测试,已确认远程节点成功启动jmeter-server并创建远程对象:
Using local port: 4000 Created remote object: UnicastServerRef2 [liveRef: [endpoint:[XX.XX.XX.XX:4000](local),objID:[652e71b0:185345dcb07:-7fff, -3276995377179896203]]] Starting the test on host XX.XX.XX.XX @ Wed Dec 21 11:08:27 GMT 2022 (1671620907500)
但主节点的测试摘要出现无效值,无样本执行:
Creating summariser <summary> Created the tree successfully using /tmp/resources/complete-test-plan-rework_Disrupt-SearchAPI.jmx Configuring remote engine: XX.XX.XX.XX Using local port: 4000 Configuring remote engine: XX.XX.XX.XX Starting distributed test with remote engines: [XX.XX.XX.XX, XX.XX.XX.XX] @ Wed Dec 21 11:08:25 GMT 2022 (1671620905561) Remote engines have been started:[XX.XX.XX.XX, XX.XX.XX.XX] Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445 summary = 0 in 00:00:00 = ******/s Avg: 0 Min: 9223372036854775807 Max: -9223372036854775808 Err: 0 (0.00%) Tidying up remote @ Wed Dec 21 11:28:20 GMT 2022 (1671622100532)
手动启动jmeter-server时测试运行正常,仅Jenkins流水线触发时出现该问题。
排查与解决步骤
1. 确保jmeter-server在Jenkins会话结束后持续运行
当前通过ssh直接启动jmeter-server,Jenkins流水线步骤完成后ssh会话会关闭,导致jmeter-server进程被终止。需用nohup让进程后台持久运行,并记录日志方便排查:
修改启动jmeter-server的命令为:
fqdn=${HOST} ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 fesjenk@$fqdn 'nohup sh /opt/apache-jmeter-5.2.1/bin/jmeter-server.sh > /tmp/jmeter-server.log 2>&1 &' sleep 30 echo trigger SUCCESSFUL
之后可查看/tmp/jmeter-server.log获取远程节点的详细运行日志,定位具体错误。
2. 统一Java环境变量
Jenkins执行环境的JAVA_HOME可能与手动启动时不一致,导致jmeter-server无法正常工作。在启动命令中显式指定Java路径:
ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 fesjenk@$fqdn 'export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 && nohup sh /opt/apache-jmeter-5.2.1/bin/jmeter-server.sh > /tmp/jmeter-server.log 2>&1 &'
替换为实际的Java安装路径,确保远程节点使用正确的Java环境。
3. 验证JMeter版本一致性
主节点(执行jmeter.sh的节点)与远程节点的JMeter版本必须完全一致,否则会存在通信兼容性问题。分别在主节点和远程节点执行版本检查:
# 主节点 sh /opt/apache-jmeter-5.2.1/bin/jmeter.sh -v # 远程节点 ssh fesjenk@$fqdn 'sh /opt/apache-jmeter-5.2.1/bin/jmeter-server.sh -v'
确保版本号完全相同,若不一致则统一升级或降级到同一版本。
4. 同步测试依赖文件
通过-G传递的文件(如users.csv、screenshot.PNG)需确保在远程节点的对应路径存在且有读取权限。在Jenkins流水线中添加文件同步步骤:
# 同步测试计划 scp -o StrictHostKeyChecking=no /tmp/resources/complete-test-plan-rework_Disrupt-SearchAPI.jmx fesjenk@$fqdn:/tmp/resources/ # 同步数据文件 scp -o StrictHostKeyChecking=no /tmp/datafiles/* fesjenk@$fqdn:/tmp/datafiles/ # 同步配置文件 scp -o StrictHostKeyChecking=no /tmp/target-file.properties fesjenk@$fqdn:/tmp/
5. 检查端口与防火墙规则
JMeter分布式测试需要开放RMI注册端口(默认1099)和数据传输端口(如4000),确保主节点与远程节点之间能双向访问这些端口:
- 在远程节点启动jmeter-server时指定固定端口:
ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 fesjenk@$fqdn 'export JAVA_HOME=/path/to/java && nohup sh /opt/apache-jmeter-5.2.1/bin/jmeter-server.sh -Djava.rmi.server.hostname=XX.XX.XX.XX -Dserver_port=1099 -Dserver.rmi.localport=4000 > /tmp/jmeter-server.log 2>&1 &' - 检查远程节点防火墙规则,开放1099、4000端口,或临时关闭防火墙测试是否正常。
6. 验证Jenkins用户权限
确保Jenkins使用的fesjenk用户对JMeter安装目录、临时文件目录(/tmp)有读写权限:
ssh fesjenk@$fqdn 'ls -ld /opt/apache-jmeter-5.2.1 /tmp'
若权限不足,调整目录权限或更换有足够权限的用户执行测试。
内容的提问来源于stack exchange,提问作者TESTER07

