1. 为什么需要批量执行Locust压测脚本?
在性能测试领域,Locust作为开源的负载测试工具已经得到广泛应用。但当我们面对以下场景时,单次执行Locust脚本就显得力不从心:
- 需要同时模拟不同地域的用户行为模式
- 要对同一接口进行阶梯式压力测试(如从100并发逐步增加到5000并发)
- 测试环境存在多个服务节点需要分别施压
- 需要长期稳定性测试(7×24小时持续运行)
我曾在电商大促前的全链路压测中,需要同时对商品详情页、购物车、订单服务等12个关键接口进行不同比例的流量配比测试。手动逐个启动Locust不仅效率低下,更难以保证各测试节点的时间同步性。这时,Shell脚本的批量执行能力就成为解决问题的关键。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础环境准备与Locust安装
2.1 系统环境要求
推荐使用Linux系统(如Ubuntu 20.04+或CentOS 7+),确保已安装:
bash复制python3 -V # 需要Python 3.6+
pip3 -V # 需要pip 20.0+
2.2 Locust安装与验证
使用pip安装最新版Locust:
bash复制pip3 install locust
验证安装成功:
bash复制locust -V # 应输出类似 locust 2.15.1 的版本信息
注意:生产环境建议使用virtualenv创建隔离的Python环境,避免依赖冲突。我曾在实际项目中因系统Python环境被污染导致Locust运行异常,排查耗时长达3小时。
3. Shell批量控制核心逻辑设计
3.1 多脚本并行执行方案
基础并行执行模式:
bash复制#!/bin/bash
for script in locust_*.py; do
nohup locust -f $script --headless -u 100 -r 10 -t 1h &
done
关键参数说明:
nohup:保证SSH断开后进程继续运行&:后台运行-u:模拟用户数-r:每秒启动用户数-t:测试持续时间
3.2 动态参数传递技巧
通过环境变量实现参数动态化:
bash复制#!/bin/bash
export LOCUST_USERS=500
export LOCUST_SPAWN_RATE=50
locust -f api_test.py --headless \
-u $LOCUST_USERS \
-r $LOCUST_SPAWN_RATE \
-t 30m
3.3 结果收集与错误处理
完善的错误处理和结果收集:
bash复制#!/bin/bash
LOG_DIR="./logs/$(date +%Y%m%d_%H%M%S)"
mkdir -p $LOG_DIR
for script in tests/*.py; do
TEST_NAME=$(basename $script .py)
nohup locust -f $script --headless \
-u 1000 -r 100 -t 1h \
>> "$LOG_DIR/${TEST_NAME}.log" 2>&1 &
if [ $? -ne 0 ]; then
echo "[ERROR] Failed to start $TEST_NAME" | tee -a "$LOG_DIR/error.log"
else
echo "[INFO] Started $TEST_NAME with PID $!" | tee -a "$LOG_DIR/status.log"
fi
done
4. 高级场景实战技巧
4.1 分布式压测集群管理
主从节点协同方案:
bash复制# 启动master节点
locust -f stress_test.py --master --expect-workers 3
# 在三个终端分别启动worker
locust -f stress_test.py --worker --master-host=192.168.1.100
4.2 阶梯式压力测试实现
使用Shell循环实现自动增压:
bash复制#!/bin/bash
for users in 100 500 1000 2000 5000; do
echo "Testing with $users users"
locust -f api_test.py --headless \
-u $users -r 100 -t 5m \
--csv=result_$users
sleep 300 # 间隔5分钟等待系统恢复
done
4.3 跨地域时区模拟
模拟全球用户访问模式:
bash复制#!/bin/bash
# 亚洲时段 (UTC+8)
TZ='Asia/Shanghai' locust -f asia_user.py --headless -u 800 -r 80 -t 6h &
# 欧洲时段 (UTC+1)
TZ='Europe/London' locust -f eu_user.py --headless -u 500 -r 50 -t 6h &
# 美洲时段 (UTC-5)
TZ='America/New_York' locust -f us_user.py --headless -u 700 -r 70 -t 6h &
5. 性能监控与结果分析
5.1 实时监控方案
结合top和Locust的Web UI:
bash复制#!/bin/bash
# 监控系统资源
nohup top -b -d 2 > system_monitor.log &
# 启动Locust带Web界面
locust -f combined_test.py --web-host=0.0.0.0 --web-port=8089
5.2 测试报告自动生成
使用pandas分析CSV结果:
python复制#!/bin/bash
python3 << EOF
import pandas as pd
from glob import glob
results = pd.concat([pd.read_csv(f) for f in glob('results_*.csv')])
summary = results.groupby('User Count').agg({
'Requests/s': ['mean', 'max'],
'Failures/s': 'sum'
})
summary.to_html('report.html')
EOF
6. 避坑指南与性能优化
6.1 常见问题排查
-
Locust无法启动
- 检查Python版本 >= 3.6
- 确认脚本中没有语法错误:
python3 -m py_compile your_script.py
-
测试结果异常
- 使用
--logfile参数记录详细日志 - 检查系统资源是否耗尽:
free -h和df -h
- 使用
-
Worker节点无法连接Master
- 检查防火墙设置
- 验证网络连通性:
telnet master_ip 5557
6.2 性能优化建议
-
脚本层面优化
python复制# 使用FastHttpUser代替HttpUser提升性能 from locust import FastHttpUser, task class ApiUser(FastHttpUser): @task def get_items(self): self.client.get("/api/items") -
系统层面调优
bash复制# 增加文件描述符限制 ulimit -n 100000 # 调整内核参数 echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf sysctl -p -
Locust配置优化
bash复制# 提高Locust自身性能 locust -f test.py --headless -u 10000 -r 100 \ --run-time 1h \ --expect-workers 10 \ --master \ --html report.html \ --csv-full-history \ --loglevel DEBUG
在实际的压测项目中,我发现当并发用户超过5000时,单个Locust master节点可能成为瓶颈。这时可以采用分片测试方案:将总用户数拆分为多个区间,由不同的master节点分别管理,最后合并测试结果。这种方案在某次金融系统压力测试中成功实现了10万级并发的模拟。
