4、wrk 工具安装与基础使用:安装 wrk、发起第一个 HTTP 压测请求
4.1 为什么选 wrk?
做性能测试,工具很多。我个人习惯用 wrk,原因很简单:轻量、高效、没废话。
你想想看,很多压测工具装完就几百兆,配置起来能写篇小作文。wrk 呢?一个二进制文件,几兆大小,装完就能跑。我当年第一次用它,从下载到发出第一个请求,前后不到三分钟。
说白了,wrk 就是为「快速验证」而生的。它不像 JMeter 那样能做复杂场景,但如果你只是想看看接口能扛多少 QPS,wrk 绝对是最趁手的家伙。
4.2 安装 wrk
安装方式取决于你的操作系统。我分别说一下。
4.2.1 macOS 安装
如果你用 Homebrew,一行命令搞定:
brew install wrk
嗯,就这么简单。装完验证一下:
wrk --version
看到版本号就说明成了。
4.2.2 Linux 安装
Linux 下稍微麻烦点,因为 wrk 依赖 OpenSSL 和 LuaJIT。不过也别怕,几步搞定。
Ubuntu/Debian 系:
sudo apt-get update
sudo apt-get install build-essential libssl-dev git -y
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/
CentOS/RHEL 系:
sudo yum groupinstall 'Development Tools'
sudo yum install openssl-devel git -y
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin/
装完同样跑一下 wrk --version 验证。
make WITH_OPENSSL=/usr/local/ssl 指定路径。
4.2.3 Windows 安装
Windows 原生不支持 wrk。我建议用 WSL(Windows Subsystem for Linux),在 Ubuntu 子系统里安装。或者直接用 Docker:
docker run --rm williamyeh/wrk
我个人更推荐 WSL 方案,因为后续调试更方便。
4.3 发起第一个 HTTP 压测请求
装好了?来,咱们跑第一个压测。
打开终端,输入:
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html
这条命令什么意思?我拆开讲:
- -t12:启动 12 个线程
- -c400:保持 400 个并发连接
- -d30s:压测持续 30 秒
- http://127.0.0.1:8080/index.html:目标地址
跑完之后,你会看到类似这样的输出:
Running 30s test @ http://127.0.0.1:8080/index.html
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.67ms 12.34ms 198.76ms 75.23%
Req/Sec 723.45 89.12 1.02k 68.90%
259842 requests in 30.00s, 3.47GB read
Socket errors: connect 0, read 0, write 0, timeout 0
Requests/sec: 8661.40
Transfer/sec: 118.47MB
看到 Requests/sec: 8661.40 了吗?这就是你的接口每秒能处理 8661 个请求。说白了,QPS 就是 8661。
- Latency:延迟。Avg 是平均延迟,这里 45.67ms,还行。
- Req/Sec:每个线程每秒处理的请求数。
- Requests/sec:总 QPS,最重要的指标。
- Socket errors:连接错误数。如果这里不为 0,说明服务端扛不住了。
4.4 常见参数详解
wrk 的参数不多,但每个都很实用。我列个表:
| 参数 | 含义 | 示例 |
|---|---|---|
| -t | 线程数 | -t12 |
| -c | 并发连接数 | -c400 |
| -d | 压测时长 | -d30s |
| -s | 指定 Lua 脚本 | -s script.lua |
| -H | 添加请求头 | -H "User-Agent: wrk" |
| --latency | 输出延迟分布 | --latency |
| --timeout | 超时时间 | --timeout 5s |
4.5 实战:压测一个真实接口
假设你有一个登录接口 /api/login,需要 POST 请求。咱们来压一下:
wrk -t4 -c200 -d60s --latency -s post.lua http://192.168.1.100:8080/api/login
这里用到了 -s post.lua,因为 wrk 默认发 GET 请求。我们需要写一个简单的 Lua 脚本来发 POST:
-- post.lua
wrk.method = "POST"
wrk.body = '{"username":"test","password":"123456"}'
wrk.headers["Content-Type"] = "application/json"
保存为 post.lua,然后运行上面的命令。结果会怎样?
嗯,我遇到过一种情况:压测时发现大量 Socket errors: connect 0, read 0, write 0, timeout 123。超时了。这说明服务端处理不过来,或者网络有瓶颈。这时候就要看服务端的 CPU、内存、连接数了。
4.6 核心知识体系
我把这一章的知识点画成一张图,方便你理解:
4.7 避坑指南
最后,分享几个我踩过的坑:
- 并发数不是越大越好。我曾经把 -c 设到 2000,结果 wrk 自己先挂了。因为每个连接都要占用文件描述符,系统默认 ulimit 可能不够。跑之前记得
ulimit -n 65535。 - 压测本地和压测远程不一样。压 127.0.0.1 测的是服务端极限,压远程 IP 测的是网络+服务端。我一般先压本地确认服务端上限,再压远程看网络损耗。
- 注意 -d 时长。太短了数据不稳定,太长了浪费时间。我个人习惯 30-60 秒,足够看出趋势了。
- Lua 脚本路径要写对。如果 -s 指定的脚本找不到,wrk 会报错但不告诉你具体原因。我第一次用的时候卡了十分钟才发现是路径写错了。
好了,wrk 的安装和基础使用就这些。装好它,跑一次压测,你就能感受到这个工具的威力。下一章咱们会深入 Lua 脚本,做更复杂的压测场景。