Apache Benchmark (ab) 压力测试完全指南
Apache Benchmark(简称 ab)是一个简单而强大的 HTTP 压力测试工具,由 Apache HTTP Server 提供。它可以帮助开发者评估 Web 服务器的性能和负载能力。
安装 AB 工具
Ubuntu/Debian 系统
sudo apt-get install apache2-utils
CentOS/RHEL 系统
sudo yum install httpd-tools
macOS 系统
brew install httpd
AB 工具参数详解
基础参数
# 显示帮助信息
ab -h
# 显示版本信息
ab -V
常用参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
-n requests | 执行的总请求数 | -n 1000 |
-c concurrency | 并发请求数 | -c 10 |
-t timelimit | 测试时间限制(秒) | -t 60 |
-s timeout | 每个请求的超时时间(秒) | -s 30 |
-v verbosity | 详细级别(1-4) | -v 2 |
-T content-type | POST/PUT 请求的内容类型 | -T application/json |
-p postfile | POST 请求数据文件 | -p data.json |
-A username:password | HTTP Basic 认证 | -A admin:password |
-k | 启用 HTTP KeepAlive | -k |
-r | 忽略套接字接收错误 | -r |
完整参数列表
# 认证相关
-A auth-username:password
为服务器提供BASIC身份验证凭据。用户名和密码由冒号(:)分隔,通过base64编码发送。
# 网络相关
-b windowsize
TCP发送/接收缓冲区大小(字节)
-B local-address
进行传出连接时绑定的地址
-c concurrency
一次执行的并发请求数。默认值是1
-C cookie-name=value
在请求中添加Cookie
# 输出格式
-d
不显示百分比表格
-e csv-file
将结果写入CSV文件,包含每个百分比的响应时间
-g gnuplot-file
将结果写入gnuplot或TSV文件
-w
在HTML表格中打印结果
# SSL/TLS
-f protocol
指定SSL/TLS协议(SSL2, SSL3, TLS1, TLS1.1, TLS1.2, ALL)
-Z ciphersuite
指定SSL/TLS密码套件
# HTTP方法
-i
使用HEAD请求而非GET请求
-m HTTP-method
自定义HTTP方法
-k
启用HTTP KeepAlive功能
# POST/PUT数据
-p POST-file
包含POST数据的文件
-u PUT-file
包含PUT数据的文件
-T content-type
用于POST/PUT数据的内容类型标头
# 其他
-l
响应的长度不恒定时不报告错误
-q
安静模式,不显示进度信息
-r
忽略套接字接收错误
-s timeout
套接字超时时间(默认30秒)
-S
不显示中位数和标准差的警告信息
-t timelimit
基准测试的最大秒数
-X proxy[:port]
使用代理服务器处理请求
# 详细输出
-v verbosity
设置详细级别:
-v 4: 打印头部信息
-v 3: 打印响应代码
-v 2: 打印警告和信息
-x <table>-attributes
HTML表格属性
-y <tr>-attributes
HTML行属性
-z <td>-attributes
HTML单元格属性
实际使用案例
1. 基础 GET 请求测试
# 简单性能测试
# -c 10: 10个并发请求
# -n 100: 总共100个请求
# -r: 忽略错误继续测试
# -s 200: 每个请求超时200秒
ab -c 10 -n 100 -r -s 200 http://127.0.0.1:8080/
2. 测试带参数 URL
# 测试带有查询参数的接口
ab -c 50 -n 1000 http://example.com/api/users?page=1&limit=20
3. 测试 POST 请求
方式一:x-www-form-urlencoded 格式
# 1. 创建 POST 数据 文件
cat > post.txt << EOF
name=hello,world
email=test@example.com
EOF
# 2. 执行测试
ab -n 1000 -c 100 -p post.txt -T 'application/x-www-form-urlencoded' http://www.example.com/api/users
方式二:JSON 格式
# 1. 创建 JSON 数据文件
cat > user.json << EOF
{
"name": "hello,world",
"email": "test@example.com",
"age": 25
}
EOF
# 2. 执行测试
ab -n 1000 -c 100 -p user.json -T 'application/json' http://www.example.com/api/users
方式三:multipart/form-data 格式
# 1. 创建表单数据文件
cat > form.txt << EOF
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="name"
hello,world
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="email"
test@example.com
----WebKitFormBoundaryE19zNvXGzXaLvS5C--
EOF
# 2. 执行测试
ab -n 1000 -c 100 -p form.txt -T 'multipart/form-data; boundary=----WebKitFormBoundaryE19zNvXGzXaLvS5C' http://www.example.com/api/form
4. 带认证的请求测试
# HTTP Basic 认证
ab -c 10 -n 100 -A admin:secret123 http://example.com/api/protected
5. 启用 KeepAlive 的测试
# 使用 HTTP KeepAlive 连接
ab -c 10 -n 100 -k http://example.com/api/endpoint
6. 长时间压力测试
# 连续测试60秒
ab -t 60 -c 100 http://example.com/api/load-test
7. 输出详细日志
# 查看详细请求/响应信息
ab -c 10 -n 100 -v 4 http://example.com/api/debug
结果分析
关键性能指标
执行 ab 测试后,会得到以下关键指标:
- Requests per second: 每秒处理的请求数(QPS)
- Time per request: 每个请求的平均响应时间
- Failed requests: 失败的请求数
- Transfer rate: 传输速率
重要指标解释
-
QPS (Requests per second)
- 反映服务器的并发承受能力
- 是系统峰值性能的重要指标
- 超过此限制需要考虑硬件升级或性能优化
-
响应时间
- 50%用户的响应时间
- 90%用户的响应时间
- 99%用户的响应时间
-
吞吐量
- 每秒传输的字节数
- 反映网络带宽使用情况
最佳实践
1. 测试策略
- 使用合理的并发数(建议从低开始,逐步增加)
- 确保足够的请求总数以获得稳定结果
- 多次测试取平均值
2. 环境准备
- 确保测试环境与生产环境一致
- 关闭不必要的服务减少干扰
- 使用稳定的网络连接