压力测试Apache Bench(ab)

发布于:2025-07-17 ⋅ 阅读:(15) ⋅ 点赞:(0)

简介

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

  1. 下载 Apache HTTP Server
  2. 解压到 C:\ 并重命名为 httpd
  3. 添加到环境变量 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并发用户​​




参考文献

  1. Apache HTTP server benchmarking tool
  2. Apache HTTP 服务器 2.4 文档
  3. Web性能测试工具之ab入门篇

网站公告

今日签到

点亮在社区的每一天
去签到