Skip to main content

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-typePOST/PUT 请求的内容类型-T application/json
-p postfilePOST 请求数据文件-p data.json
-A username:passwordHTTP 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: 传输速率

重要指标解释

  1. QPS (Requests per second)

    • 反映服务器的并发承受能力
    • 是系统峰值性能的重要指标
    • 超过此限制需要考虑硬件升级或性能优化
  2. 响应时间

    • 50%用户的响应时间
    • 90%用户的响应时间
    • 99%用户的响应时间
  3. 吞吐量

    • 每秒传输的字节数
    • 反映网络带宽使用情况

最佳实践

1. 测试策略

  • 使用合理的并发数(建议从低开始,逐步增加)
  • 确保足够的请求总数以获得稳定结果
  • 多次测试取平均值

2. 环境准备

  • 确保测试环境与生产环境一致
  • 关闭不必要的服务减少干扰
  • 使用稳定的网络连接

3. 结果解读

  • 关注平均值而非单次结果
  • 监控失败率,确保低于1%
  • 结合业务场景评估性能需求

常见问题与解决方案

Q1: 出现 "socket: Too many open files" 错误

解决方案:

# 增加文件描述符限制
ulimit -n 65535
# 或
sudo sysctl -w fs.file-max=65535

Q2: 测试结果波动大

解决方案:

  • 增加测试请求总数
  • 多次测试取平均值
  • 检查服务器资源使用情况

Q3: 无法测试 HTTPS

解决方案:

# 添加 SSL 协议参数
ab -c 10 -n 100 -f TLS1.2 https://example.com/api

总结

Apache Benchmark 是一个简单而强大的 HTTP 压力测试工具,特别适合:

  • 快速评估 Web 服务器性能
  • 对比不同配置下的性能差异
  • 验证系统在高负载下的表现

通过合理使用 ab 工具,可以帮助我们及时发现性能瓶颈,优化系统架构,确保应用在生产环境中稳定运行。

记住:性能测试是一个持续的过程,建议定期进行压力测试以监控系统的性能变化。