4、压测工具选型:JMeter vs Locust vs wrk vs GoReplay

做风控系统压测,选工具是个头疼事。我见过不少团队,上来就拍脑袋选JMeter,结果发现场景不对,折腾半天数据都不可信。也见过有人迷信wrk的并发数字,却忽略了业务逻辑的模拟。

说白了,没有银弹。每个工具都有自己的脾气。我这些年四个工具都用过,踩过坑也填过坑。今天就把我的选型心得摊开来讲。

4.1 先看一张对比总表

别急着选,先看看这四个工具的核心差异。我习惯把它们的特性列成一张表,一目了然。

维度 JMeter Locust wrk GoReplay
定位 全功能压测平台 可编程压测框架 HTTP基准测试工具 流量录制回放工具
协议支持 HTTP/HTTPS/WebSocket/JDBC/自定义 HTTP/HTTPS(可扩展gRPC等) HTTP/HTTPS HTTP/HTTPS/TCP
脚本语言 GUI配置 + Groovy/Java Python Lua(仅限自定义请求) 无(基于流量录制)
并发模型 线程池 协程(gevent) epoll + 多线程 Go goroutine
单机并发能力 中等(受限于JVM线程数) 高(协程开销小) 极高(C语言内核) 高(Go原生并发)
分布式支持 原生支持(Master-Slave) 原生支持(Master-Worker) 无(需自行封装) 支持(多节点转发)
学习曲线 中等(GUI友好,但深入难) 低(Python基础即可) 低(命令行参数简单) 低(无需写脚本)
适用场景 复杂业务压测、全链路压测 灵活定制、快速迭代压测 接口基准测试、极限并发 线上流量回放、回归压测
我的建议: 别只看并发数字。风控系统压测的核心是「业务逻辑的真实性」。你模拟的请求越接近线上真实流量,压测结果越有参考价值。

4.2 JMeter:老牌劲旅,但别滥用

JMeter是我最早接触的压测工具。说实话,它的生态确实成熟。你想测什么协议,基本都能找到现成的插件。我在项目中用它做过风控全链路压测,从网关到决策引擎再到数据库,一条龙模拟。

但JMeter有个硬伤——线程模型。每个虚拟用户就是一个线程。你想想看,要模拟5000并发,JVM就得开5000个线程。这在线程调度和内存开销上,压力不小。我曾经在8C16G的机器上跑JMeter,到3000并发时,压测客户端自己先扛不住了。

什么时候选JMeter?

  • 需要复杂的业务逻辑编排(比如多个接口串联、条件判断、数据关联)
  • 团队里有测试人员,习惯GUI操作
  • 需要丰富的报告和图表
避坑指南: 我曾经在压测风控规则引擎时,用JMeter的默认配置去跑。结果发现TPS上不去,排查了半天,原来是JMeter的监听器(Listener)在收集数据时占用了大量CPU。记住:压测时关掉不必要的监听器,或者用命令行模式运行。

4.3 Locust:Python党的最爱

Locust是我个人比较偏爱的工具。原因很简单——用Python写压测脚本,太灵活了。风控系统的压测场景往往很复杂,比如需要动态生成设备指纹、模拟用户行为序列、根据响应结果调整后续请求。这些在JMeter里配置起来很繁琐,但在Locust里,几行Python代码就搞定了。

Locust的协程模型也是一大亮点。同样是5000并发,Locust的开销远小于JMeter。我曾在同一台机器上对比过,Locust能轻松跑到8000并发,而JMeter到4000就开始喘气了。

什么时候选Locust?

  • 压测场景需要大量定制逻辑
  • 团队熟悉Python
  • 需要快速迭代压测脚本(比如风控策略频繁变更时)
小技巧: 用Locust压测风控系统时,我习惯把「用户行为序列」封装成独立的TaskSet。比如登录→浏览→下单→支付,每个阶段都模拟真实的风控特征。这样压出来的数据,比随机请求靠谱得多。

4.4 wrk:极限并发的利器

wrk是个轻量级工具,核心代码就几千行。但它能压出极高的并发。为什么?因为它底层用的是epoll(Linux高性能I/O多路复用)和多线程结合,几乎没有锁竞争。

我记得有一次,需要验证风控网关的极限吞吐。用JMeter压到5000并发时,客户端CPU已经100%了。换成wrk,同样的机器,轻松压到20000并发,客户端CPU才用了60%。

但wrk的短板也很明显——它只适合做简单的HTTP请求。你想模拟复杂的业务逻辑?对不起,Lua脚本的支持很有限。你想做分布式压测?对不起,得自己写调度。

什么时候选wrk?

  • 需要测试接口的极限QPS
  • 做基准测试,对比不同配置的性能差异
  • 快速验证系统瓶颈
注意: wrk压出来的数字很好看,但别太当真。它模拟的是「最理想情况下的并发」,没有考虑业务逻辑的延迟、数据库连接池的竞争、缓存穿透等真实场景。我一般用它做「上限摸底」,而不是「容量评估」。

4.5 GoReplay:线上流量回放的神器

GoReplay是我最近两年用得越来越多的工具。它的思路和其他三个完全不同——不是「模拟」请求,而是「录制回放」线上真实流量。

为什么这对风控系统特别重要?因为风控的流量特征极其复杂。用户的行为模式、设备指纹的分布、IP的归属地、请求的时间序列……这些在模拟脚本里很难完全复现。而GoReplay直接把线上流量录下来,原封不动地打到压测环境里。

我在项目中用GoReplay做过一次风控引擎的版本回归压测。新版本上线前,把线上1小时的流量录下来,回放到预发环境。结果发现新版本在某个规则分支上性能下降了30%。如果没有GoReplay,这种问题很难在常规压测中发现。

什么时候选GoReplay?

  • 需要做线上流量回放
  • 风控系统版本升级前的回归压测
  • 模拟真实流量分布(而不是均匀分布)
避坑指南: 我曾经直接用GoReplay把线上流量回放到测试环境,结果把测试环境的数据库打爆了。为什么?因为线上流量里包含了大量重复的请求(比如轮询、心跳),这些请求在线上有缓存扛着,但在测试环境没有缓存,直接穿透到数据库。记住:回放前一定要做流量清洗,去掉无效请求,或者按比例降采样。

4.6 我的选型决策流程

说了这么多,到底怎么选?我总结了一个简单的决策流程,你可以参考:

  1. 先问自己: 我需要模拟真实业务逻辑吗?如果需要,优先考虑Locust或JMeter。
  2. 再问自己: 我有线上流量可以录制吗?如果有,优先考虑GoReplay。
  3. 最后问自己: 我只是想测个接口的极限性能?那就用wrk,简单粗暴。

当然,实际项目中往往是组合使用。我现在的习惯是:用wrk做基准测试,用Locust做业务压测,用GoReplay做回归压测。三个工具各司其职,互不冲突。

核心观点: 工具只是手段,不是目的。选工具之前,先想清楚你要回答什么问题。是「系统能扛多少并发」?还是「新版本上线后性能会不会下降」?问题不同,工具不同。

4.7 本章知识体系

下面这张图,是我对压测工具选型的整体思考框架。你可以看到,选型不是孤立的技术决策,而是和你的压测目标、团队能力、系统特点紧密相关的。

压测工具选型决策框架 压测目标 基准测试 极限并发摸底 推荐:wrk 业务压测 复杂逻辑模拟 推荐:Locust/JMeter 回归压测 版本变更验证 推荐:GoReplay 选型决策因素 团队技术栈 压测场景复杂度 是否有线上流量 并发量级要求 报告与监控需求 分布式压测需求

嗯,这张图基本概括了我的选型思路。你想想看,如果你连压测目标都没想清楚,就急着选工具,那大概率会走弯路。


专注资料整理