ab 命令詳解:Apache Bench 壓力測試工具使用指南(含安裝與實戰)
在Web服務器性能調優和系統壓力測試中,ab 命令是一個非常實用且高效的工具。它不僅可以對 Apache 服務器進行壓測,還支持 Nginx、Tomcat、IIS 等主流 Web 服務器。本文將詳細介紹 ab 命令的功能、安裝方法、使用技巧以及結果分析。
ab的簡介
ab 是 Apache Bench 的縮寫,是 Apache 提供的一個開源壓力測試工具。其核心功能是模擬多用戶并發訪問目標 URL,從而測試 Web 服務器的負載能力和響應性能。
ab工作原理
ab命令會創建多個并發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基于URL的,因此,它既可以用來測試Apache的負載壓力,也可以測試Nginx、Lighthttp、Tomcat、IIS等其它Web服務器的壓力。
注意:ab命令對發出負載的計算機要求很低,它既不會占用很高CPU,也不會占用很多內存。但卻會給目標服務器造成巨大的負載,其原理類似CC攻擊。自己測試使用也需要注意,否則一次上太多的負載??赡茉斐赡繕朔掌髻Y源耗完,嚴重時甚至導致死機。
安裝ab
如果你已經安裝apache服務器,則不需要安裝。這個是apache自帶的工具。如果沒有可以使用yum或者apt命令安裝,具體安裝命令如下:
# CentOS / RHEL 安裝方式
sudo yum -y install httpd-tools
#Ubuntu / Debian 安裝方式
sudo apt update
sudo apt install apache2-utils
注意:這種安裝方式最大只能并發 20000 個。如果想突破限制必須是源碼安裝,下面我們以centos為例給大家介紹一下源碼裝全過程:
yum -y install gcc gcc-c++ automake apr apr-util pcre apr-devel apr-util-devel pcre-devel #安裝httpd依賴
wget https://mirror.bit.edu.cn/apache//httpd/httpd-2.4.43.tar.gz #下載httpd包
tar -zxvf httpd-2.4.43.tar.gz -C /usr/src #解壓httpd包
cd /usr/src/httpd-2.4.43 #切換目錄到httpd包所在
vim support/ab.c #修改ab的源代碼,修改第282行:#define MAX_CONCURRENCY 100000
./configure --prefix=/usr/local/httpd #編譯
make && make install #安裝
ln -s /usr/local/httpd/bin/* /usr/bin #做軟鏈接
雖然同修改源碼的方式,使ab并發數可以超過 20000 ,但是系統會阻止打開文件的數量,因此我們還需要修改最大打開的文件數:
ulimit -n 65535 #修改同時最大打開的文件數,此為臨時性的
如果不修改的話你的并發測試不能大于系統默認的1024
ab的使用
ab壓測基本語法如下:
ab -n <總請求數> -c <并發數> <目標URL>
ab命令選項詳解:
選項 | 作用 |
-n | 在測試會話中所執行的請求個數。默認時,僅執行一個請求 |
-c | 一次產生的請求個數。默認是一次一個 |
-t | 測試所進行的最大秒數。其內部隱含值是-n 50000,它可以使對服務器的測試限制在一個固定的總時間以內。默認時,沒有時間限制。 |
-p | 包含了需要POST的數據的文件 |
-P | 對一個中轉代理提供BASIC認證信任。用戶名和密碼由一個:隔開,并以base64編碼形式發送。無論服務器是否需要(即, 是否發送了401認證需求代碼),此字符串都會被發送 |
-T | POST數據所使用的Content-type頭信息 |
-v | 設置顯示信息的詳細程度-4或更大值會顯示頭信息,3或更大值可以顯示響應代碼(404,200等),2或更大值可以顯示警告和其他信息 |
-V | 顯示版本號并退出 |
-w | 以HTML表的格式輸出結果。默認時,它是白色背景的兩列寬度的一張表 |
-i | 執行HEAD請求,而不是GET |
-x | 設置<table>屬性的字符串 |
-X | 對請求使用代理服務器 |
-y | 設置<tr>屬性的字符串 |
-z | 設置<td>屬性的字符串 |
-C | 對請求附加一個Cookie:行。其典型形式是name=value的一個參數對,此參數可以重復 |
-H | 對請求附加額外的頭信息。此參數的典型形式是一個有效的頭信息行,其中包含了以冒號分隔的字段和值的對(“Accept-Encoding:zip/zop;8bit”) |
-A | 對服務器提供BASIC認證信任。用戶名和密碼由一個:隔開,并以base64編碼形式發送。無論服務器是否需要(即,是否發送了401認證需求代碼),此字符串都會被發送 |
-h | 顯示使用方法 |
-d | 不顯示"percentage served within XX [ms] table"的消息(為以前的版本提供支持) |
-e | 產生一個以逗號分隔的(CSV)文件,其中包含了處理每個相應百分比的請求所需要(從1%到100%)的相應百分比的(以微妙為單位)時間。由于這種格式已經“二進制化”,所以比’gnuplot’格式更有用 |
-g | 把所有測試結果寫入一個’gnuplot’或者TSV(以Tab分隔的)文件。此文件可以方便地導入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行為標題 |
-k | 啟用HTTP KeepAlive功能,即在一個HTTP會話中執行多個請求。默認時,不啟用KeepAlive功能 |
-q | 如果處理的請求數大于150,ab每處理大約10%或者100個請求時,會在stderr輸出一個進度計數。此-q標記可以抑制這些信息 |
-r | 在遇到socket接收錯誤后,不退出測試 |
示例:
假設要對本地Apache服務器的根路徑(http://localhost/)進行壓力測試:
ab -n 1000 -c 10 http://localhost/
- -n 1000:總共發送1000個請求
- -c 10 : 并發用戶數為10(即同時發送10個請求)
ab測試結果說明:
Server Software: nginx/1.6.2#測試目標服務器使用的WEB服務和版本
Server Hostname: 192.168.1.108#測試目標服務器的地址
Server Port: 80#測試目標服務器的端口
Document Path: / #測試目標服務器的路徑
Document Length: 41005 bytes #請求的頁面大小
Concurrency Level: 20 #并發量
Time taken for tests: 1180.733 seconds #測試總共耗時
Complete requests: 50000 #完成的請求
Failed requests: 0 #失敗的請求
Write errors: 0 #錯誤
Total transferred: 2067550000 bytes #總共傳輸數據量
HTML transferred: 2050250000 bytes#所有請求的響應數據中正文數據的總和,也就是減去了Total transferred中HTTP響應數據中的頭信息的長度
Requests per second: 42.35 [#/sec] (mean) #每秒鐘的請求量。(僅僅是測試頁面的響應速度)
Time per request: 472.293 [ms] (mean) #等于 Time taken for tests/(complete requests/concurrency level) 即平均請求等待時間(用戶等待的時間)
Time per request: 23.615 [ms] (mean, across all concurrent requests) #等于 Time taken for tests/Complete requests 即服務器平均請求響應時間 在并發量為1時 用戶等待時間相同
Transfer rate: 1710.03 [Kbytes/sec] received #平均每秒多少K,即帶寬速率
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 18.5 0 1001
Processing: 38 471 534.1 155 9269
Waiting: 37 456 524.6 147 9259
Total: 40 472 534.5 155 9269
Percentage of the requests served within a certain time (ms)
50% 155
66% 571
75% 783
80% 871
90% 1211
95% 1603
98% 1839
99% 2003
100% 9269 (longest request)
服務器資源監控
在測試過程中,可以通過以下命令監控服務器資源:
top# 查看CPU和內存使用情況
htop# 更友好的資源監控工具(需安裝:`sudo apt install htop`)
iftop # 查看網絡帶寬使用情況(需安裝:`sudo apt install iftop`)
ab的局限性
ab是單線程工具,適合簡單的HTTP請求測試。對于復雜的測試場景(如HTTPS、POST請求、Cookie等),可以考慮使用更專業的工具,如:
- wrk:高性能的HTTP基準測試工具
- JMeter:支持多種協議和復雜測試場景
- Locust:分布式壓力測試工具