三大压测工具对比:Siege/ab/Wrk实战指南
目录
1. siege
下载与安装
核心参数
示例命令
测试结果解读
2. ab
下载与安装
核心参数
示例命令
测试结果解读
3. wrk(推荐)
下载与安装
核心参数说明
基础压测命令
Lua脚本模板
测试结果解读
4. 工具横向对比
1. siege
下载与安装
# Ubuntu/Debian
sudo apt-get install siege# CentOS/RHEL
sudo yum install siege# macOS
brew install siege# 验证安装
siege --version
核心参数
参数 | 说明 | 示例 |
---|---|---|
-c <并发数> | 并发用户数(必须参数) | -c 100 |
-t <时间> | 压测持续时间(s/m/h) | -t 30s |
-r <次数> | 每个用户重复请求次数 | -r 50 |
-f <文件> | 从文件读取多个URL进行压测 | -f urls.txt |
-i | 随机发送文件中的URL请求 | -i -f urls.txt |
-b | 无延迟模式(最大压力测试) | -b |
-v | 显示详细请求日志 | -v |
示例命令
# 100并发用户,持续30秒压测
siege -c 100 -t 30s http://example.com# 从文件加载URL列表,50并发用户,每个用户重复20次
siege -c 50 -r 20 -f urls.txt
测试结果解读
资源消耗最大
测试结果 20w+请求,qps在8612
指标 | 值/状态 | 解读 |
---|---|---|
总请求数 | 256,577 | 压测期间成功处理超25万次请求,吞吐量极高。 |
请求成功率 | 100% | 所有请求均成功,无失败(如HTTP 5xx错误),稳定性优秀。 |
压测时长 | 29.79秒 | 测试窗口合理,结果可信度高。 |
总数据传输量 | 93.96 MB | 平均每个请求传输约0.37KB,内容轻量。 |
平均响应时间 | 0.01秒(10ms) | 处理速度极快,静态资源或缓存结果。 |
QPS | 8,612.86次/秒 | 每秒处理超8.6k请求,吞吐能力极强,适合高并发场景。 |
网络吞吐量 | 3.15 MB/s | 带宽消耗低,未成为性能瓶颈。 |
平均并发连接数 | 97.13 | 接近设置并发用户数(如100),资源充分利用。 |
成功事务数 | 256,578 | 与总请求数基本一致,统计误差可忽略。 |
失败事务数 | 0 | 服务端无超时或异常,稳定性极佳。 |
最长请求耗时 | 0.53秒(530ms) | 存在个别长尾请求,需排查原因(如慢查询、资源竞争)。 |
最短请求耗时 | 0秒(接近0ms) | 部分请求瞬间完成,可能为内存缓存直接响应。 |
2. ab
下载与安装
# Ubuntu/Debian
sudo apt-get install apache2-utils# CentOS/RHEL
sudo yum install httpd-tools# macOS(预装或使用Homebrew)
ab -V# 验证安装
ab -V
核心参数
参数 | 说明 | 示例 |
---|---|---|
-n <总数> | 总请求数(必须参数) | -n 1000 |
-c <并发数> | 并发用户数(必须参数) | -c 100 |
-k | 启用HTTP Keep-Alive长连接 | -k |
-H <头部> | 添加自定义HTTP头部 | -H "Content-Type: application/json" |
-p <文件> | POST请求时发送的数据文件 | -p data.json |
-T <类型> | POST/PUT内容类型 | -T application/json |
示例命令
# 总请求1000次,并发100用户,启用Keep-Alive
ab -n 1000 -c 100 -k http://example.com/# POST请求测试(发送JSON数据)
ab -n 500 -c 50 -T application/json -p data.json http://example.com/api
测试结果解读
资源消耗
测试结果尽量保证请求数量和wrk一致
指标 | 值/状态 | 解读与分析 |
---|---|---|
服务器信息 | ||
Server Software | nginx/1.14.0 | 服务端为 Nginx 1.14.0,需检查是否为最新稳定版本(存在安全或性能优化可能)。 |
Server Hostname | localhost | 压测目标为本地服务器,排除了网络延迟干扰。 |
Server Port | 80 | HTTP 标准端口,未使用 SSL/TLS(无加密开销)。 |
Document Path | / | 测试根路径,可能为静态资源或轻量级接口。 |
Document Length | 612 bytes | 单个响应内容约 0.6KB,数据量极小,适合高吞吐场景。 |
压测参数与结果 | ||
Concurrency Level | 100 | 并发用户数 100,模拟中等并发压力。 |
Time taken for tests | 62.288秒 | 总测试时长约 1 分钟,t同样请求数量wrk在30s |
Complete requests | 1,326,711 | 完成请求数超 132 万,负载能力极强。 |
Failed requests | 1 | 失败请求 1 次(可能为偶发错误,需检查服务端日志)。 |
QPS(Requests/sec) | 21,299.53 | 每秒处理超 2.1 万请求,吞吐量极高。 |
传输数据 | ||
Total transferred | 1,133,011,194 bytes | 总传输数据约 1.06GB,网络带宽压力较大。 |
HTML transferred | 811,947,132 bytes | 实际内容数据约 775MB,平均每个请求 612字节。 |
Transfer rate | 17,763.47 KB/sec | 网络吞吐量约 138.8Mbps(17,763KB/s × 8),需确保千兆网络无瓶颈。 |
延迟分析 | ||
Time per request (mean) | 4.695ms | 单个请求平均耗时 4.7ms(含并发等待时间),处理极快。 |
Time per request (mean, across) | 0.047ms | 单用户视角平均延迟 0.047ms,表明高并发下效率极佳。 |
连接时间分布(ms) | ||
Connect (min/mean/median/max) | 0/2/2/16 | TCP 连接建立时间稳定,网络无拥塞。 |
Processing (min/mean/median/max) | 0/3/3/212 | 服务端处理时间波动较大(标准差 2.1ms),存在长尾请求(212ms)。 |
Waiting (min/mean/median/max) | 0/3/2/211 | 服务端排队等待时间与处理时间一致,表明无队列堆积。 |
Total (min/mean/median/max) | 0/5/4/213 | 总耗时中位数 4ms,但最大延迟 213ms,需排查长尾问题。 |
延迟百分比分布(ms) | ||
50% (P50) | 4 | 半数请求在 4ms 内完成。 |
90% (P90) | 7 | 90% 请求在 7ms 内完成,响应速度极快。 |
95% (P95) | 8 | 95% 请求在 8ms 内完成。 |
99% (P99) | 13 | 99% 请求在 13ms 内完成,长尾控制较好。 |
100% (Max) | 213 | 最慢请求耗时 213ms,需检查原因(如慢查询、资源竞争或 GC 停顿)。 |
3. wrk(推荐)
下载与安装
使用源码编译需要提前安装Git和GCC环境:
git clone https://github.com/wg/wrk.git
cd wrk && make
核心参数说明
参数 | 作用说明 | 使用示例 |
---|---|---|
-t <threads> | 设置工作线程数 | -t 4 |
-c <connections> | 指定并发连接数 | -c 100 |
-d <duration> | 控制测试持续时间 | -d 30s |
-s <script> | 加载自定义Lua脚本 | -s post.lua |
--latency | 显示完整延迟分布 | --latency |
--timeout <time> | 配置请求超时阈值 | --timeout 10s |
基础压测命令
执行GET请求压力测试:
wrk -t4 -c100 -d30s http://example.com
结合Lua脚本实现POST请求测试:
wrk -t4 -c100 -d10s -s post.lua http://example.com/api
Lua脚本模板
创建post.lua
文件实现POST请求:
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"username":"test", "password":"123456"}'
测试结果解读
资源消耗
测试结果
指标 | 值 | 解读与分析 |
---|---|---|
线程与连接 | 2线程,100连接 | 使用2个工作线程模拟100并发连接,线程数合理(通常建议等于CPU核心数)。 |
平均延迟(Latency) | 3.18ms | 请求处理速度极快,用户体验优异。 |
延迟波动(Stdev) | ±3.79ms | 延迟标准差较大,部分请求响应时间波动明显(需关注长尾延迟)。 |
最大延迟(Max) | 68.57ms | 存在个别高延迟请求(可能因网络波动、服务端资源争抢或GC导致)。 |
延迟分布(+/- Stdev) | 87.63% 请求在±3.79ms内 | 多数请求延迟稳定,但约12.37%的请求超出此范围。 |
单线程请求速率(Req/Sec) | 22.19k ±4.57k | 单线程每秒处理约2.2万次请求,性能强劲,但不同线程负载不均(标准差较高)。 |
总请求数 | 1,326,711次 | 30秒内完成超130万次请求,总负载能力极强。 |
总数据读取量 | 1.06GB | 平均每个请求传输约0.82KB(1.06GB/1,326,711),内容轻量。 |
QPS(Requests/sec) | 44,127.78 | 每秒处理超4.4万次请求,吞吐量极高,适合高并发场景。 |
网络吞吐量(Transfer/sec) | 36.15MB/s | 带宽消耗约288Mbps(36.15MB/s × 8),需确保网络无瓶颈。 |
4. 工具横向对比
维度 | siege | ab | wrk |
---|---|---|---|
安装复杂度 | ⭐⭐(包管理器直装) | ⭐⭐⭐(ApacheUtils集成) | ⭐⭐(需编译或Homebrew) |
性能上限 | ⭐⭐(万级QPS) | ⭐⭐⭐(十万级QPS) | ⭐⭐⭐⭐(百万级QPS) |
灵活性 | ⭐⭐(支持URL列表、随机请求) | ⭐(仅支持简单静态请求) | ⭐⭐⭐⭐(Lua脚本扩展动态场景) |
结果可读性 | ⭐⭐⭐(清晰的成功率/响应时间) | ⭐⭐(QPS和延迟分布) | ⭐⭐⭐(线程级统计+延迟分布) |
适用场景 | 页面级压测、成功率监控 | 快速基准测试、简单接口验证 | 高并发测试、复杂业务逻辑模拟 |
资源消耗 | 高(进程模型) | 中(单线程+多进程) | 低(多线程+事件驱动) |