分布式Locust压力测试自动化方案与Shell实现
1. 项目背景与核心需求最近在做一个分布式压力测试方案时遇到了一个典型场景需要在多台负载生成器上批量执行Locust性能测试脚本。这种需求在Web服务压力测试、API接口性能评估等场景中非常常见。传统的手动逐台部署执行方式效率低下而通过Shell脚本实现批量自动化操作可以大幅提升效率。Locust作为一款开源的负载测试工具以其Python脚本的灵活性和分布式架构的优势成为很多团队的首选。但在实际企业级应用中我们往往需要在多台压力生成器上同步部署测试脚本统一启动/停止测试任务集中收集测试结果数据实现参数化的批量测试执行2. 技术方案设计2.1 基础架构设计典型的批量执行架构包含以下组件[控制节点] │ ├── [SSH连接]──[负载生成器1] ├── [SSH连接]──[负载生成器2] └── [SSH连接]──[负载生成器N]控制节点负责脚本分发命令批量执行结果收集2.2 关键技术选型SSH免密登录配置使用ssh-keygen生成密钥对将公钥分发到各负载生成器测试SSH连接是否正常并行执行控制GNU Parallel工具xargs的-P参数自定义多进程实现结果收集方案实时输出重定向日志文件合并使用rsync同步结果文件3. 详细实现步骤3.1 环境准备首先确保所有节点已安装必要组件# 在所有节点上安装Locust pip install locust # 验证安装 locust --version3.2 核心Shell脚本实现#!/bin/bash # 配置参数 SCRIPT_DIR/path/to/locust/scripts HOSTS_FILEhosts.list LOG_DIR./logs TEST_SCRIPTlocustfile.py WORKERS5 USERS100 SPAWN_RATE10 RUN_TIME1h # 创建日志目录 mkdir -p $LOG_DIR # 批量执行函数 function run_locust() { host$1 log_prefix$2 echo Starting test on $host timestamp$(date %Y%m%d_%H%M%S) ssh $host cd $SCRIPT_DIR \ locust -f $TEST_SCRIPT \ --worker \ --master-host${MASTER_IP} \ --logfile$LOG_DIR/${log_prefix}_${timestamp}.log } # 读取主机列表 readarray -t hosts $HOSTS_FILE # 启动master节点 MASTER_IP${hosts[0]} echo Starting master on $MASTER_IP ssh $MASTER_IP cd $SCRIPT_DIR \ locust -f $TEST_SCRIPT \ --master \ --expect-workers$(( ${#hosts[]} - 1 )) \ --users $USERS \ --spawn-rate $SPAWN_RATE \ --run-time $RUN_TIME \ --logfile$LOG_DIR/master_$(date %Y%m%d_%H%M%S).log # 启动worker节点 for (( i1; i${#hosts[]}; i )); do run_locust ${hosts[$i]} worker_$i done # 等待测试完成 wait echo All tests completed3.3 关键参数说明主机列表文件格式userhost1 userhost2 userhost3Locust关键参数--users模拟用户总数--spawn-rate每秒启动用户数--run-time测试持续时间--expect-workers预期worker数量并发控制使用后台执行wait命令等待所有任务完成4. 高级功能扩展4.1 参数化测试通过修改脚本支持参数化测试# 在run_locust函数中添加 TEST_TAG$3 ssh $host cd $SCRIPT_DIR \ locust -f $TEST_SCRIPT \ --worker \ --master-host${MASTER_IP} \ --tags $TEST_TAG \ --logfile$LOG_DIR/${log_prefix}_${TEST_TAG}_${timestamp}.log 4.2 结果自动收集添加结果收集功能# 测试结束后执行 function collect_results() { for host in ${hosts[]}; do rsync -avz $host:$SCRIPT_DIR/$LOG_DIR/ $LOG_DIR/ done # 合并日志 cat $LOG_DIR/*.log $LOG_DIR/combined_$(date %Y%m%d_%H%M%S).log }4.3 实时监控集成简单的监控function monitor() { while true; do clear echo Locust Cluster Monitoring date echo Master: $MASTER_IP for (( i1; i${#hosts[]}; i )); do echo -n Worker ${i}: ${hosts[$i]} - ssh ${hosts[$i]} ps aux | grep locust | grep -v grep | wc -l done sleep 5 done }5. 实战经验与问题排查5.1 常见问题及解决方案问题现象可能原因解决方案Worker无法连接Master防火墙阻止检查1099端口是否开放测试结果不一致系统时间不同步配置NTP时间同步SSH连接超时网络问题/认证失败检查网络和SSH密钥配置Locust进程残留异常终止未清理添加进程清理脚本5.2 性能优化建议SSH连接优化# 在~/.ssh/config中添加 Host * ControlMaster auto ControlPath ~/.ssh/control:%h:%p:%r ControlPersist 1hLocust配置调优调整--heartbeat-liveness和--heartbeat-interval根据硬件配置优化worker数量资源监控# 实时监控资源使用 ssh $host top -b -n 1 | head -n 55.3 安全注意事项使用专用测试账户而非root限制SSH访问IP范围定期清理日志文件敏感信息不要硬编码在脚本中6. 完整方案示例以下是一个完整的自动化测试方案目录结构/locust-test/ ├── bin/ │ ├── deploy.sh │ ├── run_test.sh │ └── collect.sh ├── config/ │ ├── hosts.list │ └── test_params.cfg ├── scripts/ │ └── locustfile.py └── logs/部署脚本(deploy.sh)#!/bin/bash SCRIPT_DIR$(cd $(dirname $0); pwd) readarray -t hosts $SCRIPT_DIR/../config/hosts.list for host in ${hosts[]}; do rsync -avz $SCRIPT_DIR/../scripts/ $host:/opt/locust/scripts/ ssh $host pip install -r /opt/locust/scripts/requirements.txt done参数化测试配置(test_params.cfg)[scenario1] users1000 spawn_rate50 run_time30m tagsapi_v1 [scenario2] users2000 spawn_rate100 run_time1h tagsapi_v2自动化执行流程# 1. 部署环境 ./bin/deploy.sh # 2. 执行测试 ./bin/run_test.sh -c config/test_params.cfg -s scenario1 # 3. 收集结果 ./bin/collect.sh -o results/在实际使用中发现这种方案相比单机执行效率提升了5-8倍特别适合需要模拟大规模并发用户的场景。关键是要确保网络带宽充足避免成为性能瓶颈。