wrk性能测试指南

wrk性能测试指南

wrk :开源 HTTP 性能测试工具,专注于高并发场景下的服务端压测。由 C 语言编写,基于 多线程 + 事件驱动模型(如 epoll、kqueue)实现,能够以极低的系统资源消耗生成高负载,精准测量 Web 服务、API 或数据库接口的性能指标(如吞吐量、延迟、错误率)。


核心特性

  1. 高性能
    • 单机可轻松模拟数万级并发连接,适合测试高吞吐服务。
    • 通过多线程绑定 CPU 核心,充分利用多核性能。
  2. 轻量级
    • 无依赖、无复杂配置,仅需一个可执行文件即可运行。
    • 内存占用低,避免压测工具本身成为性能瓶颈。
  3. Lua 脚本扩展
    • 支持通过 Lua 脚本自定义请求逻辑(动态参数、鉴权、POST 数据等)。
    • 可编程处理响应内容,实现复杂场景(如会话保持、数据验证)。
  4. 精准统计
    • 提供详细的延迟分布(P50/P90/P99)、每秒请求数(RPS)、错误率等指标。
    • 输出结果直观,便于快速分析性能瓶颈。

以下是使用 wrk 进行压力测试的详细步骤指南,包含安装、参数说明、基本命令和高级用法:


安装 wrk

1. Linux (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install wrk
2. Linux (CentOS/RHEL)
sudo yum groupinstall 'Development Tools'
sudo yum install openssl-devel git
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin
3. macOS
brew install wrk
4. 源码编译(通用)
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin  # 将可执行文件复制到系统路径

参数说明

wrk <选项> <URL>

常用选项:

  • -c, --connections <N>: 并发连接数(模拟的客户端数量,默认 10)
  • -t, --threads <N>: 使用的线程数(建议与 CPU 核心数一致)
  • -d, --duration <T>: 测试持续时间(例如 10s, 5m
  • --timeout <T>: 请求超时时间(默认 1s)
  • -s, --script <S>: 指定 Lua 脚本(用于自定义请求或逻辑)
  • -H, --header <H>: 添加 HTTP 请求头(如 "User-Agent: wrk"
  • --latency: 显示延迟分布统计

基本命令示例

1. 简单测试
wrk -t4 -c100 -d30s http://example.com
  • 使用 4 个线程
  • 模拟 100 个并发连接
  • 持续 30 秒
2. 带请求头的测试
wrk -t2 -c50 -d10s -H "Authorization: Bearer token123" https://api.example.com

高级用法:使用 Lua 脚本

1. 创建 Lua 脚本(test.lua
-- 初始化
function init(args)
  math.randomseed(os.time())  -- 初始化随机数种子
end

-- 请求生成
request = function()
  local id = math.random(1, 1000)  -- 生成随机参数
  return wrk.format("GET", "/api/user?id=" .. id)
end

-- 响应处理
function response(status, headers, body)
  if status ~= 200 then
    print("Error: " .. status)
  end
end
2. 运行带脚本的测试
wrk -t4 -c200 -d60s -s test.lua http://example.com
3. 其他脚本功能
  • 动态请求体:生成 POST 请求
  • Cookie 处理:在请求间传递会话
  • 流量控制:自定义请求频率

五、结果解读

输出示例:

Running 30s test @ http://example.com
  4 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    45.22ms   12.64ms 200.15ms   85.12%
    Req/Sec    550.75    120.25     1.01k    76.50%
  Latency Distribution
     50%   42.65ms
     75%   50.12ms
     90%   60.01ms
     99%   85.22ms
  65879 requests in 30.10s, 102.33MB read
Requests/sec:   2189.31
Transfer/sec:      3.40MB
  • Latency: 请求延迟统计(平均、标准差、分布)
  • Req/Sec: 每秒请求数(越高代表吞吐量越好)
  • Requests/sec:每秒处理请求数
  • Transfer/sec:网络流量

注意事项

  1. 线程数:建议与 CPU 核心数相同(通过 lscpusysctl hw.ncpu 查看)。
  2. 连接数:不要超过服务器或测试机的最大文件描述符限制(通过 ulimit -n 调整)。
  3. 测试时间:至少持续 30 秒以上,避免冷启动误差。
  4. 目标服务器:避免对生产环境未经授权的服务进行压测。
  5. 网络瓶颈:确保测试机和服务器之间的网络带宽足够。

完整示例

# 测试一个 API 的 QPS(Query Per Second)
wrk -t8 -c500 -d2m \
  -H "Content-Type: application/json" \
  -s post.lua \
  http://api.example.com/v1/data
  • post.lua 内容:
wrk.method = "POST"
wrk.body   = '{"user": "test", "data": "payload"}'
wrk.headers["Content-Type"] = "application/json"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaf_u

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值