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 验证。

⚠️ 注意: 我曾经在 CentOS 7 上编译 wrk 时,因为 OpenSSL 版本太旧导致编译失败。解决方案是升级 OpenSSL 到 1.1 以上版本,或者用静态编译的方式。如果你也遇到类似问题,试试 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
💡 我的经验: 线程数 -t 一般设置为 CPU 核心数的 2-3 倍。并发数 -c 从 100 开始逐步增加,观察 QPS 的拐点。我曾经压一个 Java 服务,-c 从 100 加到 500 时 QPS 一直涨,但到 600 突然掉下来了——这就是服务端的瓶颈点。

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 核心知识体系

我把这一章的知识点画成一张图,方便你理解:

wrk 工具安装与基础使用 · 知识体系 安装 wrk macOS: brew install Linux: 源码编译 Windows: WSL / Docker 基础使用 -t 线程数 -c 并发连接数 -d 压测时长 -s Lua 脚本 结果解读 Latency 延迟 Req/Sec 线程吞吐 Requests/sec QPS Socket errors 错误 核心目标:快速验证接口吞吐能力

4.7 避坑指南

最后,分享几个我踩过的坑:

  • 并发数不是越大越好。我曾经把 -c 设到 2000,结果 wrk 自己先挂了。因为每个连接都要占用文件描述符,系统默认 ulimit 可能不够。跑之前记得 ulimit -n 65535。
  • 压测本地和压测远程不一样。压 127.0.0.1 测的是服务端极限,压远程 IP 测的是网络+服务端。我一般先压本地确认服务端上限,再压远程看网络损耗。
  • 注意 -d 时长。太短了数据不稳定,太长了浪费时间。我个人习惯 30-60 秒,足够看出趋势了。
  • Lua 脚本路径要写对。如果 -s 指定的脚本找不到,wrk 会报错但不告诉你具体原因。我第一次用的时候卡了十分钟才发现是路径写错了。

好了,wrk 的安装和基础使用就这些。装好它,跑一次压测,你就能感受到这个工具的威力。下一章咱们会深入 Lua 脚本,做更复杂的压测场景。


可可精品资料库