第二章 性能分析工具:JMeter、wrk、ab、Locust 安装与基础使用

说到性能调优,手头没趁手的工具可不行。我个人习惯先把工具箱备齐,再开始压测,这样遇到问题才不会慌。这一章带你把四款主流工具装好、跑通,顺便聊聊我在项目中踩过的坑。

2.1 工具选型:什么时候用什么

你可能会问:四个工具,我全都要学吗?说白了,每个工具都有自己的脾气。我当年刚入门时,一口气全装了,后来发现项目场景不同,用的工具也完全不同。下面这张表格帮你快速对号入座:

工具 协议支持 脚本语言 适用场景 我最常用来做什么
JMeter HTTP / HTTPS / JDBC / gRPC 等 Java / Groovy 复杂业务压测、分布式场景 模拟用户登录流程、多接口联调
wrk HTTP / HTTPS Lua(可选) 纯接口吞吐量测试、长连接 压测上游网关,看 QPS 天花板
ab (Apache Bench) HTTP / HTTPS 无 快速验证、简单 GET 请求 开发环境随手一测,确认服务是否正常
Locust HTTP / HTTPS / WebSocket 等 Python 需自定义用户行为、微服务集群 模拟真实用户打散请求,做容量规划
我的建议: 新项目初期用 ab 或 wrk 先摸个底,业务复杂后再上 JMeter 或 Locust。不要一上来就非分布式不压,很多时候单机就能暴露性能拐点。

2.2 JMeter:图形化压测王者

JMeter 是我用得最多的工具,尤其是需要精细控制请求参数的场景。安装没什么难度,但有几个细节你一定要注意。

安装步骤

  1. 环境要求: JDK 8+,推荐 JDK 11(我遇到过 JDK 17 下某些插件不兼容的情况)。
  2. 下载: 从 Apache JMeter 官网下载二进制包(.zip 或 .tgz)。
  3. 解压,启动: Windows 双击 bin/jmeter.bat,Linux/macOS 运行 bin/jmeter 即可。
踩坑记录: 我曾经在 macOS 上用 brew 安装 JMeter,结果因为权限问题导致生成报告时目录无法写入。后来老老实实手动解压到用户目录,再也没出过幺蛾子。建议你也用官方二进制包,避免奇怪的路径问题。

基础使用:一个简单的 HTTP 请求

打开 JMeter 后,先别被密密麻麻的按钮吓到。记住三步走:创建线程组、配置取样器、加监听器。我用一个例子说明:

# 1. 在测试计划上右键添加 -> 线程(用户) -> 线程组
#   设置线程数 10,Ramp-Up 时间 5 秒,循环次数 1
# 2. 在线程组上添加 -> 取样器 -> HTTP 请求
#   协议: https
#   服务器名称: api.example.com
#   路径: /health
# 3. 在线程组上添加 -> 监听器 -> 查看结果树
# 4. 点击绿色启动按钮,运行,查看结果树中的响应数据

实际业务压测时,我会加上HTTP 请求默认值来复用基础配置,再用正则表达式提取器从上一个请求中取 。这些技巧能省不少事,后面章节会细讲。

2.3 wrk:轻量级吞吐量神器

wrk 单机就能压出几十万 QPS,而且资源占用极低。我常拿它来测网关层性能,看能扛多少并发连接。

安装

Linux 上最简单:

# Ubuntu / Debian
sudo apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git
cd wrk
make
# 然后拷贝到 /usr/local/bin 便于全局使用
sudo cp wrk /usr/local/bin/

macOS 直接用 Homebrew:brew install wrk。Windows 的话我建议用 WSL 2,原生支持更好。

基础使用

wrk 的命令行参数很简洁:

wrk -t12 -c400 -d30s http://localhost:8080/api/health

这条命令的意思是:12 个线程,保持 400 个并发连接,持续压 30 秒。输出结果会告诉你平均延迟、QPS、错误率等。我个人习惯先跑一轮 -t2 -c10 -d10s 看看服务是否稳定,再慢慢加压力。

一个小技巧: 如果你要测 POST 接口或带 header 的请求,可以用 wrk2 项目(wrk 的变种),支持 Lua 脚本自定义内容。不过基础场景下,只测 GET 就够用了。

2.4 ab (Apache Bench):简单粗暴

ab 是 Apache 自带的压测工具,小巧到连安装配置都不用操太多心。适合开发阶段随手验证服务是否跑得动。

安装

Ubuntu / Debian:sudo apt-get install apache2-utils。macOS 自带,或通过 brew 安装。Windows 可以从 Apache 官方站点下载 httpd 包,里面带 ab.exe。

基础使用

ab -n 10000 -c 100 https://localhost:443/api/v1/user/123

-n 是总请求数,-c 是并发数。结果里我最关心的是 Requests per second 和 Failed requests。有一次我在本地压测时发现大量连接超时,结果检查发现是笔记本的 ulimit 限制了文件句柄数。用 ab 前一定要把系统限制调大,不然结果会误导你。

注意: ab 不支持自定义 header(无法直接带 、Cookie),所以只适合无状态或简单验证的接口。如果你需要认证头,可以用 -H 参数加一行,但多个 header 就得写多次 -H,比较啰嗦。

2.5 Locust:Python 驱动的用户模拟器

Locust 允许你用 Python 代码定义用户行为,非常适合模拟复杂的业务场景。而且它自带的 Web 界面能看到在线用户数和实时响应时间,很直观。

安装

pip install locust

安装完后运行 locust --help 验证。我建议在 Python 虚拟环境里安装,避免全局包冲突。

基础使用:写一个最简单的 locustfile.py

from locust import HttpUser, task, between

class WebsiteUser(HttpUser):
    wait_time = between(1, 5)  # 用户等待时间 1~5 秒

    @task
    def view_home(self):
        self.client.get("/hello")

在终端运行:locust -f locustfile.py --host=https://api.example.com。然后打开浏览器访问 http://localhost:8089,你会看到 Web 控制台。填写总用户数和 spawn rate(孵化速率),点击 “Start swarming” 就开始压测了。你想想看,实时图表里 QPS 曲线抖动或者出现毛刺,那基本上就是性能瓶颈的信号。

我的经验: 用 Locust 做长时间压测(比如 8 小时)时,记得把 CSV 报告定期保存,否则机器重启或进程挂了,数据就全丢了。我吃过一次亏,跑到第七小时突然断网,所有采集数据找不回来……

2.6 四款工具对比小结

通过上面这些安装和基础例子,你应该对它们有了直观感受。我再把核心差异整理成结构图,方便复习:

性能分析工具选型结构 压测工具集 JMeter wrk ab Locust • 图形化界面 • 多协议支持 • 分布式压测 • 高并发低资源 • 仅 HTTP • 命令行快速出数 • 安装即用 • 语法最简 • 不能带复杂 header • Python 脚本 • 实时 Web 界面 • 用户行为模拟 场景匹配:简单测试用 ab → 吞吐量测试用 wrk → 业务复杂用 JMeter → 行为模拟用 Locust

这张图把每款工具的核心特点标出来了。实际选型时,你可以按这个流程来:先看需要测什么协议,再看是否要有脚本逻辑,最后考虑并发规模。工具选对了,调试过程能少走很多弯路。

2.7 给你的建议

  • 安装后立刻验证: 每个工具装完,跑一个最简单的请求确认能通。我见过不少同事装完 wrk 就打错端口,折腾半天才发现。
  • 注意系统限制: Linux 上记得调大文件句柄数(ulimit -n 65535),否则压测还没开始就报错。
  • 别贪多: 新手可以先精通 JMeter 和 wrk 两个,其他两个知道怎么装怎么跑就行。用到的时候再深入研究不迟。
一个真实项目案例: 有一次我调优一个 SDK 接口,先用 ab 跑了 1000 次请求发现平均响应 32ms,以为优化很好了。后来用 wrk 压 1000 并发时,响应直接飙到 200ms 以上——原来锁竞争在高并发下才暴露。所以记住:单一维度测试是不够的,必须多工具交叉验证。

这一章的工具安装和使用只是起点。后面我们会用它们真正发掘 SDK 的性能瓶颈。先把环境搭好,后面就顺手多了。