压测工具选型: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做可视化。这套组合我用了两年,非常稳定。

四、知识体系总览

下面这张图,是我对压测工具选型的理解。你可以把它当作一个决策树:

压测工具选型决策树 压测需求 简单HTTP接口 复杂场景/AI服务 wrk(推荐) ab(快速验证) Locust(首选) JMeter(企业级) AI推理服务推荐:Locust + 显存监控 原因:Python脚本灵活、支持分布式、可集成监控

五、我的最终建议

如果你现在让我选,我会说:

  • 快速验证接口通不通:用ab,一条命令搞定
  • 压测普通HTTP服务:用wrk,性能最好
  • 压测AI推理服务:用Locust,配合显存监控
  • 企业级全链路压测:用JMeter,功能最全

嗯,工具选型就聊到这儿。下一节咱们会深入讲Locust的实战用法,包括怎么构造AI推理请求、怎么处理大文件上传。到时候我会分享一些我踩过的坑,保证让你少走弯路。

一句话总结:没有最好的工具,只有最合适的工具。选工具之前,先想清楚你要压什么、怎么压、压多久。

可可精品资料库