wrk压测http服务

wrk 是一个高性能 HTTP 压测工具,特点是:

  • 基于事件驱动(epoll/kqueue)
  • 多线程 + 异步 I/O
  • 支持 Lua 脚本扩展(可自定义请求逻辑)
  • 适合高并发场景压测(10万+ QPS级别)

应用场景:

  • API 服务性能评估
  • 网关(Nginx / Traefik / Envoy)压测
  • 微服务压测(K8s / Service Mesh)
  • 数据库代理 / 缓存层性能验证

1.wrk安装

1.1 Linux / Mac

1
2
3
4
5
6
7
8
9
10
# Ubuntu / Debian
apt install wrk

# Mac
brew install wrk

# 源码安装
git clone https://github.com/wg/wrk.git
cd wrk
make

1.2 验证安装

1
wrk -v

2.核心参数详解

2.1 基础命令结构

1
wrk -t <线程数> -c <连接数> -d <持续时间> http://target-url

2.2 参数说明

参数 含义 建议
-t 线程数 = CPU核数
-c 总连接数 = 线程数 * (100~1000)
-d 压测时间 ≥30s
-H 自定义Header 模拟真实请求
-s Lua脚本 高级压测
--latency 输出延迟分布 必开
-R 固定QPS(wrk2) 稳定压测

3.基础压测示例

3.1 简单压测GET

1
wrk -t4 -c100 -d30s http://127.0.0.1:8080

输出示例:

Requests/sec:  15234.56
Transfer/sec:    12.34MB
Latency:         6.23ms

3.2 启用延迟统计

1
wrk -t4 -c100 -d30s --latency http://127.0.0.1:8080

关键指标:

  • Avg:平均延迟
  • Stdev:抖动
  • Max:最大延迟
  • Percentile:P50 / P90 / P99

4.Lua脚本压测(高级用法)

4.1 自定义请求

1
2
3
wrk.method = "POST"
wrk.body = '{"name":"test"}'
wrk.headers["Content-Type"] = "application/json"

运行:

1
wrk -t4 -c100 -d30s -s post.lua http://127.0.0.1:8080/api

4.2 动态参数(模拟真实流量)

1
2
3
4
request = function()
local id = math.random(1, 1000)
return wrk.format("GET", "/user/" .. id)
end

4.3 Token/Auth模拟

1
wrk.headers["Authorization"] = "Bearer xxx"

5.wrk架构原理

flowchart LR
    A[主线程] --> B[Worker线程]
    B --> C[连接池]
    C --> D[事件循环 epoll/kqueue]
    D --> E[HTTP请求发送]
    E --> F[响应处理]

核心机制

  • 每个线程维护独立连接池
  • 非阻塞 socket
  • 基于事件驱动(类似 Nginx)
  • Lua 在 worker 内执行(无锁)

6.生产压测策略(关键)

6.1 分阶段压测

flowchart TD
    A[预热阶段] --> B[低压]
    B --> C[逐步加压]
    C --> D[极限压测]
    D --> E[稳定性测试]

6.2 推荐压测方法

阶段 配置
预热 10%流量
线性增长 每分钟+20%
峰值 目标QPS
长稳 ≥1小时