压测工具选型:wrk、JMeter、Locust、自研工具对比

做交易系统压测,选工具是个头疼事。我见过不少团队,一上来就怼着JMeter猛干,结果发现连个TCP连接都模拟不好。也见过有人用wrk跑HTTP,跑得飞起,但一问能不能发自定义协议包,直接傻眼。

说白了,没有万能工具。只有适合你场景的工具。今天我就把这几个主流工具掰开揉碎,结合我踩过的坑,给你讲明白。

一、先看一张图,理清思路

下面这张图,是我自己总结的选型决策流程。你照着走一遍,基本不会选错。

压测工具选型决策流程 开始选型 协议类型? HTTP wrk / JMeter TCP/UDP 自研 / Locust 并发模型? 协程 Locust (Python) 多线程 JMeter (Java) 定制需求? 自研工具 wrk / JMeter 确定工具

二、逐个工具拆解

1. wrk —— 轻量级HTTP压测利器

wrk是我个人最常用的工具之一。它基于C语言和libuv事件循环,单机就能压出几十万QPS。你想想看,一个几MB的二进制文件,跑起来比JMeter轻快多了。

但wrk有个硬伤:只支持HTTP协议。交易系统里很多场景是自定义TCP协议,或者FIX协议,wrk就无能为力了。

适用场景:

  • RESTful API接口压测
  • WebSocket行情推送压测
  • 快速验证单机吞吐上限

我的经验: 有一次压测行情网关,wrk跑出50万QPS,但实际生产只有10万。后来发现wrk的keep-alive连接复用太理想化,真实网络环境根本达不到。所以wrk的结果要打折扣看。

2. JMeter —— 功能全面但笨重

JMeter是Java生态的老牌工具。插件丰富,能压HTTP、JDBC、JMS,甚至能写Groovy脚本模拟复杂业务逻辑。我见过有人用它压测撮合引擎的数据库连接池,确实方便。

但JMeter的并发模型是基于线程的。你想想看,Java线程开销大,一台机器开1000个线程,CPU就飙到80%了。而wrk用事件驱动,同样资源能跑10倍并发。

避坑指南: 我曾经用JMeter压测一个低延迟交易系统,结果JMeter本身成了瓶颈。客户端CPU打满,服务端才用了20%。后来换成自研工具,才压出真实上限。所以JMeter适合压测业务逻辑复杂的场景,不适合追求极致吞吐。

3. Locust —— Python玩家的选择

Locust用Python写测试脚本,上手快。它的并发模型基于协程(gevent),比JMeter的线程模型轻量。我团队里有个量化研究员,半天就写出了一个FIX协议的压测脚本。

但Locust的弱点也很明显:Python的GIL锁限制了CPU利用率。单机压测,Locust的吞吐上限大概在5-10万QPS,再高就吃力了。

适用场景:

  • 快速原型验证
  • 非核心系统的压测
  • 团队以Python为主的场景

4. 自研工具 —— 终极方案

说实话,交易系统压测做到最后,大部分团队都会走向自研。为什么?因为交易系统的协议太特殊了。FIX协议、CTP协议、自定义二进制协议,这些通用工具都不支持。

我参与过的一个项目,自研压测工具用C++写的,基于DPDK收发包,单机压出了200万QPS。当然,自研成本也高,一个成熟的压测框架,开发周期至少2-3个月。

我的建议: 不要一上来就自研。先用wrk或JMeter跑通流程,找到瓶颈点。等确定需要定制协议或极致性能时,再投入自研。我见过太多团队,花3个月自研工具,结果发现wrk加个Lua脚本就能搞定。

三、核心对比表格

维度 wrk JMeter Locust 自研工具
协议支持 仅HTTP HTTP/数据库/消息队列 HTTP/自定义 完全自定义
并发模型 事件驱动 多线程 协程 按需设计
单机吞吐 50万+ QPS 5-10万 QPS 5-10万 QPS 100万+ QPS
学习成本
定制灵活性 低(Lua脚本有限) 中(插件/Groovy) 中(Python脚本)
适合场景 HTTP接口压测 复杂业务压测 快速原型 低延迟/自定义协议

四、选型决策指南

说了这么多,到底怎么选?我给你一个三步走策略:

  1. 先看协议: 如果只是HTTP,wrk优先。如果有自定义协议,直接考虑自研或Locust。
  2. 再看并发: 需要百万级并发?自研或wrk。几万并发?JMeter或Locust都行。
  3. 最后看团队: 团队Java多,用JMeter。Python多,用Locust。C++多,自研。

我的经验总结: 交易系统压测,80%的场景用wrk+自研脚本就能覆盖。剩下20%的复杂场景,才需要JMeter或Locust。别把工具选型搞得太复杂,先跑起来再说。

五、一个真实案例

去年我帮一个期货公司做压测。他们的交易网关用的是FIX协议,内部还夹了一层加密。一开始他们用JMeter,写了个Java插件处理加密,结果压到3万QPS就上不去了。

我过去一看,JMeter的线程模型把CPU都吃在上下文切换上了。后来我们用C++自研了一个压测工具,基于epoll+线程池,直接压到30万QPS。嗯,这里要注意,自研工具虽然强,但开发周期花了3周。如果项目时间紧,还是得权衡。

所以我的建议是:先用wrk验证基础性能,再用自研工具压极限。 这样既快又准。


公众号:蓝海资料掘金营,微信deep3321