压测工具选型:JMeter vs Locust vs wrk vs ab

做性能压测这么多年,我经常被问到同一个问题:「到底该用哪个工具?」

说实话,没有银弹。每个工具都有自己的脾气。我见过有人用 ab 测复杂业务逻辑,结果测了个寂寞;也见过有人用 JMeter 测简单接口,光配置就花了两小时。

今天我把四个主流工具掰开揉碎讲清楚。你想想看,选工具就像选兵器——匕首有匕首的用法,青龙偃月刀有它的场合。

一、先看一张全景图

下面这张图是我自己整理的选型逻辑。每次带新人,我都先让他们看这个。

压测工具选型 JMeter GUI配置 · 插件丰富 适合复杂业务流程 资源消耗大 · 学习曲线陡 Locust Python脚本 · 协程并发 适合自定义场景 依赖Python生态 wrk C语言 · 多线程 · 高并发 适合纯HTTP接口 不支持复杂逻辑 ab (Apache Bench) 命令行 · 极简 · 快速 适合快速摸底 功能单一 · 无扩展

二、JMeter:老牌劲旅,功能全面

JMeter 是我用得最久的工具。说实话,它的 GUI 界面第一次看确实有点懵——满屏的元件、监听器、断言器。但用顺手了,你会发现它真的很能打。

核心优势:

  • 支持多种协议:HTTP、HTTPS、JDBC、JMS、FTP……你能想到的它基本都支持
  • 插件生态丰富:从图形报表到分布式压测,社区插件一应俱全
  • 断言机制完善:响应断言、JSON断言、大小断言,想怎么验就怎么验
  • 参数化灵活:CSV数据文件、函数助手、用户变量,数据驱动很方便

我记得有一次帮客户压测一个电商下单流程——登录、选商品、加购物车、下单、支付,五个接口串起来。用 JMeter 的「事务控制器」配合「正则提取器」,半小时就搭好了。换成其他工具,光写脚本就得半天。

但要注意:

  • 资源消耗大:单机压 500 并发以上,JMeter 自己先喘上了
  • 脚本维护麻烦:GUI 保存的 jmx 文件是 XML 格式,版本对比基本靠眼
  • 学习曲线陡:新手容易在「监听器」和「配置元件」之间迷失

我的建议:如果你要压测复杂的业务流程,或者团队里测试人员不擅长写代码,JMeter 是首选。但记得压测时关掉所有监听器,用命令行模式跑——不然结果会失真。

三、Locust:Python 党的最爱

Locust 是我后来才接触的。第一次用的时候,我心想:这不就是写个 Python 脚本吗?结果一试,真香。

它的核心思想很简单:你写一个 Python 类,定义用户行为,然后 Locust 用协程帮你模拟成千上万个用户。代码即脚本,脚本即配置。

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 5)
    
    @task(3)
    def view_home(self):
        self.client.get("/")
    
    @task(1)
    def search(self):
        self.client.get("/search?q=test")

你看,就这么几行代码,一个压测脚本就写好了。想加登录?加个 on_start 方法就行。想做数据校验?直接用 Python 的 assert。

核心优势:

  • 纯 Python 编写,可读性强,版本控制友好
  • 协程并发,单机可以模拟上万用户
  • Web UI 实时查看结果,支持分布式
  • 自定义能力强:想怎么模拟用户行为都行

我曾经在一个项目中,需要模拟用户先登录、然后随机浏览商品、最后下单。用 Locust 写了个 UserBehavior 类,配合 random.choice 控制行为概率,整个脚本不到 100 行。团队里其他同事一看就懂,改起来也方便。

但要注意:

  • 依赖 Python 生态:Python 版本、第三方库版本都要管理好
  • 报告功能相对弱:默认的 Web UI 只能看实时数据,历史对比需要自己写
  • 对非 HTTP 协议支持有限:虽然可以扩展,但不如 JMeter 方便

四、wrk:轻量级高并发利器

wrk 是我做「快速摸底」时的首选。它用 C 语言写的,底层用多线程 + epoll/kqueue,单机压个几万 QPS 轻轻松松。

用法也简单到令人发指:

wrk -t12 -c400 -d30s http://example.com

这条命令的意思是:12 个线程,400 个并发连接,压 30 秒。结果直接打印在终端上——延迟分布、吞吐量、错误率,一目了然。

核心优势:

  • 性能极高:C 语言实现,几乎没有额外开销
  • 使用简单:一条命令搞定,适合快速验证
  • 支持 Lua 脚本:可以做一些简单的请求定制
  • 结果清晰:直接输出 P50/P75/P99 延迟

我记得有一次线上告警,说接口响应变慢了。我二话不说,先跑了个 wrk 看看基线——发现 P99 延迟从 50ms 飙到了 500ms。然后才去排查代码。wrk 帮我快速锁定了「是性能退化,不是偶发抖动」。

但要注意:

  • 只支持 HTTP/HTTPS 协议
  • 不支持复杂的业务逻辑:比如登录态、参数关联
  • 结果报告比较简陋:没有图表,没有历史对比
  • Windows 上安装麻烦:需要编译或者用 WSL

五、ab:最古老的压测工具

ab(Apache Bench)是 Apache 自带的压测工具。说实话,现在用得越来越少了。但它的存在价值在于——几乎所有 Linux 系统都自带。

ab -n 10000 -c 100 http://example.com/

这条命令:总共发 10000 个请求,并发 100 个。结果会告诉你每秒请求数、平均延迟、传输速率。

核心优势:

  • 零安装:Apache 自带,或者 apt-get install 一下就行
  • 极简:一条命令跑完,适合临时验证
  • 结果稳定:这么多年了,bug 很少

我曾经在客户现场,服务器上啥工具都没有,网络也不通。我直接 apt-get install apache2-utils,装完就跑 ab,5 分钟给出了初步结论。这种场景下,ab 就是救命稻草。

但要注意:

  • 功能极其单一:不支持 Cookie、不支持 POST 请求体定制(很麻烦)
  • 单机并发能力有限:超过 1000 并发,ab 自己先扛不住
  • 结果信息少:没有延迟分布,只有平均值
  • 已停止维护:Apache 官方基本不更新了

六、选型建议:到底怎么选?

场景 推荐工具 理由
复杂业务流程压测 JMeter GUI配置方便,断言和参数化完善
自定义场景、团队懂Python Locust 代码即脚本,灵活度高
纯接口高并发摸底 wrk 性能极高,结果清晰
临时快速验证 ab 零安装,一条命令搞定
分布式压测 JMeter / Locust 两者都支持分布式部署

我个人习惯:

日常工作中,我一般这样搭配:

  • 开发自测、快速摸底 → wrk
  • 接口级压测、回归验证 → Locust(脚本放 Git 里,方便团队协作)
  • 全链路压测、复杂场景 → JMeter
  • 服务器上临时验证 → ab

你想想看,工具是死的,人是活的。关键不是「哪个工具最好」,而是「哪个工具最适合你当前的场景」。

七、避坑指南

最后分享几个我踩过的坑:

  • 我曾经用 JMeter 压测时没关监听器,结果压测机 CPU 100%,吞吐量数据严重偏低。后来才知道,监听器本身也在消耗资源。压测时一定要用命令行模式:jmeter -n -t script.jmx -l result.jtl
  • 我曾经用 wrk 压测带登录态的接口,结果 wrk 不支持 Cookie 自动管理。后来用 Lua 脚本手动处理了 Cookie,才搞定。
  • 我曾经用 ab 压测 POST 接口,结果发现 ab 的 POST 数据格式很坑。后来改用 -p 参数指定文件,才勉强能用。
  • Locust 的协程模式虽然并发高,但如果你的业务代码里有阻塞操作(比如同步数据库查询),协程的优势就没了。记得用异步库。

嗯,工具选型就讲到这里。记住一句话:没有最好的工具,只有最合适的工具。选对了工具,压测就成功了一半。

可可精品资料库