如何在Locust分布式负载中并行运行多配置批处理文件
分布式负载测试配置问题及解决方案
测试场景
需针对5个、15个、20个、25个、35个条目,以300用户规模执行负载测试。通过运行.\abc.bat并行触发5个不同批处理文件,命令如下:
start .\abc.bat 5_item.ini <2hour> <300user> <www.xyx.com host> start .\abc.bat 15_item.ini <2hour> <300user> <www.xyx.com host> start .\abc.bat 20_item.ini <2hour> <300user> <www.xyx.com host> start .\abc.bat 25_item.ini <2hour> <300user> <www.xyx.com host> start .\abc.bat 35_item.ini <2hour> <300user> <www.xyx.com host>
最终会生成5个对应不同条目数的.html结果文件。
现有问题
单CPU核心无法支撑5种配置下的300用户负载,抛出错误:
connectionerror(protocolerror('connection aborted.', remotedisconnected('remote end closed connection without response')))
架构方案
已确定采用master-worker分布式负载架构,将X机器设为主节点,Y机器设为工作节点。
疑问与解答
疑问1:如何在工作节点Y上开启5个并行进程以利用所有CPU核心?目前仅能运行5条目的配置,其余配置提示地址已被占用,是否需要5台机器分别运行5种配置?
- 地址被占用的核心原因是多个Locust实例默认使用了相同端口(默认8089),无需5台机器,单台工作节点即可处理,操作步骤如下:
- 针对每个配置,在主节点X上启动独立的master实例,指定不同端口:
# 5_item配置的master,端口8089 locust -f locustfile_5.py --master -P 8089 # 15_item配置的master,端口8090 locust -f locustfile_15.py --master -P 8090 # 20_item用8091、25_item用8092、35_item用8093,依次类推 - 在工作节点Y上,为每个配置启动对应数量的worker进程,连接到对应端口的master:
# 连接5_item的master,启动多个worker利用CPU核心 locust -f locustfile_5.py --worker --master-host=X机器IP --master-port=8089 locust -f locustfile_5.py --worker --master-host=X机器IP --master-port=8089 # 连接15_item的master locust -f locustfile_15.py --worker --master-host=X机器IP --master-port=8090 locust -f locustfile_15.py --worker --master-host=X机器IP --master-port=8090 # 其余配置以此类推,worker数量根据CPU核心数分配(比如核心数为N,每个配置启动N/5个worker) - 修改
abc.bat,给每个启动命令添加端口参数,确保每个配置的master/worker使用独立端口,避免冲突。
- 针对每个配置,在主节点X上启动独立的master实例,指定不同端口:
疑问2:若要在同一机器上同时作为主节点和工作节点以利用所有CPU核心,该如何操作?Locust文档说明不足,且需并行运行5个不同配置文件而非单个文件。
- 同一机器同时作为master和worker,本质是给每个配置启动独立的master+worker组,每个组使用独立端口,互不干扰:
- 针对每个配置,先启动master实例并指定端口:
# 5_item配置的master,端口8089 start locust -f locustfile_5.py --master -P 8089 # 15_item配置的master,端口8090 start locust -f locustfile_15.py --master -P 8090 # 其余配置依次指定不同端口 - 针对每个配置,启动对应数量的worker进程,连接到本机对应端口的master:
# 给5_item的master启动worker start locust -f locustfile_5.py --worker --master-host=127.0.0.1 --master-port=8089 start locust -f locustfile_5.py --worker --master-host=127.0.0.1 --master-port=8089 # 给15_item的master启动worker start locust -f locustfile_15.py --worker --master-host=127.0.0.1 --master-port=8090 start locust -f locustfile_15.py --worker --master-host=127.0.0.1 --master-port=8090 - 可通过参数复用Locust文件,避免重复编写:用同一个
my_locustfile.py,通过--env参数传递条目数:
在locustfile中通过# 5_item的master start locust -f my_locustfile.py --master -P 8089 --env ITEM_COUNT=5 # 5_item的worker start locust -f my_locustfile.py --worker --master-host=127.0.0.1 --master-port=8089 --env ITEM_COUNT=5os.environ.get("ITEM_COUNT")获取条目数,实现逻辑复用。 - 之前尝试失败的核心原因是多个master实例共用同一端口,导致地址冲突,给每个配置的master指定独立端口即可解决。
- 针对每个配置,先启动master实例并指定端口:
内容的提问来源于stack exchange,提问作者Saurabh Gupta
相关产品推荐
相关产品推荐

