You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程启动无返回的jmeter-server.bat 解决分布式测试阻塞问题

问题描述

我们正在使用JMeter对Web应用进行分布式测试,需要后台运行jmeter-server.bat作为slave节点。目前遇到两个核心问题:

  1. 4台slave机中某台因负载过高重启后,主节点会因持续等待该机器的输出而陷入阻塞;
  2. 通过Jenkins调用Ansible Playbooks实现自动化测试,15个测试任务串联执行,一旦某个任务阻塞,必须人工介入才能继续,严重浪费时间。

已尝试的方案

  • 使用Windows任务计划程序在无用户登录时启动jmeter-server.bat,但批处理及子进程(如无头模式Selenium Chrome)均在后台运行,无法正常参与分布式测试;
  • 将jmeter-server.bat加入启动项并配置系统无密码自动登录触发会话,但因安全性问题被IT部门否决;
  • 在Ansible Playbook中使用win_command调用批处理,但因批处理无返回值导致Playbook执行阻塞;
  • 将批处理注册为Windows服务,但子进程仍在后台运行,无法正常工作。

解决方案

1. 解决slave重启后主节点阻塞的问题

在JMeter主节点配置中启用超时机制,避免持续等待无响应的slave:

  • 打开JMeter主节点的jmeter.properties文件,修改以下参数:
    # 设置slave节点连接超时时间(单位:毫秒)
    remote_connect_timeout=10000
    # 设置slave节点响应超时时间(单位:毫秒)
    remote_response_timeout=60000
    
  • 同时,在分布式测试的启动命令中添加-Djmeter.remote.stop.on.error=true参数,当某个slave无响应时,主节点自动终止该slave的任务,继续执行其他节点的测试,避免整体阻塞。

2. 实现jmeter-server.bat的可靠后台运行(无需自动登录)

放弃直接运行批处理,改用NSSM(Non-Sucking Service Manager)将jmeter-server.bat注册为带交互式会话的Windows服务:

  • 下载NSSM并解压到slave机器的任意目录;
  • 以管理员身份打开命令提示符,执行以下命令注册服务:
    nssm install JMeterServer
    
  • 在弹出的NSSM配置窗口中:
    • Path:选择jmeter-server.bat的完整路径;
    • Working Directory:设置为JMeter的根目录;
    • 在Log On选项卡中,勾选Allow service to interact with desktop(确保子进程能获取会话上下文);
  • 完成配置后,启动服务:
    nssm start JMeterServer
    
    这种方式既可以让服务在无用户登录时运行,又能保证子进程(如Selenium Chrome)正常获取会话环境,解决后台运行的问题。

3. 优化Ansible Playbook的执行逻辑,避免阻塞

在Ansible任务中使用异步执行+轮询机制,处理jmeter-server.bat的启动任务:

  • 修改Playbook中的任务,添加async和poll参数,实现非阻塞执行:
    - name: 启动JMeter slave服务
      win_command: cmd /c "C:\JMeter\bin\jmeter-server.bat"
      async: 300
      poll: 0
      register: jmeter_server_start
    
  • 后续可以添加任务检查服务是否正常运行:
    - name: 检查JMeter slave服务状态
      win_service:
        name: JMeterServer
        state: started
      retries: 5
      delay: 10
    
    这样即使批处理没有返回值,Playbook也不会一直阻塞,而是继续执行后续任务,同时通过检查服务状态确保slave节点正常启动。

4. 自动化故障恢复

在Ansible Playbook中添加故障检测与自动恢复逻辑:

  • 定期检查slave节点的JMeter服务状态,若发现服务停止或无响应,自动重启服务:
    - name: 检查JMeter服务是否运行
      win_service:
        name: JMeterServer
      register: jmeter_service_status
    
    - name: 重启JMeter服务(如果已停止)
      win_service:
        name: JMeterServer
        state: restarted
      when: jmeter_service_status.status != 'running'
    
  • 结合Jenkins的任务重试机制,为每个测试任务配置自动重试次数,一旦任务因slave阻塞失败,自动重试,减少人工介入的需求。

内容的提问来源于stack exchange,提问作者KisS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:35:19