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

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

说实话,没有银弹。每个工具都有自己的脾气。我见过有人用 ab 测 WebSocket,结果测了个寂寞;也见过团队用 JMeter 压一个简单的 API,光配置就花了两天。

今天我把主流工具拉出来遛一遛。你想想看,选工具就像选螺丝刀——拧十字螺丝你用一字刀,那不是跟自己过不去吗?

核心观点:选工具不是选「最好的」,而是选「最合适的」。你的业务场景、团队技术栈、压测目标,这三者决定了答案。

一、先看一张全景图

下面这张图是我自己整理的,把五个工具的核心定位画了出来。你看一眼就能明白个大概。

压测工具选型全景图 JMeter 重量级 · 全功能 Locust Python · 协程 wrk C语言 · 高性能 ab Apache · 极简 Go-stress-testing Go语言 · 轻量 功能丰富度 → 性能/并发能力 → JMeter Locust wrk ab Go-stress-testing 越靠右上角:功能越强 + 性能越高

嗯,这张图其实透露了一个信息:没有工具能同时站在右上角。功能越强,往往性能开销越大;性能越极致,功能就越简陋。这是 trade-off,你得接受。

二、逐个拆解:每个工具的长短处

1. JMeter —— 压测界的「瑞士军刀」

我个人习惯把 JMeter 当作主力工具。为什么?因为它太全面了。HTTP、JDBC、JMS、FTP、甚至 gRPC 都能测。你想想看,一个工具能覆盖这么多协议,这在团队协作时特别省心。

但 JMeter 也有它的毛病。我记得有一次压一个高并发接口,开到 2000 线程时,JMeter 自己先卡死了。后来排查发现,是 GUI 模式下的资源消耗太大。说白了,JMeter 的 Java 虚拟机本身就要吃掉不少内存。

我的建议:JMeter 适合做复杂业务场景的压测,尤其是需要参数化、断言、监听器组合的场景。但别用它做「纯性能测试」——就是那种只关心 QPS 的场景,用 wrk 更合适。

2. Locust —— Python 玩家的最爱

Locust 最大的亮点是:用 Python 写压测脚本。如果你团队里都是 Python 工程师,那 Locust 简直是天选之子。它的协程模型让单机并发能力远超 JMeter。

不过,Locust 的坑也不少。我曾经遇到过一个项目,用 Locust 压测时,Python 的 GIL 锁导致 CPU 跑不满。后来改成多进程模式才解决。嗯,这里要注意:Locust 的 worker 进程数要跟 CPU 核数匹配,不是越多越好。

避坑指南:我曾经用 Locust 压测一个长连接服务,结果发现 Locust 默认的 HTTP 客户端会复用连接,导致压测结果偏乐观。后来我强制禁用了连接复用,才拿到真实数据。

3. wrk —— 性能怪兽

wrk 是用 C 语言写的,底层基于 Redis 的 ae 事件循环。说白了,它就是为了「压出极限」而生的。我见过有人用 wrk 单机压出 10 万 QPS,而同样的机器用 JMeter 只能压到 2 万。

但 wrk 的短板也很明显:只能测 HTTP 协议,而且脚本能力极弱。你想做复杂的参数化?对不起,不支持。你想做断言?也没有。

我个人习惯把 wrk 当作「快速验证工具」。比如上线前,先跑一把 wrk 看看接口的毛刺情况。如果 wrk 都扛不住,那就不用上 JMeter 了。

4. ab —— 古董级工具

ab 是 Apache 自带的压测工具,简单到令人发指。一条命令就能跑起来:

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

但它的缺点也很致命:不支持 HTTP/2,不支持 Keep-Alive 的精细控制。我记得有一次用 ab 压测一个 HTTPS 站点,结果 SSL 握手开销占了 60% 的 CPU,压测数据完全失真。

所以我的态度很明确:ab 只适合做「能不能通」的冒烟测试,别拿它做正式压测。

5. Go-stress-testing —— 后起之秀

这个工具是 Go 语言写的,最近几年在中文社区挺火。它的优势是:部署简单、单文件、跨平台。而且 Go 的 goroutine 模型让并发能力很强。

我试用过一次,感觉它的设计思路跟 wrk 有点像,但多了一些实用功能,比如支持自定义 Header、支持 JSON 格式的请求体。不过,它的生态还比较弱,社区文档也不够完善。

一句话总结:如果你想要一个「比 wrk 功能多一点,比 JMeter 轻量很多」的工具,Go-stress-testing 值得一试。

三、选型策略:到底怎么选?

我整理了一个决策表,你直接对着看就行:

场景 推荐工具 理由
复杂业务流程压测(多接口、参数化、断言) JMeter 功能最全,社区最成熟
Python 技术栈团队 Locust 脚本友好,协程模型高效
单接口极限压测(追求 QPS) wrk C 语言实现,性能极致
快速冒烟测试 ab 一条命令搞定,零配置
轻量级压测、快速验证 Go-stress-testing 单文件部署,Go 并发模型
分布式压测 JMeter + Locust 两者都支持分布式部署

你可能会问:「那我能不能混着用?」

当然可以。我自己的习惯是:先用 wrk 摸上限,再用 JMeter 做场景。这样既快又准。你想想看,如果 wrk 都压不上去,那 JMeter 就更没戏了,对吧?

四、避坑指南:我踩过的那些坑

  • 别用 GUI 模式跑高并发:JMeter 的 GUI 模式会吃掉大量资源。我习惯在命令行跑:jmeter -n -t test.jmx -l result.jtl
  • 注意 Locust 的 Python 版本:Python 3.8 以下版本有协程 bug,会导致压测数据不准。我建议用 Python 3.10+
  • wrk 的 Lua 脚本别写太复杂:wrk 的 Lua 脚本是同步执行的,写复杂了反而拖慢性能。保持脚本在 20 行以内
  • ab 的 -c 参数别开太大:ab 的并发模型是 fork 进程,开太多进程会导致系统上下文切换开销暴增。我一般不超过 100
  • Go-stress-testing 注意内存泄漏:这个工具还在快速迭代中,我遇到过长时间压测后内存泄漏的问题。建议每次压测不超过 30 分钟

五、最后说两句

选工具这件事,说白了就是「看人下菜碟」。你团队擅长什么、你要测什么场景、你有多长时间,这三个问题想清楚了,答案自然就有了。

我个人建议:团队里至少备两个工具——一个重型(JMeter 或 Locust),一个轻型(wrk 或 Go-stress-testing)。这样不管遇到什么场景,你都有牌可打。

嗯,今天就聊到这儿。工具只是手段,真正重要的是你对系统的理解。下一章我们聊聊压测场景的设计,到时候见。

可可精品资料库