在進(jìn)行服務(wù)器性能優(yōu)化或排查問題時(shí),壓力測(cè)試是不可或缺的工具之一。Apache Bench(簡(jiǎn)稱ab)作為一款輕量級(jí)的壓測(cè)工具,不僅可以幫助開發(fā)者和運(yùn)維人員快速了解服務(wù)器在高并發(fā)情況下的表現(xiàn),還能夠揭示可能存在的網(wǎng)絡(luò)瓶頸。本篇文章將介紹ab命令的基本功能和使用方法,幫助大家在日常的工作中有效應(yīng)用該工具進(jìn)行簡(jiǎn)單的壓測(cè)。
1 背景
有時(shí)需要在集群內(nèi)簡(jiǎn)單地發(fā)起壓測(cè),以排除網(wǎng)絡(luò)問題,這時(shí)可以使用 ab 命令。
ab 命令全稱為 Apache bench 是Apache自帶的壓力測(cè)試工具。ab 命令非常實(shí)用,它不僅可以對(duì) Apache 服務(wù)器進(jìn)行網(wǎng)站訪問壓力測(cè)試,也可以對(duì)或其它類型的服務(wù)器進(jìn)行壓力測(cè)試,ab 命令會(huì)創(chuàng)建多個(gè)并發(fā)線程,模擬多個(gè)訪問者同時(shí)對(duì)某一個(gè)url地址進(jìn)行訪問,實(shí)現(xiàn)壓力測(cè)試。
ab 命令對(duì)發(fā)出負(fù)載的計(jì)算機(jī)要求很低,它既不會(huì)占用很高 CPU,也不會(huì)占用很多內(nèi)存。但卻會(huì)給目標(biāo)服務(wù)器造成巨大的負(fù)載,其原理類似CC攻擊,可能會(huì)造成目標(biāo)服務(wù)器資源耗盡,嚴(yán)重時(shí)可能會(huì)導(dǎo)致死機(jī),而且它沒有圖形化結(jié)果不能監(jiān)控,所以只能用作臨時(shí)緊急任務(wù)和簡(jiǎn)單的測(cè)試。
2 ab 安裝
yum install -y httpd-tools
命令執(zhí)行完成后,就可以直接運(yùn)行ab。
3 ab 使用方法
常用使用方法:
ab -t 120 -n 1000 -c 20 -i
#-t:測(cè)試所進(jìn)行的最大秒數(shù)。其內(nèi)部隱含值是-n 50000,它可以使對(duì)服務(wù)器的測(cè)試限制在一個(gè)固定的總時(shí)間以內(nèi)。默認(rèn)時(shí),沒有時(shí)間限制。
#-n:在測(cè)試會(huì)話中所執(zhí)行的請(qǐng)求個(gè)數(shù)。默認(rèn)時(shí),僅執(zhí)行一個(gè)請(qǐng)求。
#-c:并發(fā)量,一次產(chǎn)生的請(qǐng)求個(gè)數(shù)。默認(rèn)是一次一個(gè)。
#-i:執(zhí)行HEAD請(qǐng)求,而不是GET。
完整參數(shù)說明:
-n:在測(cè)試會(huì)話中所執(zhí)行的請(qǐng)求個(gè)數(shù)。默認(rèn)時(shí),僅執(zhí)行一個(gè)請(qǐng)求。
-c:一次產(chǎn)生的請(qǐng)求個(gè)數(shù)。默認(rèn)是一次一個(gè)。
-t:測(cè)試所進(jìn)行的最大秒數(shù)。其內(nèi)部隱含值是-n 50000,它可以使對(duì)服務(wù)器的測(cè)試限制在一個(gè)固定的總時(shí)間以內(nèi)。默認(rèn)時(shí),沒有時(shí)間限制。
-p:包含了需要POST的數(shù)據(jù)的文件。
-P:對(duì)一個(gè)中轉(zhuǎn)代理提供BASIC認(rèn)證信任。用戶名和密碼由一個(gè):隔開,并以base64編碼形式發(fā)送。無論服務(wù)器是否需要(即是否發(fā)送了401認(rèn)證需求代碼),此字符串都會(huì)被發(fā)送。
-T:POST數(shù)據(jù)所使用的Content-type頭信息。
-v:設(shè)置顯示信息的詳細(xì)程度-4或更大值會(huì)顯示頭信息,3或更大值可以顯示響應(yīng)代碼(404,200等),2或更大值可以顯示警告和其他信息。
-V:顯示版本號(hào)并退出。
-w:以HTML表的格式輸出結(jié)果。默認(rèn)時(shí),它是白色背景的兩列寬度的一張表。
-i:執(zhí)行HEAD請(qǐng)求,而不是GET。
-x:設(shè)置屬性的字符串(<table>)。
-X:對(duì)請(qǐng)求使用代理服務(wù)器。
-y:設(shè)置屬性的字符串(<tr>)。
-z:設(shè)置屬性的字符串(<td>)。
-C:對(duì)請(qǐng)求附加一個(gè)Cookie:行。其典型形式是name=value的一個(gè)參數(shù)對(duì),此參數(shù)可以重復(fù)。
-H:對(duì)請(qǐng)求附加額外的頭信息。此參數(shù)的典型形式是一個(gè)有效的頭信息行,其中包含了以冒號(hào)分隔的字段和值的對(duì)(如,”Accept-Encoding:zip/zop;8bit”)。
-A:對(duì)服務(wù)器提供BASIC認(rèn)證信任。用戶名和密碼由一個(gè):隔開,并以base64編碼形式發(fā)送。無論服務(wù)器是否需要(即,是否發(fā)送了401認(rèn)證需求代碼),此字符串都會(huì)被發(fā)送。
-h:顯示使用方法。
-d:不顯示”percentage served within XX [ms] table”的消息(為以前的版本提供支持)。
-e:產(chǎn)生一個(gè)以逗號(hào)分隔的(CSV)文件,其中包含了處理每個(gè)相應(yīng)百分比的請(qǐng)求所需要(從1%到100%)的相應(yīng)百分比的(以微妙為單位)時(shí)間。由于這種格式已經(jīng)“二進(jìn)制化”,所以比’gnuplot’格式更有用。
-g:把所有測(cè)試結(jié)果寫入一個(gè)’gnuplot’或者TSV(以Tab分隔的)文件。此文件可以方便地導(dǎo)入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行為標(biāo)題。
-i:執(zhí)行HEAD請(qǐng)求,而不是GET。
-k:?jiǎn)⒂肏TTP KeepAlive功能,即在一個(gè)HTTP會(huì)話中執(zhí)行多個(gè)請(qǐng)求。默認(rèn)時(shí),不啟用KeepAlive功能。
-q:如果處理的請(qǐng)求數(shù)大于150,ab每處理大約10%或者100個(gè)請(qǐng)求時(shí),會(huì)在stderr輸出一個(gè)進(jìn)度計(jì)數(shù)。此-q標(biāo)記可以抑制這些信息。
4 ab 結(jié)果說明
4.1 壓測(cè)指標(biāo)
在進(jìn)行性能測(cè)試過程中有幾個(gè)指標(biāo)比較重要:
吞吐率(Requests per second) 概念:服務(wù)器并發(fā)處理能力的量化描述,單位是reqs/s,指的是某個(gè)并發(fā)用戶數(shù)下單位時(shí)間內(nèi)處理的請(qǐng)求數(shù)。某個(gè)并發(fā)用戶數(shù)下單位時(shí)間內(nèi)能處理的最大請(qǐng)求數(shù),稱之為最大吞吐率。計(jì)算公式:總請(qǐng)求數(shù) / 處理完成這些請(qǐng)求數(shù)所花費(fèi)的時(shí)間,即 Request per second = Complete requests / Time taken for tests
并發(fā)連接數(shù)(The number of concurrent connections) 概念:某個(gè)時(shí)刻服務(wù)器所接受的請(qǐng)求數(shù)目,簡(jiǎn)單的講,就是一個(gè)會(huì)話。
并發(fā)用戶數(shù)(The number of concurrent users,Concurrency Level) 概念:要注意區(qū)分這個(gè)概念和并發(fā)連接數(shù)之間的區(qū)別,一個(gè)用戶可能同時(shí)會(huì)產(chǎn)生多個(gè)會(huì)話,也即連接數(shù)。
用戶平均請(qǐng)求等待時(shí)間(Time per request) 計(jì)算公式:處理完成所有請(qǐng)求數(shù)所花費(fèi)的時(shí)間/總請(qǐng)求數(shù),即 Time per request=Time taken for tests/(Complete requests/Concurrency Level)。
服務(wù)器平均請(qǐng)求等待時(shí)間(Time per request: across all concurrent requests) 計(jì)算公式:處理完成所有請(qǐng)求數(shù)所花費(fèi)的時(shí)間 / 總請(qǐng)求數(shù),即 Time taken for / testsComplete requests 可以看到,它是吞吐率的倒數(shù)。同時(shí),它也=用戶平均請(qǐng)求等待時(shí)間/并發(fā)用戶數(shù),即 Time per request / Concurrency Level。
4.2 網(wǎng)絡(luò)性能指標(biāo)

由以下時(shí)間點(diǎn)來算出時(shí)間指標(biāo):
t1: Start of connection
這是連接開始的時(shí)間點(diǎn),標(biāo)志著嘗試建立連接的過程的開始。
t2: Connected, start writing
這個(gè)時(shí)間點(diǎn)標(biāo)志著連接已經(jīng)建立,并且開始發(fā)送(寫入)請(qǐng)求數(shù)據(jù)。
t3: Request written
這個(gè)時(shí)間點(diǎn)指的是請(qǐng)求數(shù)據(jù)已經(jīng)完全寫入(發(fā)送完畢)的時(shí)間。
t4: First byte of input
這個(gè)時(shí)間點(diǎn)是接收到輸入的第一個(gè)字節(jié)的時(shí)間,即開始接收響應(yīng)數(shù)據(jù)的時(shí)間。
t5: Connection closed
這個(gè)時(shí)間點(diǎn)是連接關(guān)閉的時(shí)間,標(biāo)志著整個(gè)請(qǐng)求-響應(yīng)過程的結(jié)束。
時(shí)間指標(biāo)定義:
Connect:
定義為從開始連接(t1)到連接成功并開始寫入請(qǐng)求(t2)的時(shí)間差。這通常代表了網(wǎng)絡(luò)延遲。
Processing:
定義為從連接成功并開始寫入請(qǐng)求(t2)到連接關(guān)閉(t5)的時(shí)間差。這是接收完整響應(yīng)所需的時(shí)間,即從連接打開后開始計(jì)算直到連接關(guān)閉。
Waiting:
定義為從請(qǐng)求寫入完成(t3)到接收輸入的第一個(gè)字節(jié)(t4)的時(shí)間差。這代表了發(fā)送請(qǐng)求后等待第一個(gè)字節(jié)的時(shí)間(Waiting <= Processing)。
Total:
定義為從開始連接(t1)到連接關(guān)閉(t5)的總時(shí)間。這是整個(gè)請(qǐng)求處理過程的總耗時(shí)(Connect + Processing)。
5 返回結(jié)果說明

7.Benchmarking 192.168.176.30 (be patient) #完成的進(jìn)度
8.Completed 100 requests
9.Completed 200 requests
10.Completed 300 requests
11.Completed 400 requests
12.Completed 500 requests
13.Completed 600 requests
14.Completed 700 requests
15.Completed 800 requests
16.Completed 900 requests
17.Completed 1000 requests
18.Finished 1000 requests
19.
20.Server Software: Apache/2.4.6 #服務(wù)器軟件版本
21.Server Hostname: 192.168.176.30 #服務(wù)器主機(jī)名
22.Server Port: 80 #服務(wù)器端口
23.
24.Document Path: /index.html #測(cè)試的頁面
25.Document Length: 9 bytes #頁面的字節(jié)數(shù)
26.Concurrency Level: 900 #請(qǐng)求的并發(fā)數(shù),代表著訪問的客戶端數(shù)量
27.Time taken for tests: 0.489 seconds #整個(gè)測(cè)試花費(fèi)的時(shí)間
28.Complete requests: 1000 #成功的請(qǐng)求數(shù)量
29.Failed requests: 0 #失敗的請(qǐng)求數(shù)量
30.Write errors: 0
31.Total transferred: 267000 bytes #整個(gè)測(cè)試過程的總數(shù)據(jù)大小(包括header頭信息等)
32.HTML transferred: 9000 bytes #整個(gè)測(cè)試過程HTML頁面實(shí)際的字節(jié)數(shù)
33.Requests per second: 2045.81 [#/sec] (mean) #每秒處理的請(qǐng)求數(shù),這是非常重要的參數(shù),體現(xiàn)了服務(wù)器的吞吐量
34.
35. #后面括號(hào)中的 mean 表示這是一個(gè)平均值
36.Time per request: 439.923 [ms] (mean) #平均請(qǐng)求響應(yīng)時(shí)間,括號(hào)中的 mean 表示這是一個(gè)平均值
37.#每個(gè)請(qǐng)求的時(shí)間 0.489[毫秒],意思為在所有的并發(fā)請(qǐng)求每個(gè)請(qǐng)求實(shí)際運(yùn)行時(shí)間的平均值
38.#由于對(duì)于并發(fā)請(qǐng)求 cpu 實(shí)際上并不是同時(shí)處理的,而是按照每個(gè)請(qǐng)求獲得的時(shí)間片逐個(gè)輪轉(zhuǎn)處理的
39.#所以基本上第一個(gè) Time per request 時(shí)間約等于第二個(gè) Time per request 時(shí)間乘以并發(fā)請(qǐng)求數(shù)
40.Time per request: 0.489 [ms] (mean, across all concurrent requests)
41.
42.Transfer rate: 533.43 [Kbytes/sec] received #傳輸速率,平均每秒的流量
43. #可以幫助排除是否存在網(wǎng)絡(luò)流量過大導(dǎo)致響應(yīng)時(shí)間延長(zhǎng)的問題
44. Connection Times (ms) #連接時(shí)間
45.
46. min mean[+/-sd]#平均時(shí)間和標(biāo)準(zhǔn)差 median#中位數(shù) max
47. Connect: 0 17 11.8 21 34
48. Processing: 1 145 153.9 35 446
49. Waiting: 1 145 153.9 35 446
50. Total: 16 163 161.2 63 474
51.
52. Percentage of the requests served within a certain time (ms) #在一定的時(shí)間內(nèi)提供服務(wù)的請(qǐng)求的百分比
53. 50% 63
54. 66% 244
55. 75% 255
56. 80% 260
57. 90% 468
58. 95% 471
59. 98% 474
60. 99% 474
61. 100% 474 (longest request)
Apache Bench作為一款高效、輕量的壓力測(cè)試工具,雖然在圖形化界面和實(shí)時(shí)監(jiān)控上有所欠缺,但它憑借簡(jiǎn)單易用的特性,仍然是日常工作中快速檢測(cè)服務(wù)器性能的首選工具之一。通過合理配置參數(shù)并分析測(cè)試結(jié)果,用戶能夠?qū)Ψ?wù)器性能有更深入的了解,從而為進(jìn)一步的優(yōu)化和改進(jìn)提供有力依據(jù)。
想了解更多Linux相關(guān)的分享歡迎上藍(lán)隊(duì)云官網(wǎng)查詢,更多免費(fèi)技術(shù)學(xué)習(xí)文檔,藍(lán)隊(duì)云期待與您一起探索。