在做Web項(xiàng)目或者一個(gè)服務(wù)器程序的時(shí)候,往往會(huì)遇到以下的場景,想要確定自己服務(wù)器吞吐量有多大、在服務(wù)器中需要應(yīng)用線程池但不知道線程池的數(shù)量應(yīng)該設(shè)置多少、對(duì)JVM相關(guān)參數(shù)進(jìn)行調(diào)優(yōu)驗(yàn)證時(shí)需要大量的請(qǐng)求來觸發(fā)GC等等??傊诤芏鄨鼍跋?,為了保證我們服務(wù)更加可靠和高可用,我們需要對(duì)系統(tǒng)進(jìn)行壓力測(cè)試。而下來要介紹的就是一款在Mac及Linux平臺(tái)下優(yōu)秀的壓力測(cè)試神器 Siege ,僅僅通過在命令行簡單的輸入命令便可以完成壓力測(cè)試的模擬和統(tǒng)計(jì)工作:
安裝Siege
在Mac上安裝siege
brew install siege
在Linux下安裝siege
wget http://download.joedog.org/siege/siege-latest.tar.gz tar -xvf siege-latest.tar.gz cd siege-version/ ./configure make make install默認(rèn)安裝在/usr/local/bin/,并自動(dòng)添加到系統(tǒng)環(huán)境變量中,在終端輸入siege 如果可以顯示出相應(yīng)的命令介紹,如下圖所示,則表示我們已經(jīng)安裝成功。
壓測(cè)前的準(zhǔn)備工作
一、修改系統(tǒng)的文件描述符限制
當(dāng)我們需要模擬大并發(fā)情況下的壓測(cè),則需要開啟數(shù)量可觀的線程,以及要占用大量的文件描述符,而系統(tǒng)默認(rèn)對(duì)能夠使用的文件描述符數(shù)量做了限制。首先使用 ulimit -a 命令查看目前系統(tǒng)開啟的文件描述符數(shù)量
可以看到目前系統(tǒng)允許使用的文件描述符的數(shù)量為 256,這是遠(yuǎn)遠(yuǎn)不夠的。如果不修改該參數(shù),要是進(jìn)行大量并發(fā)的模擬場景時(shí)則會(huì)報(bào)TOO MANY FILES OPEN 錯(cuò)誤。為此我們可以先使用 ulimit -n 10000命令來調(diào)大系統(tǒng)可打開的文件描述符數(shù)量。
二、常用壓測(cè)命令介紹
下面列舉出了一些siege的常用命令:
-C, --config 在屏幕上打印顯示出當(dāng)前的配置,配置是包括在他的配置文件$HOME/.siegerc中,可以編輯里面的參數(shù),這樣每次siege 都會(huì)按照它運(yùn)行. -v, --verbose 運(yùn)行時(shí)能看到詳細(xì)的運(yùn)行信息. -c, --concurrent=NUM 模擬有n個(gè)用戶在同時(shí)訪問,n不要設(shè)得太大,因?yàn)樵酱?siege消耗本地機(jī)器的資源越多. -r, --reps=NUM 重復(fù)運(yùn)行測(cè)試n次,不能與-t同時(shí)存在 -t, --time=NUMm 持續(xù)運(yùn)行siege ‘n’秒(如10S),分鐘(10M),小時(shí)(10H) -d, --delay=NUM 每個(gè)url之間的延遲,在0-n之間. -b, --benchmark 請(qǐng)求無需等待 delay=0. -i, --internet 隨機(jī)訪問urls.txt中的url列表項(xiàng). -f, --file=FILE 指定用特定的urls文件運(yùn)行 ,默認(rèn)為urls.txt,位于siege安裝目錄下的etc/urls.txt -R, --rc=FILE 指定用特定的siege 配置文件來運(yùn)行,默認(rèn)的為$HOME/.siegerc -l, --log[=FILE] 運(yùn)行結(jié)束,將統(tǒng)計(jì)數(shù)據(jù)保存到日志文件中siege .log,一般位于/usr/local/var/siege .log中,也可在.siegerc中自定義
小試牛刀
做好了前面的準(zhǔn)備工作,我們便可以使用siege進(jìn)行壓測(cè)的實(shí)踐,就拿我們經(jīng)常訪問的百度來做一個(gè)測(cè)試,在命令行中執(zhí)行下面的命令
siege -c 5 -r 5 http://www.baidu.com
測(cè)試的結(jié)果如下:
這些測(cè)試結(jié)果中的項(xiàng)目含義分別為:
Transactions <———> 總共測(cè)試次數(shù) Availability <———> 成功次數(shù)百分比 Elapsed time <———> 總共耗時(shí)多少秒 Data transferred <———> 總共數(shù)據(jù)傳輸 Response time <———> 等到響應(yīng)耗時(shí) Transaction rate <———> 平均每秒處理請(qǐng)求數(shù) Throughput <———> 吞吐率 Concurrency <———> 最高并發(fā) Successful transactions <———> 成功的請(qǐng)求數(shù) Failed transactions <———> 失敗的請(qǐng)求數(shù) Longest transaction <———> 每次傳輸所花最長時(shí)間 Shortest transaction <———> 每次傳輸所花最短時(shí)間
常用測(cè)試命令的總結(jié)
# 200個(gè)并發(fā)對(duì)百度發(fā)送請(qǐng)求100次 siege -c 200 -r 100 http://www.baidu.com # 對(duì)urls.txt中列出所有的網(wǎng)址進(jìn)行壓測(cè) siege -c 200 -r 100 -f urls.txt # 隨機(jī)選取urls.txt中列出的網(wǎng)址,按照100*100的并發(fā)度進(jìn)行測(cè)試 siege -c 100 -r 100 -f urls.txt -i # 指定http請(qǐng)求頭 文檔類型 siege -H "Content-Type:application/json" -c 200 -r 100 -f urls.txt -i -b # 發(fā)送post請(qǐng)求,在網(wǎng)址后添加POST說明,并且緊跟參數(shù)在其后 siege -c 100 -r 100 http://www.baidu.com/ POST k1=v1&k2=v2
需要注意的是,如果地址和參數(shù)中含有中文或非ASCII字符時(shí),首先需要對(duì)這些字符進(jìn)行url編碼,這樣才可正確的進(jìn)行測(cè)試。