压测工具选型: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强很多。

三、如何根据场景选择?一张图说清楚

我画了一张决策流程图,帮你快速定位该用哪个工具。

压测工具选型决策流程图 开始选型 协议是否复杂? 是 LoadRunner 否 团队会Python? 是 Locust 否 并发 > 1000? 是 wrk 否 需要GUI? 是 JMeter 否 wrk 注:此流程适用于80%的常见场景。特殊协议(如SAP、Citrix)请直接选LoadRunner。 决策节点 工具节点 条件判断

四、我的选型建议总结

说了这么多,最后给个简单粗暴的结论:

  • 如果你要测SAP、Citrix、Oracle Forms → 别想了,直接上LoadRunner。其他工具搞不定。
  • 如果你要测HTTP/HTTPS,团队有测试人员 → JMeter。生态好,资料多,招人容易。
  • 如果你要测单接口极限性能 → wrk。10秒出结果,不废话。
  • 如果你要测复杂业务逻辑,团队会Python → Locust。写脚本比JMeter的GUI拖拽快10倍。
  • 如果你预算有限,又要企业级报告 → JMeter + Grafana。免费方案也能打。

最后提醒一句:工具只是手段,不是目的。我见过有人花两周时间研究wrk的Lua脚本,结果被测服务本身就有性能瓶颈。先搞清楚你要测什么,再选工具。顺序别搞反了。

好了,选型这块就聊到这儿。记住,没有最好的工具,只有最合适的工具。下次做压测前,先拿这张流程图走一遍,基本不会选错。