Wrk HTTP 性能基准测试教程
wrk 是一款现代化的 HTTP 基准测试工具,基于多线程和事件驱动模型,能够以极少的系统资源产生大量并发请求。相比 Apache Bench(ab),wrk 的测试结果更加准确可靠。本文将介绍如何在搬瓦工 VPS 上安装和使用 wrk 来测试 Web 应用的性能极限。
一、安装 wrk
1.1 从源码编译安装
# 安装编译依赖
apt update
apt install build-essential libssl-dev git -y
# 克隆源码
git clone https://github.com/wg/wrk.git
cd wrk
# 编译
make -j$(nproc)
# 安装到系统路径
cp wrk /usr/local/bin/
# 验证安装
wrk --version
1.2 包管理器安装
# Ubuntu(可能不是最新版本)
apt install wrk -y
# 使用 snap
snap install wrk
二、基础使用
2.1 命令语法
# 基本格式
wrk -t[线程数] -c[连接数] -d[持续时间] [URL]
# 示例:2 个线程,100 个连接,持续 30 秒
wrk -t2 -c100 -d30s http://localhost/
# 更详细的输出(包含延迟分布)
wrk -t2 -c100 -d30s --latency http://localhost/
2.2 参数说明
-t:线程数,建议设为 CPU 核心数的 1-2 倍。-c:并发连接数,每个线程处理 c/t 个连接。-d:测试持续时间,支持 s(秒)、m(分)、h(小时)。--latency:输出详细的延迟百分位统计。-s:指定 Lua 脚本。-H:添加 HTTP 请求头。
三、测试示例
3.1 测试静态页面
# 测试 Nginx 静态文件性能
wrk -t4 -c200 -d60s --latency http://localhost/index.html
输出结果解读:
- Requests/sec:每秒处理的请求数(QPS),是最核心的性能指标。
- Transfer/sec:每秒传输的数据量。
- Latency Avg:平均延迟。
- Latency 99%:99% 的请求在此时间内完成(P99 延迟)。
- Socket errors:连接、读写、超时错误数量。
3.2 测试 API 接口
# 带自定义请求头测试
wrk -t2 -c50 -d30s -H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
http://localhost:8080/api/users
3.3 递增负载测试
# 使用脚本递增连接数测试
for c in 10 50 100 200 500 1000; do
echo "=== Connections: $c ==="
wrk -t2 -c$c -d15s --latency http://localhost/
sleep 2
done
四、Lua 脚本高级用法
wrk 支持通过 Lua 脚本自定义请求内容,实现 POST 请求、动态参数等功能。
4.1 POST 请求
cat > post.lua <<'EOF'
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"username":"testuser","email":"test@example.com"}'
EOF
wrk -t2 -c100 -d30s -s post.lua http://localhost:8080/api/register
4.2 动态请求参数
cat > dynamic.lua <<'EOF'
counter = 0
request = function()
counter = counter + 1
local path = "/api/users/" .. (counter % 1000)
return wrk.format("GET", path)
end
EOF
wrk -t2 -c100 -d30s -s dynamic.lua http://localhost:8080
4.3 自定义响应统计
cat > report.lua <<'EOF'
done = function(summary, latency, requests)
io.write("--- Custom Report ---\n")
io.write(string.format("Total requests: %d\n", summary.requests))
io.write(string.format("Total errors: %d\n", summary.errors.status))
io.write(string.format("Avg latency: %.2f ms\n", latency.mean / 1000))
io.write(string.format("P50 latency: %.2f ms\n", latency:percentile(50) / 1000))
io.write(string.format("P95 latency: %.2f ms\n", latency:percentile(95) / 1000))
io.write(string.format("P99 latency: %.2f ms\n", latency:percentile(99) / 1000))
end
EOF
wrk -t2 -c100 -d30s -s report.lua http://localhost/
五、测试结果分析与优化
根据 wrk 测试结果,可以针对性地进行优化:
- QPS 低:检查服务端配置(如 Nginx worker 数量、连接限制)和应用代码瓶颈。
- 延迟高:排查数据库查询、外部 API 调用等慢操作。
- Socket 错误多:调整系统文件描述符限制和 TCP 参数,参考 内核调优指南。
- Transfer/sec 低:检查带宽限制和响应压缩配置。
配合系统监控分析
# 在测试期间监控系统资源
# 终端1: 运行 wrk
wrk -t4 -c200 -d60s --latency http://localhost/
# 终端2: 监控 CPU 和内存
vmstat 1
# 终端3: 监控网络
sar -n DEV 1
# 终端4: 监控磁盘 I/O
iostat -x 1
六、与其他测试工具对比
- wrk:轻量高效,适合快速基准测试和压力测试。
- ab(Apache Bench):简单易用但功能有限,单线程性能较差。
- k6:功能强大的现代测试工具,适合复杂场景,参考 K6 教程。
- Locust:Python 编写测试脚本,适合模拟真实用户行为,参考 Locust 教程。
总结
wrk 是评估搬瓦工 VPS 上 Web 应用性能的利器,简洁的命令行界面和 Lua 脚本扩展让它既适合快速测试也能应对复杂场景。测试前建议先完成 内核参数调优,测试后可以使用 Perf 或 火焰图 进行深入的性能分析。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。