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