简介
Apache Bench (ab) 是 Apache HTTP 服务器自带的一款轻量级压力测试工具,专门用于评估 Web 服务器的性能表现
安装
Linux
# Debian/Ubuntu
sudo apt-get install apache2-utils
# CentOS/RHEL
sudo yum install httpd-tools
MacOS
brew install apache-httpd
Windows
- 下载 Apache HTTP Server
- 解压到
C:\
并重命名为httpd
- 添加到环境变量 Path:
C:\httpd\Apache24\bin
基础服务
app.py
import time
import random
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/hello')
def hello():
"""基础GET测试端点"""
return jsonify({"message": "Hello, AB Tester!"})
@app.route('/api/random_delay')
def random_delay():
"""可变延迟GET测试(模拟IO操作)"""
delay = random.uniform(0.1, 0.5) # 100-500ms随机延迟
time.sleep(delay)
return jsonify({"delay_seconds": delay})
@app.route('/api/compute')
def compute():
"""计算密集型端点"""
start = time.time()
def fib(n):
"""斐波那契数列"""
if n <= 1:
return n
return fib(n - 1) + fib(n - 2)
result = fib(30)
elapsed = time.time() - start
return jsonify({"result": result, "compute_time": elapsed})
@app.route('/api/echo', methods=['POST'])
def echo():
"""带参数的POST测试"""
data = request.json
return jsonify({"received": data})
@app.route('/api/db_query')
def db_query():
"""数据库模拟测试"""
time.sleep(0.2) # 200ms固定延迟
users = [
{"id": i, "name": f"user_{i}"}
for i in range(5)
]
return jsonify({"users": users})
if __name__ == '__main__':
app.run(threaded=True, port=5000)
启动
python app.py
# Linux下运行
pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:5000 app:app
测试
ab -n 1000 -c 100 http://127.0.0.1:5000/api/hello
ab -n 1000 -c 100 -l http://127.0.0.1:5000/api/random_delay
ab -n 1000 -c 100 -l http://127.0.0.1:5000/api/compute
echo '{"test": "data"}' > post_data.json
ab -n 1000 -c 100 -p post_data.json -T 'application/json' -l http://127.0.0.1:5000/api/echo
ab -n 1000 -c 100 -l http://127.0.0.1:5000/api/db_query
核心参数
参数 | 说明 | 示例 |
---|---|---|
-n | 总请求数 | 1000 |
-c | 并发用户数 | 100 |
-t | 测试执行最大秒数 | 60,默认为50000 |
-s | 超时时间 | 默认30秒 |
-p | POST数据文件 | data.json |
-T | Content-Type | application/json |
-H | 添加请求头 | “Authorization: Bearer token” |
-k | 启用HTTP KeepAlive | |
-v | 详细模式 | 4(显示响应头) |
-q | 超过150个请求后不显示进度 | |
-l | 接受可变文档长度(用于动态页面) |
结果解析
$ ab -n 1000 -c 100 http://127.0.0.1:5000/api/hello
Concurrency Level: 100 # 并发用户数
Time taken for tests: 0.538 seconds # 测试用时
Complete requests: 1000 # 成功请求数
Failed requests: 0 # 失败请求数
Total transferred: 197000 bytes # 总数据传输量
HTML transferred: 32000 bytes # 有效内容数据量
Requests per second: 1859.24 [#/sec] (mean) # 每秒请求数(QPS),静态资源(≥3000),动态API(500-2000),计算密集型(50-500)
Time per request: 53.785 [ms] (mean) # 单个请求平均耗时,简单API(<100ms),数据库查询(100-500ms),复杂计算(>500ms)
Time per request: 0.538 [ms] (mean, across all concurrent requests) # 总请求/总请求数,代表服务器真实处理能力
Transfer rate: 357.69 [Kbytes/sec] received # 网络吞吐量
Connection Times (ms) # 连接各阶段耗时分布
min mean[+/-sd] median max
Connect: 0 0 0.3 0 2
Processing: 20 50 8.1 48 64
Waiting: 3 31 6.9 32 46
Total: 20 50 8.1 48 64
Percentage of the requests served within a certain time (ms)
50% 45
66% 45
75% 46
80% 46
90% 47
95% 48
98% 49
99% 56
100% 64 (longest request)
指标表述:在100并发用户的条件下,QPS为1859次/秒,请求成功率为100%,平均响应时间为53.785ms,99%的请求响应时间为56ms
能力表述:在P99延迟<56ms且错误率<0.1%的前提下,系统可支持100并发用户
高频基础接口
接口类型 | 测试重点 | 示例命令 |
---|---|---|
用户认证接口 | 令牌生成/验证性能 | ab -n 5000 -c 100 /api/login |
首页/核心数据接口 | 缓存效率和高并发承载能力 | ab -k -n 10000 -c 500 /api/home |
健康检查接口 | 基础QPS基准 | ab -n 3000 -c 50 /health |
阶梯加压测试
stress_test.sh
#!/bin/bash
api="http://127.0.0.1:5000/api/hello"
concurrencies=(50 100 200 300 500 1000 2000 3000 4000 5000)
for c in "${concurrencies[@]}"; do
result=$(ab -n $((c*100)) -c $c -l "$api" 2>&1)
if [[ $exit_code -ne 0 ]] || ! echo "$result" | grep -q "Requests per second"; then
completed=$(echo "$result" | grep "Completed" | tail -1 | awk '{print $2}')
if [[ -n "$completed" ]]; then
echo "并发数=${c} 失败 已完成 $completed 次请求"
fi
break
fi
qps=$(echo "$result" | grep "Requests per second" | awk '{print $4}')
p99=$(echo "$result" | grep "99%" | awk '{print $2}')
echo "并发数=${c} QPS=${qps} P99=${p99}ms"
done
运行
chmod +x stress_test.sh
./stress_test.sh
效果
并发数=50 QPS=24989.63 P99=3ms
并发数=100 QPS=25797.60 P99=6ms
并发数=200 QPS=24481.90 P99=13ms
并发数=300 QPS=24775.94 P99=15ms
并发数=500 QPS=24940.14 P99=26ms
并发数=1000 QPS=24950.46 P99=45ms
并发数=2000 QPS=24372.25 P99=92ms
并发数=3000 QPS=4070.72 P99=7206ms
并发数=4000 失败 已完成 160000 次请求
一些概念
- ab 检测到响应内容长度不一致会认为失败,可使用
-l
忽略 - 成功率基准:金融电商行业是99.9%,一般互联网是99%
- 并发等级:小型内部系统C100(单机),中型企业应用C1000(基础负载均衡),大型互联网服务C10k(分布式架构+缓存),头部平台或基础设施C100k(微服务+自动扩缩容)
- 验证并发能力:逐步加压
- 专业表述并发能力:在P99延迟<200ms且错误率<0.1%的前提下,系统可支持5000并发用户