压测工具选型:wrk、ab、JMeter、Locust、Go-stress-testing 对比

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

说实话,没有银弹。每个工具都有自己的脾气。我见过有人用 ab 测长连接,结果数据惨不忍睹;也见过团队用 JMeter 压一个简单接口,光配置就花了两天。

今天我把主流工具拉出来遛遛。咱们不吹不黑,就聊聊我实际用下来的感受。

先看一张图,心里有个谱

压测工具 轻量级 wrk / ab 企业级 JMeter 分布式/脚本化 Locust / Go-stress-testing 单机 命令行 GUI 插件丰富 Python脚本 高并发 选型核心:看场景、看团队、看资源消耗

wrk:我的压箱底工具

wrk 是我个人最常用的工具。为什么?因为它够快,够轻。

它基于 C 语言 + libuv 事件驱动,单机就能压出很高的并发。我习惯用它来做接口的快速摸底。

核心优势:

  • 单机并发能力极强,轻松上万连接
  • 支持 Lua 脚本,可以自定义请求逻辑
  • 资源占用极低,压测本身不成为瓶颈

举个例子,我压一个简单的 GET 接口:

wrk -t12 -c400 -d30s http://target.com/api/health

这条命令的意思是:12 个线程,400 个连接,持续 30 秒。结果里会直接告诉你 QPS、延迟分布。

我的小技巧: 用 wrk 做基准测试时,先跑一轮短时间的(比如 10 秒),看看大概水位。然后再加长时间做稳定测试。别一上来就压 10 分钟,万一接口有问题,你连调试的机会都没有。

注意: wrk 不支持 Windows 原生运行。如果你在 Windows 上开发,要么用 WSL,要么换工具。我曾经因为这个折腾了半天,最后老老实实装了 Ubuntu 虚拟机。

ab:老牌工具,但别太依赖它

ab(Apache Bench)是 Apache 自带的压测工具。说实话,我现在用得少了。但它有个好处:几乎每台 Linux 服务器都自带。

我记得有一次线上出问题,我手边没有任何压测工具。apt-get install 又慢得要命。最后直接用 ab 顶上去,好歹把问题复现了。

ab -n 10000 -c 100 http://target.com/api/health

这条命令:总共 10000 个请求,并发 100。

ab 的硬伤:

  • 只支持 HTTP/1.0,不支持连接复用
  • 无法模拟复杂的业务逻辑
  • 高并发下自身性能会下降

说白了,ab 适合做「有没有问题」的快速验证。但你要做精细化的性能分析,它不够格。

JMeter:功能最全,但也是最重的

JMeter 是 Java 生态里的老大哥。我见过很多大厂团队都在用。它的插件生态非常丰富,几乎什么协议都能测:HTTP、JDBC、JMS、FTP……

但我要说句实话:JMeter 太重了。启动慢,吃内存,配置复杂。我见过有人为了压一个简单的 REST 接口,在 JMeter 里拖了十几个组件。

什么时候用 JMeter?

  • 需要复杂的测试场景编排(比如登录→下单→支付)
  • 需要生成详细的 HTML 报告
  • 团队里有人习惯用 GUI 工具

避坑指南: 我曾经用 JMeter 压一个高并发场景,结果 JMeter 自己先 OOM 了。后来发现是监听器配置太多,每个请求都要写日志。记住:压测时关掉不必要的监听器,用命令行模式运行。

Locust:Python 玩家的首选

Locust 是我最近两年用得越来越多的工具。原因很简单:用 Python 写压测脚本。

你想想看,如果你团队里都是 Python 工程师,让他们去学 JMeter 的 XML 配置,或者 wrk 的 Lua 脚本,是不是有点反人性?

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 5)
    
    @task
    def index(self):
        self.client.get("/")

这段代码定义了一个用户行为:每隔 1-5 秒访问一次首页。简单、直观、可扩展。

Locust 的亮点:

  • 基于协程,单机并发能力不错
  • 支持分布式,可以横向扩展
  • Web UI 实时查看结果

我的经验: Locust 的 Web UI 在压测过程中会消耗一些资源。如果你追求极致性能,建议用 --headless 模式运行,只收集数据。

Go-stress-testing:后起之秀

这个工具是 Go 语言写的。说实话,我一开始没太在意它。直到有一次我需要压一个 WebSocket 服务,wrk 不支持,JMeter 配置太麻烦,Locust 的 WebSocket 支持又不够成熟。

最后试了 Go-stress-testing,真香。

go-stress-testing -c 100 -n 10000 -u http://target.com/api/health

它的优势:

  • 单机并发能力极强(Go 的 goroutine 优势)
  • 支持 HTTP、WebSocket、TCP 等多种协议
  • 编译成二进制,部署简单

不过它也有缺点:社区相对较小,文档不够完善。如果你遇到奇怪的问题,可能得自己读源码。

横向对比:一张表说清楚

特性 wrk ab JMeter Locust Go-stress-testing
语言 C C Java Python Go
单机并发 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
脚本灵活性 ⭐⭐⭐ ⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
学习成本 低 极低 高 中 低
协议支持 HTTP HTTP 多协议 HTTP + 扩展 HTTP/WebSocket/TCP
分布式支持 否 否 是 是 有限
报告生成 命令行 命令行 HTML/图表 Web UI 命令行

我个人的选型建议

说了这么多,到底怎么选?我总结几条经验:

  • 快速摸底、基准测试 → 用 wrk。轻量、高效、不废话。
  • 简单验证、临时救急 → 用 ab。服务器自带,拿来就用。
  • 复杂业务场景、团队协作 → 用 JMeter。虽然重,但功能全。
  • Python 团队、快速迭代 → 用 Locust。脚本即代码,维护成本低。
  • 高并发、多协议、部署简单 → 用 Go-stress-testing。后起之秀,值得一试。

最后说一句: 工具只是手段,不是目的。我见过有人用 wrk 压出了漂亮的 QPS 数据,但上线后系统还是崩了。为什么?因为压测场景和真实流量不一样。所以,理解你的系统,比选对工具更重要。

想要更多资料,联系可可