压测工具选型:wrk、ab、Locust、JMeter对比
做压测这么多年,我经常被问到同一个问题:到底该用哪个工具?
说实话,没有银弹。每个工具都有自己的脾气。我见过有人用ab测REST API,结果测出来的数据完全不准。也见过有人用JMeter测高并发,把自己机器先压垮了。
今天咱们就把这几个主流工具掰开揉碎,看看它们各自适合什么场景。特别是针对AI推理服务,我会给出我的实战建议。
一、四大压测工具横向对比
先看一张对比表,心里有个底:
| 工具 | 语言 | 并发模型 | 协议支持 | 学习成本 | 适合场景 |
|---|---|---|---|---|---|
| wrk | C + Lua | 多线程 + 事件驱动 | HTTP/HTTPS | 低 | 简单HTTP接口、高并发压测 |
| ab | C | 多进程 | HTTP/HTTPS | 极低 | 快速验证、单机压测 |
| Locust | Python | 协程(gevent) | HTTP + 自定义 | 中 | 复杂场景、分布式压测 |
| JMeter | Java | 多线程 | 几乎所有协议 | 高 | 全链路压测、企业级测试 |
二、逐个拆解:优点与坑
1. wrk —— 轻量级王者
我个人最喜欢wrk。为什么?因为它够快,够轻。
wrk底层用的是epoll/kqueue,单机就能压出几十万的QPS。你想想看,别的工具还在初始化线程池,wrk已经跑完一轮了。
核心优势:
- 性能极高,资源消耗极低
- 支持Lua脚本,可以做简单的请求定制
- 结果输出简洁,适合自动化集成
但wrk也有短板。它不支持HTTP/2,不支持HTTPS的复杂场景。我在项目中遇到过一个问题:用wrk压测一个带JWT鉴权的接口,Lua脚本写起来特别别扭。后来我干脆换成了Locust。
# wrk基本用法
wrk -t12 -c400 -d30s http://localhost:8080/api/v1/predict
# 参数说明:
# -t12:12个线程
# -c400:400个并发连接
# -d30s:持续30秒
2. ab —— 老兵不死,只是凋零
ab是Apache自带的压测工具。说实话,我现在很少用它了。但有时候做快速验证,它确实方便——一条命令搞定。
注意:ab的并发模型是多进程,每个请求都fork一个进程。并发数一高(比如超过1000),你的机器CPU和内存就扛不住了。我曾经用ab压测一个AI服务,结果压测机自己先挂了,尴尬。
# ab基本用法
ab -n 10000 -c 100 http://localhost:8080/predict
# -n:总请求数
# -c:并发数
3. Locust —— 脚本党的最爱
Locust用Python写测试脚本,这一点太香了。你可以用Python的requests库、numpy、甚至pandas来处理请求数据。
我记得有一次压测一个BERT模型服务,需要构造不同的输入文本。用wrk写Lua脚本,折腾了半天。换成Locust,20行Python代码搞定。
# Locust示例脚本
from locust import HttpUser, task, between
import random
class AIInferenceUser(HttpUser):
wait_time = between(0.5, 2.0)
@task
def predict(self):
# 构造不同的输入
texts = ["今天天气真好", "这个产品怎么样", "帮我查一下订单"]
payload = {"text": random.choice(texts)}
self.client.post("/predict", json=payload)
小技巧:Locust支持分布式运行。你可以用一台master控制多台worker,轻松压到几万并发。我之前的项目就是这样做的——10台worker,每台压2000并发,总共2万并发。
4. JMeter —— 企业级全能选手
JMeter功能最全,但也最重。它支持HTTP、gRPC、JDBC、JMS……几乎你能想到的所有协议。
但说实话,对于AI推理服务的压测,JMeter有点杀鸡用牛刀。它的图形界面虽然友好,但脚本维护起来很麻烦。我见过有人用JMeter压测,结果测试计划文件有几千行XML,改一个参数要找半天。
什么时候用JMeter?
- 需要做全链路压测(比如从网关到数据库)
- 需要生成复杂的测试报告
- 团队里其他人不会写代码
三、针对AI推理服务的压测工具选择
好了,重点来了。AI推理服务和普通Web服务有什么不同?
说白了,AI推理服务有几个特点:
- 请求体大:图片、文本、音频,动不动几MB
- 响应时间长:一次推理可能几百毫秒甚至几秒
- GPU显存敏感:并发一高,显存就爆
- 请求内容多变:不同输入导致不同的计算路径
基于这些特点,我的建议是:
首选:Locust
- Python脚本灵活,可以构造复杂请求
- 支持分布式,能模拟真实并发
- 可以集成显存监控(后面章节会讲)
为什么不是wrk?因为wrk的Lua脚本能力有限。你要构造一个带图片的POST请求,Lua写起来很痛苦。而Python里,一行open('image.jpg', 'rb')就搞定了。
为什么不是JMeter?因为太重了。AI服务的压测往往需要快速迭代,改个模型参数就要重新压。JMeter的GUI操作太慢。
我的实战组合:
Locust做压测 + nvidia-smi做显存监控 + Prometheus + Grafana做可视化。这套组合我用了两年,非常稳定。
四、知识体系总览
下面这张图,是我对压测工具选型的理解。你可以把它当作一个决策树:
五、我的最终建议
如果你现在让我选,我会说:
- 快速验证接口通不通:用ab,一条命令搞定
- 压测普通HTTP服务:用wrk,性能最好
- 压测AI推理服务:用Locust,配合显存监控
- 企业级全链路压测:用JMeter,功能最全
嗯,工具选型就聊到这儿。下一节咱们会深入讲Locust的实战用法,包括怎么构造AI推理请求、怎么处理大文件上传。到时候我会分享一些我踩过的坑,保证让你少走弯路。
一句话总结:没有最好的工具,只有最合适的工具。选工具之前,先想清楚你要压什么、怎么压、压多久。