Skip to content

第 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

特性LocustJMeterk6
脚本语言PythonXML / GroovyJavaScript
并发模型gevent 协程线程Go goroutine
分布式内置 master-worker需要 JMeter Server云原生
学习曲线低(会 Python 即可)中高
可编程性⭐⭐⭐ 完整 Python⭐⭐ Groovy 脚本⭐⭐ JS 子集
GUIWeb 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 的对比,下列说法正确的是?

🛠️ 动手实践

  1. 安装 Locust 并运行 locust --version,记录版本号。
  2. 编写本章的 locustfile.py(把 URL 换成你能访问的网站),在 Web UI 中用 5 个用户跑 30 秒。
  3. 阅读 Increasing the request rate 页面,列出三种提高单机请求率的方法。

完成后进入第 2 章