wrk:高性能HTTP基准测试工具完全指南

wrk:高性能HTTP基准测试工具完全指南

wrk工具使用指南

1. 工具简介

1.1 特性概述

wrk是一个现代HTTP基准测试工具,具有以下特点:

  • 多线程设计,充分利用多核CPU
  • 使用事件通知系统(epoll/kqueue)
  • 支持HTTP/HTTPS协议
  • 可扩展的Lua脚本支持
  • 低内存占用,高并发性能

1.2 安装方法

# Ubuntu/Debian
apt-get install build-essential libssl-dev git
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin

# MacOS
brew install wrk

# CentOS/RHEL
yum groupinstall 'Development Tools'
yum install openssl-devel git
git clone https://github.com/wg/wrk.git
cd wrk
make
sudo cp wrk /usr/local/bin

2. 基本用法

2.1 命令行选项

wrk [选项]... URL

选项说明:
-c, --connections  # 保持的HTTP连接总数
-d, --duration     # 测试持续时间
-t, --threads      # 使用的线程总数
-s, --script       # LuaJIT脚本路径
-H, --header       # 添加请求头
    --latency      # 显示详细的延迟统计
    --timeout      # 请求超时时间

2.2 基本示例

# 运行30秒测试,12线程,400并发连接
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

# 添加自定义请求头
wrk -t8 -c100 -d15s -H "Authorization: Bearer token" http://api.example.com/v1/users

# 显示详细延迟统计
wrk -t4 -c200 -d1m --latency http://example.com

2.3 输出解释

Running 30s test @ http://127.0.0.1:8080/index.html
  12 threads and 400 connections

Thread Stats   Avg      Stdev     Max   +/- Stdev
  Latency     635.91us  0.89ms   12.92ms   93.69%
  Req/Sec     56.20k    8.07k    62.00k    86.54%
  
22464657 requests in 30.00s, 17.76GB read
Requests/sec: 748868.53
Transfer/sec: 606.33MB

指标说明:
- Latency: 请求延迟统计
- Req/Sec: 每秒完成的请求数
- Stdev: 标准差,表示数据的离散程度
- +/- Stdev: 落在标准差范围内的数据百分比

3. 高级特性

3.1 Lua脚本支持

-- post.lua
wrk.method = "POST"
wrk.body   = '{"key": "value"}'
wrk.headers["Content-Type"] = "application/json"

-- 请求发送前的处理
function request()
    return wrk.format()
end

-- 响应处理
function response(status, headers, body)
    if status ~= 200 then
        wrk.counter["error"] = wrk.counter["error"] + 1
    end
end

使用脚本:

wrk -t8 -c100 -d30s -s post.lua http://api.example.com/data

3.2 自定义请求

-- random.lua
math.randomseed(os.time())
request = function()
    id = math.random(1, 100)
    path = "/api/users/" .. id
    return wrk.format("GET", path)
end

4. 性能测试最佳实践

4.1 系统配置

# 增加文件描述符限制
ulimit -n 65535

# 调整内核参数
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_timestamps=1

4.2 测试建议

  1. 并发连接数选择

    • 从小规模开始,逐步增加
    • 考虑服务器硬件配置
    • 监控系统资源使用情况
  2. 测试持续时间

    • 短期测试(30s)用于快速验证
    • 长期测试(5-10分钟)用于稳定性验证
    • 压力测试(1小时以上)用于发现内存泄漏
  3. 线程数配置

    • 通常设置为CPU核心数的2-4倍
    • 避免线程数过多导致上下文切换开销

4.3 注意事项

  • 确保测试机器有足够的临时端口可用
  • 服务器的listen(2)队列大小应大于并发连接数
  • 考虑网络延迟对测试结果的影响
  • 监控测试机器的资源使用情况

5. 结果分析

5.1 关键指标

  1. 吞吐量(Throughput)

    • Requests/sec:每秒处理的请求数
    • Transfer/sec:每秒传输的数据量
  2. 延迟(Latency)

    • 平均值(Avg):请求的平均响应时间
    • 标准差(Stdev):响应时间的波动程度
    • 最大值(Max):最慢请求的响应时间
  3. 错误率

    • 非200响应的比例
    • 连接错误数
    • 超时请求数

5.2 性能瓶颈分析

# CPU使用率监控
top -H -p <pid>

# 网络连接状态
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

# IO等待
iostat -x 1

# 系统负载
uptime

6. 故障排查

6.1 常见问题

  1. 连接错误

    # 检查端口范围
    cat /proc/sys/net/ipv4/ip_local_port_range
    
    # 查看TIME_WAIT连接数
    netstat -n | grep TIME_WAIT | wc -l
    
  2. 内存不足

    # 检查可用内存
    free -m
    
    # 查看进程内存使用
    ps aux | grep wrk
    

6.2 调试技巧

# 使用-v参数查看详细信息
wrk -v -t2 -c100 -d10s http://example.com

# 保存测试结果
wrk -t4 -c200 -d1m http://example.com 2>&1 | tee test_result.txt