压测工具选型:JMeter、LoadRunner、wrk、Locust对比
做压测这么多年,我经常被问到同一个问题:「到底该用哪个工具?」
说实话,没有万能工具。每个工具都有自己的脾气。选错了,你可能会在调试工具上花掉一半时间。选对了,事半功倍。
今天我就把这四个主流工具掰开揉碎讲清楚。你想想看,搞明白它们的区别,以后选型就是填空题了。
核心观点:工具没有绝对好坏,只有场景匹配度。我见过有人用JMeter测WebSocket,折腾三天没跑起来。也见过有人用wrk测复杂业务流程,最后自己写了几百行Lua脚本。嗯,都是选型没想明白。
一、四款工具的核心定位
先给个全景图。我习惯把压测工具分成两类:重量级选手和轻量级快枪手。
| 工具 | 类型 | 核心优势 | 典型场景 |
|---|---|---|---|
| JMeter | 重量级 | 协议支持全面,生态丰富 | HTTP/HTTPS、数据库、消息队列 |
| LoadRunner | 重量级 | 企业级监控,报告强大 | 大型企业、复杂协议、合规要求 |
| wrk | 轻量级 | 极致性能,低资源消耗 | 单接口压测、性能基线验证 |
| Locust | 轻量级 | Python脚本,灵活可扩展 | 自定义协议、分布式压测 |
说白了,选工具就是回答三个问题:测什么协议?要多少并发?团队什么技术栈?
二、逐个拆解:每个工具怎么用
1. JMeter — 万金油选手
我个人最常用的工具就是JMeter。为什么?因为它什么都能测。HTTP、HTTPS、JDBC、JMS、FTP……你想到的协议它基本都支持。
适合场景:
- 需要录制脚本的复杂业务流程
- 需要参数化、关联、断言的功能性压测
- 团队里测试人员多,需要图形化界面
避坑指南:我曾经用JMeter测一个高并发场景,开到2000线程时,JMeter自己先挂了。后来才发现,JMeter本身是Java写的,每个线程都是操作系统线程。开太多线程,压测机自己就成了瓶颈。
我的建议:JMeter单机并发控制在1000以内。超过这个数,用分布式模式。或者换wrk。
代码示例:一个简单的HTTP请求配置(通过JMeter GUI操作,这里给出等效的脚本片段)
// JMeter 命令行模式示例
jmeter -n -t test_plan.jmx -l results.jtl -e -o report_dir
// 参数说明
// -n: 非GUI模式
// -t: 测试计划文件
// -l: 结果文件
// -e: 生成报告
// -o: 报告输出目录
2. LoadRunner — 企业级老大哥
LoadRunner我接触得比较早,刚入行时公司花了几十万买License。说实话,它确实强大,但也很重。
适合场景:
- 银行、金融等需要合规审计的企业
- 需要监控服务器资源(CPU、内存、IO)的深度压测
- 复杂协议如Citrix、SAP、Oracle Forms
避坑指南:我记得有一次帮客户做SAP压测,LoadRunner的VuGen录制脚本时,录了整整2小时。回放时发现一堆乱码。后来发现是SAP GUI版本不匹配。嗯,这种坑只有踩过才知道。
注意:LoadRunner的License是按虚拟用户数收费的。我见过一个项目,买了5000个VUser License,实际只用到了200。钱花了,资源浪费了。所以,预算有限的话,慎选。
3. wrk — 性能测试的AK47
wrk是我做性能基线测试时的首选。它轻量、快速、不废话。你给它一个URL,它就能压到你的网卡跑满。
适合场景:
- 单接口的极限性能测试
- 快速验证代码优化效果
- 对比不同服务器的吞吐能力
代码示例:
# 基础用法:100个连接,4个线程,压30秒
wrk -t4 -c100 -d30s http://target-server.com/api
# 带自定义脚本:模拟POST请求
wrk -t4 -c100 -d30s -s post.lua http://target-server.com/api
# post.lua 内容示例
wrk.method = "POST"
wrk.body = '{"userId": 123}'
wrk.headers["Content-Type"] = "application/json"
避坑指南:我曾经用wrk压一个Nginx服务,发现吞吐量上不去。查了半天,结果是wrk所在机器的ulimit没调。默认1024个文件描述符,连接数一上去就报错。所以,用wrk前先检查系统参数。
我的习惯:wrk适合做「黑盒压测」,就是我不关心业务逻辑,只关心吞吐量。如果要做「白盒压测」,比如带登录态、带参数关联,那还是用JMeter或Locust吧。
4. Locust — Python玩家的最爱
Locust是我最近两年用得越来越多的工具。为什么?因为它是Python写的。你想想看,现在做性能测试的,谁还不会点Python?
适合场景:
- 需要自定义复杂业务逻辑的压测
- 团队以Python技术栈为主
- 需要分布式压测,且不想折腾JMeter的分布式配置
代码示例:
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 5) # 模拟用户思考时间
@task(3) # 权重3
def view_homepage(self):
self.client.get("/")
@task(1) # 权重1
def login(self):
self.client.post("/login", json={
"username": "test_user",
"password": "test_pass"
})
避坑指南:我曾经用Locust压一个需要登录态的系统。一开始没处理好Cookie传递,结果所有请求都返回302重定向。后来用self.client.cookiejar手动管理Cookie才搞定。嗯,Locust的Session管理需要自己注意。
核心优势:Locust的每个用户是一个greenlet(协程),不是操作系统线程。所以单机可以轻松模拟几千甚至上万个用户。这一点比JMeter强很多。
三、如何根据场景选择?一张图说清楚
我画了一张决策流程图,帮你快速定位该用哪个工具。
四、我的选型建议总结
说了这么多,最后给个简单粗暴的结论:
- 如果你要测SAP、Citrix、Oracle Forms → 别想了,直接上LoadRunner。其他工具搞不定。
- 如果你要测HTTP/HTTPS,团队有测试人员 → JMeter。生态好,资料多,招人容易。
- 如果你要测单接口极限性能 → wrk。10秒出结果,不废话。
- 如果你要测复杂业务逻辑,团队会Python → Locust。写脚本比JMeter的GUI拖拽快10倍。
- 如果你预算有限,又要企业级报告 → JMeter + Grafana。免费方案也能打。
最后提醒一句:工具只是手段,不是目的。我见过有人花两周时间研究wrk的Lua脚本,结果被测服务本身就有性能瓶颈。先搞清楚你要测什么,再选工具。顺序别搞反了。
好了,选型这块就聊到这儿。记住,没有最好的工具,只有最合适的工具。下次做压测前,先拿这张流程图走一遍,基本不会选错。