Apache ab 壓力測試工具完整使用指南
工具簡介
ab (ApacheBench) 是 Apache HTTP Server 附帶的效能測試工具,用於測量 HTTP 伺服器每秒可處理的請求數(QPS/TPS)。
安裝與驗證
# CentOS/RHEL
yum install httpd-tools
# Ubuntu/Debian
apt-get install apache2-utils
# 驗證
ab -V
# This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
核心參數詳解
| 參數 | 說明 | 範例 |
-n | 總請求數 | -n 10000 |
-c | 並發數(同時連線數) | -c 100 |
-t | 最大測試時間(秒),與 -n 二擇一 | -t 60 |
-k | 啟用 HTTP KeepAlive | -k |
-H | 自定義 Header | -H "Authorization: Bearer xxx" |
-p | POST 資料檔案 | -p post.json |
-T | Content-Type | -T "application/json" |
-v | 輸出詳細度(1-4) | -v 2 |
-s | SSL/TLS 連線(需 openssl 支援) | -s |
實戰範例
基礎 GET 請求測試
ab -n 10000 -c 100 https://127.0.0.1:8080/api/health
POST JSON API 測試
# 建立 post.json
cat > post.json <<'EOF'
{"user_id": 123, "action": "login"}
EOF
# 執行測試
ab -n 5000 -c 50 -p post.json -T "application/json" \
-H "X-API-Key: test-key" \
https://127.0.0.1:8080/api/action
KeepAlive 長連線測試
ab -n 10000 -c 100 -k https://127.0.0.1:8080/
輸出結果解讀
Server Software: nginx/1.18.0
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /api/health
Document Length: 25 bytes
Concurrency Level: 100 # 並發數
Time taken for tests: 2.345 seconds # 總耗時
Complete requests: 10000 # 成功請求數
Failed requests: 0 # 失敗請求數
Total transferred: 2,450,000 # 總傳輸位元組(含 Header)
HTML transferred: 250,000 # Body 傳輸位元組
Requests per second: 4264.39 [#/sec] (mean) # ★ QPS 核心指標
Time per request: 23.450 [ms] (mean) # 平均延遲(含並發)
Time per request: 0.235 [ms] (mean, across all concurrent requests) # 單請求處理時間
Transfer rate: 1020.56 [Kbytes/sec] received # 頻寬
關鍵指標深度解析
| 指標 | 公式 | 業務含義 | 關注重點 |
| QPS (RPS) | Complete requests / Time taken | 系統吞吐能力 | 越高越好,對比基準值 |
| 平均延遲 | Time per request (mean) | 用戶感知響應速度 | 通常關注 P99/P999 |
| 錯誤率 | Failed / Complete | 系統穩定性 | 應為 0% |
| 頻寬利用 | Transfer rate | 網路資源消耗 | 對比網卡上限 |
進階分析:取得延遲分佈
ab 原生不支援百分位數,可搭配 gnuplot 輸出:
ab -n 10000 -c 100 -g gnuplot.dat https://target/
# gnuplot.dat 可用 gnuplot 或 Python pandas 繪製延遲分佈圖
常見誤區與最佳實踐
- ❌ 在目標伺服器上跑 ab → 爭搶 CPU/網路,結果失真 → 專用壓測機
- ❌
-c 設過大(如 10000) → 客戶端資源耗盡 → 分階段遞增 (10, 50, 100, 200...)
- ❌ 忽略 預熱 → 首輪請求慢(JIT 編譯、連線池建立) → 先跑 1-2 分鐘暖機
- ❌ 單一 URL 測試 → 無法反映真實業務混合負載 → 混合場景腳本
- ✅ 監控目標機 CPU、記憶體、磁碟 I/O、網路、GC、資料庫連線池
- ✅ 記錄完整參數、環境、版本,便於複現與對比
替代工具推薦
| 工具 | 特點 | 適用場景 |
| wrk | Lua 腳本、高效能、支援百分位 | 現代 HTTP/1.1、HTTP/2 壓測首選 |
| locust | Python 腳本、分散式、Web UI | 複雜業務邏輯、CI/CD 整合 |
| JMeter | GUI、協議豐富、企業級 | 非 HTTP 協議、團隊協作 |
| k6 | Go/JS、雲原生、Grafana 整合 | K8s 環境、持續效能測試 |