第 1 章 · 性能测试与 Locust 概述
本章目标:理解负载测试、压力测试与浸泡测试的区别,了解 Locust 的事件驱动架构,安装并验证 Locust 环境。
1.1 性能测试的三种类型
性能测试不是一种测试,而是一族测试。工程实践中最常混淆的是以下三种:
| 类型 | 目标 | 典型问题 |
|---|---|---|
| 负载测试 | 验证系统在预期并发下是否达标 | "500 人同时在线时页面还能在 2s 内打开吗?" |
| 压力测试 | 找到系统的崩溃点 | "再加多少用户系统会开始报错?" |
| 浸泡测试 | 检测长时间运行下的资源泄漏 | "连续运行 24h 后内存会不会涨满?" |
三者的关系
负载测试回答"够不够快",压力测试回答"能扛多少",浸泡测试回答"撑得久吗"。一次完整的性能评估通常三者都要做。
1.2 Locust 是什么
Locust 是一个用 Python 编写的开源负载测试工具。它的核心特点:
python
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")一个压测脚本就是一个普通的 Python 文件——这意味着你可以用循环、函数、第三方库来构造任意复杂的用户行为,而不必学习 XML 配置或专有 DSL。
1.3 架构:事件驱动 + gevent
Locust 的并发模型建立在两个基石上:
- gevent:基于协程的并发库,每个虚拟用户运行在自己的 greenlet(微线程)中。单进程可轻松模拟数千用户,远低于线程或进程方案的内存开销。
- 事件驱动:请求完成、任务执行、测试启停都会触发事件钩子,你可以在这些钩子上注入自定义统计、告警和日志逻辑。
text
┌─────────────┐ ┌──────────┐ ┌─────────────┐
│ Master 节点 │────▶│ Worker×N │────▶│ 目标系统 │
│ (Web UI/统计)│◀────│ (greenlet)│◀────│ │
└─────────────┘ └──────────┘ └─────────────┘单机不够时,Locust 支持一主多从的分布式模式:Master 节点负责调度和汇总统计,Worker 节点各自产生流量。
1.4 Locust vs JMeter vs k6
| 特性 | Locust | JMeter | k6 |
|---|---|---|---|
| 脚本语言 | Python | XML / Groovy | JavaScript |
| 并发模型 | gevent 协程 | 线程 | Go goroutine |
| 分布式 | 内置 master-worker | 需要 JMeter Server | 云原生 |
| 学习曲线 | 低(会 Python 即可) | 中高 | 低 |
| 可编程性 | ⭐⭐⭐ 完整 Python | ⭐⭐ Groovy 脚本 | ⭐⭐ JS 子集 |
| GUI | Web UI(浏览器) | Swing 桌面 | 无 |
选择建议:团队已用 Python 选 Locust;需要录制回放选 JMeter;追求极致单机吞吐选 k6。
1.5 安装与验证
bash
python -m venv .venv && source .venv/bin/activate
pip install locust验证安装:
bash
locust --version
# locust 2.46.x (Python 3.x.x)创建你的第一个脚本 locustfile.py:
python
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")在终端中运行:
bash
$ locust
[2026-01-01 10:00:00] INFO/locust.main: Starting web interface at http://0.0.0.0:8089打开浏览器访问 http://localhost:8089,填入目标主机地址即可启动压测。
本章小结
- 性能测试分三类:负载(够不够快)、压力(能扛多少)、浸泡(撑得久吗);
- Locust 用 Python 写压测脚本,gevent 协程实现高并发;
- 单机不够时用内置的 master-worker 分布式模式扩展;
- 相比 JMeter/k6,Locust 的优势在于"完整 Python 可编程性 + 低学习成本"。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 验证"连续运行 48 小时后内存占用持续增长"属于哪种性能测试?
2. Locust 的并发模型基于什么技术?
3. Locust 启动 Web UI 后默认监听的端口是?
4. 关于 Locust 与 JMeter 的对比,下列说法正确的是?
🛠️ 动手实践
- 安装 Locust 并运行
locust --version,记录版本号。 - 编写本章的
locustfile.py(把 URL 换成你能访问的网站),在 Web UI 中用 5 个用户跑 30 秒。 - 阅读 Increasing the request rate 页面,列出三种提高单机请求率的方法。
完成后进入第 2 章。