3. 测试工具选型:JMeter、wrk、Locust 基础与选择策略
说到吞吐测试,选对工具等于成功了一半。我见过不少团队,工具选错了,折腾半天数据根本没法看。今天咱们就把 JMeter、wrk、Locust 这三款主流工具掰开揉碎聊一聊。
3.1 JMeter 基础使用
JMeter 是老牌劲旅了。我最早接触性能测试就是用它,那时候还在做电商项目,压测登录接口。说实话,它的 GUI 界面第一次看确实有点懵,但用顺手了会发现它真的很强大。
核心概念
- 线程组:模拟用户数,相当于并发量
- 取样器:发什么请求(HTTP、JDBC 等)
- 监听器:看结果(聚合报告、图形结果)
- 断言:判断请求是否成功
快速上手
创建一个 HTTP 请求的测试计划,大概就这几步:
- 添加线程组,设置线程数(比如 100)、Ramp-Up 时间(10 秒)、循环次数
- 添加 HTTP 请求默认值,填好协议、域名、端口
- 添加 HTTP 请求取样器,填路径和参数
- 添加聚合报告监听器
- 点绿色三角运行
关键参数解读:聚合报告里的 Throughput 就是吞吐量(单位通常是 requests/sec)。90% Line 表示 90% 的请求在多少毫秒内完成,这个比平均响应时间更有参考价值。
我的经验:JMeter 跑分布式压测时,Controller 和 Agent 的时间一定要同步。我曾经因为时间差了几秒,聚合出来的数据全是乱的,排查了半天才发现是 NTP 没配好。
3.2 wrk 基础使用
wrk 是个轻量级选手,用 C 写的,性能极高。说白了,它就是一把手术刀,专门用来快速测量单接口的吞吐上限。
安装与基本命令
# 安装(Mac)
brew install wrk
# 基本用法
wrk -t12 -c400 -d30s http://localhost:8080/api/test
参数含义:-t 是线程数,-c 是连接数,-d 是持续时间。
输出解读
Running 30s test @ http://localhost:8080/api/test
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.67ms 12.34ms 198.00ms 75.00%
Req/Sec 723.45 89.21 1.02k 70.00%
259842 requests in 30.00s, 38.97MB read
Requests/sec: 8661.40
Transfer/sec: 1.30MB
看到 Requests/sec: 8661.40 了吗?这就是吞吐量。wrk 的输出非常干净,没有多余的东西。
注意:wrk 只支持 HTTP/1.1,不支持 HTTPS(除非编译时加了 OpenSSL)。而且它不能做复杂的业务逻辑,比如登录态保持、参数关联。它就是纯压测工具,不是测试框架。
3.3 Locust 基础使用
Locust 是用 Python 写的,它的设计理念很特别——用代码定义用户行为。我个人很喜欢这种方式,因为可编程性极强。
一个简单的压测脚本
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5) # 用户等待时间 1-5 秒
@task
def view_homepage(self):
self.client.get("/")
@task(3)
def view_item(self):
self.client.get("/item?id=1001")
你看,@task(3) 表示这个接口被访问的概率是前者的 3 倍。这种权重设计在模拟真实用户行为时特别有用。
运行与监控
# 启动 Web 界面
locust -f locustfile.py --host=http://localhost:8080
打开浏览器访问 http://localhost:8089,就能看到实时图表。Locust 的 Web UI 做得相当漂亮,可以动态调整并发数,这点 JMeter 和 wrk 都比不了。
适用场景:需要模拟复杂用户行为、需要动态调整压测参数、团队熟悉 Python。不适合纯性能基准测试,因为 Locust 自身的开销比 wrk 大不少。
3.4 工具对比与选择策略
这三款工具各有千秋。我画了张图,帮你快速理清思路:
详细对比表
| 维度 | JMeter | wrk | Locust |
|---|---|---|---|
| 开发语言 | Java | C | Python |
| 学习曲线 | 中等(GUI 复杂) | 低(命令简单) | 低(Python 基础) |
| 最大并发能力 | 高(分布式) | 极高(单机万级) | 中(受 Python GIL 限制) |
| 协议支持 | HTTP/HTTPS/JDBC/FTP 等 | HTTP/1.1 | HTTP/HTTPS(可扩展) |
| 结果报告 | 丰富(图表、HTML 报告) | 简单(命令行输出) | 实时 Web 图表 |
| 分布式支持 | 原生支持 | 不支持 | 支持(需额外配置) |
| 适用场景 | 全链路压测、复杂场景 | 快速基准测试 | 行为模拟、持续集成 |
我的选择策略
嗯,这里我直接给结论:
- 想快速知道接口能扛多少 QPS → 用 wrk,30 秒出结果
- 要做完整的性能回归,有复杂的业务逻辑 → 用 JMeter,它的插件生态能帮你搞定大部分问题
- 团队全是 Python 工程师,需要灵活定制 → 用 Locust,写代码比拖拽组件快多了
避坑指南:我曾经在一个项目里只用 wrk 压测,结果上线后接口在高峰期挂了。后来发现 wrk 的请求模式太单一,没有模拟真实用户的思考时间和行为分布。所以我的建议是:wrk 用来摸高,JMeter 或 Locust 用来做精细化压测,两者结合才是王道。