2. 压测工具选型
做性能压测这么多年,我经常被问到同一个问题:「到底该用哪个工具?」
说实话,没有银弹。每个工具都有自己的脾气。我见过有人用 JMeter 压出漂亮数据,也见过有人用 wrk 踩坑踩到怀疑人生。今天我就把这四个主流工具掰开揉碎,讲讲它们的优缺点,以及我个人的选型思路。
核心观点:选工具不是选「最好的」,而是选「最适合你当前场景的」。
2.1 JMeter:老牌劲旅,生态最全
JMeter 是我最早接触的压测工具。说实话,它就像一把瑞士军刀——功能多,但用起来有点沉。
优点:
- GUI 界面友好:拖拽式配置,新手也能快速上手。我记得第一次用它压测一个登录接口,半小时就搭好了脚本。
- 插件生态丰富:从 JDBC 到 Redis,从 Kafka 到 gRPC,几乎你能想到的协议都有插件支持。
- 分布式压测:一台机器不够?加机器就行。我在项目中用 5 台 slave 压过 10 万 QPS 的场景。
- 报告生成:内置的 HTML 报告,图表齐全,领导看了都说好。
缺点:
- 资源消耗大:Java 写的,启动慢,内存吃得多。压 1000 并发,JMeter 自己先吃掉 2G 内存。
- 脚本维护成本高:一旦接口多了,JMX 文件就变得又臭又长。我见过一个项目,JMX 文件 5000 行,改一个参数要找半天。
- 不支持协程:每个虚拟用户一个线程,并发高了容易撑爆。
我的建议:如果你团队里测试人员偏多,或者需要压测的协议种类多,JMeter 是首选。但别用它压超高并发(比如 10 万+),那是自找麻烦。
2.2 Locust:Python 党的最爱
Locust 是我个人比较喜欢的一个工具。为什么?因为脚本是用 Python 写的,可读性高,维护起来也舒服。
优点:
- 脚本即代码:用 Python 写压测逻辑,想怎么玩就怎么玩。我曾在脚本里直接调用了业务 SDK,模拟真实用户行为。
- 协程模型:基于 gevent 的协程,单机并发能力比 JMeter 强不少。我压过 5000 并发,Locust 自己才吃 500MB 内存。
- Web UI 实时监控:压测过程中能看到实时 QPS、响应时间、失败率,非常直观。
- 分布式支持:主从模式,加机器就能扩展。
缺点:
- 协议支持有限:HTTP/HTTPS 是强项,但其他协议(如 JDBC、gRPC)需要自己写客户端。嗯,这工作量可不小。
- 报告功能弱:自带的报告比较简陋,通常需要配合 InfluxDB + Grafana 才能出好看的图表。
- Python GIL 限制:虽然用了协程,但 CPU 密集型操作还是会受 GIL 影响。
避坑指南:我曾经用 Locust 压测一个 WebSocket 服务,结果发现它原生不支持 WebSocket。最后自己写了个客户端,折腾了两天才搞定。所以,用之前先确认协议支持情况。
2.3 wrk:轻量级利器,专攻 HTTP
wrk 是我压测 HTTP 接口时的首选。它轻、快、准,就像一把手术刀。
优点:
- 性能极高:用 C 写的,基于多线程 + epoll/kqueue,单机轻松压到 10 万 QPS。我压过一个优化后的 Nginx 服务,wrk 直接干到了 25 万 QPS。
- 资源消耗极低:压 1 万并发,wrk 自己才吃几十 MB 内存。对比 JMeter,简直是自行车和卡车的区别。
- Lua 脚本扩展:支持用 Lua 写自定义逻辑,比如签名、参数化。虽然不如 Python 灵活,但够用了。
缺点:
- 只支持 HTTP/HTTPS:别的协议?抱歉,不支持。想压数据库?换工具吧。
- 无 GUI:纯命令行,对新手不友好。我第一次用的时候,参数记了半天。
- 报告简陋:只有终端输出,没有图表。想生成漂亮报告?得自己写脚本解析。
- 不支持分布式:单机工具,没法多机协同压测。
适用场景:快速验证接口性能、压测静态资源、对比不同配置下的 QPS 变化。说白了,就是「我就想看看这个接口能扛多少并发」的场景。
2.4 Go-stress-testing:后起之秀,Go 语言加持
这个工具是我最近两年才开始用的。Go 写的,协程模型,性能不错。
优点:
- 协程并发:Go 的 goroutine 比线程轻量得多,单机并发能力很强。我压过 3 万并发,工具本身很稳。
- 使用简单:一条命令搞定压测,参数直观。比如
-c 1000 -n 100000 -u https://example.com,意思就是 1000 并发,总共发 10 万请求。 - 支持多种协议:HTTP、WebSocket、TCP、gRPC 都支持。虽然不如 JMeter 全,但覆盖了大部分场景。
- 编译成二进制:部署方便,不用装运行时环境。扔到服务器上就能跑。
缺点:
- 生态薄弱:插件少,社区小。遇到问题,可能得自己看源码。
- 报告功能弱:和 wrk 一样,只有终端输出。想可视化?得自己搭。
- 不支持分布式:目前还是单机工具,大规模压测需要自己写调度脚本。
我的经验:Go-stress-testing 特别适合做「快速压测 + 回归对比」。我经常在 CI/CD 流水线里用它,每次代码提交后自动跑一轮压测,对比 QPS 和响应时间的变化。一旦发现性能下降,立刻报警。
2.5 横向对比:一张表看懂
| 维度 | JMeter | Locust | wrk | Go-stress-testing |
|---|---|---|---|---|
| 开发语言 | Java | Python | C | Go |
| 并发模型 | 线程 | 协程 | 线程 + epoll | 协程 |
| 单机并发能力 | 一般(< 5000) | 较强(< 2万) | 极强(< 10万+) | 强(< 5万) |
| 协议支持 | 极丰富 | HTTP为主 | 仅HTTP | HTTP/WebSocket/TCP/gRPC |
| GUI | 有 | 有(Web) | 无 | 无 |
| 分布式 | 支持 | 支持 | 不支持 | 不支持 |
| 报告质量 | 优秀 | 一般 | 简陋 | 简陋 |
| 学习成本 | 低 | 中 | 高 | 低 |
| 部署复杂度 | 高(需JDK) | 中(需Python) | 低(编译后单文件) | 低(编译后单文件) |
2.6 选型指南:到底怎么选?
说了这么多,你可能会问:「那我到底该用哪个?」
我的建议是:按场景选,别按喜好选。
- 场景一:团队里测试人员多,需要 GUI 和丰富报告
→ 选 JMeter。插件多,报告漂亮,领导满意。 - 场景二:开发团队主导,Python 技术栈,需要灵活定制
→ 选 Locust。脚本即代码,维护成本低。 - 场景三:快速验证 HTTP 接口性能,追求极致并发
→ 选 wrk。轻量、高效,一把梭。 - 场景四:CI/CD 流水线中做性能回归对比
→ 选 Go-stress-testing。部署简单,命令一行搞定。 - 场景五:需要压测多种协议(HTTP + 数据库 + 消息队列)
→ 选 JMeter。虽然重,但协议支持最全。
我的个人习惯:我通常会在工具箱里同时备着 wrk 和 JMeter。wrk 用来快速验证和回归对比,JMeter 用来做复杂场景的压测和报告输出。两个工具互补,基本覆盖了 90% 的场景。