在運(yùn)維工作中,壓力測(cè)試是一項(xiàng)非常重要的工作。比如在一個(gè)網(wǎng)站上線之前,能承受多大訪問(wèn)量、在大訪問(wèn)量情況下性能怎樣,這些數(shù)據(jù)指標(biāo)好壞將會(huì)直接影響用戶體驗(yàn)。
但是,在壓力測(cè)試中存在一個(gè)共性,那就是壓力測(cè)試的結(jié)果與實(shí)際負(fù)載結(jié)果不會(huì)完全相同,就算壓力測(cè)試工作做的再好,也不能保證100%和線上性能指標(biāo)相同。面對(duì)這些問(wèn)題,我們只能盡量去想方設(shè)法去模擬。所以,壓力測(cè)試非常有必要,有了這些數(shù)據(jù),我們就能對(duì)自己做維護(hù)的平臺(tái)做到心中有數(shù)。
目前較為常見(jiàn)的網(wǎng)站壓力測(cè)試工具有webbench、ab(apache bench)、tcpcopy、loadrunner。
webbench由Lionbridge公司開(kāi)發(fā),主要測(cè)試每秒鐘請(qǐng)求數(shù)和每秒鐘數(shù)據(jù)傳輸量,同時(shí)支持靜態(tài)、動(dòng)態(tài)、SSL,部署簡(jiǎn)單,靜動(dòng)態(tài)均可測(cè)試。適用于小型網(wǎng)站壓力測(cè)試(單例最多可模擬3萬(wàn)并發(fā)) 。
ab(apache bench)Apache自帶的壓力測(cè)試工具,主要功能用于測(cè)試網(wǎng)站每秒鐘處理請(qǐng)求個(gè)數(shù),多見(jiàn)用于靜態(tài)壓力測(cè)試,功能較弱,非專業(yè)壓力測(cè)試工具。
tcpcopy基于底層應(yīng)用請(qǐng)求復(fù)制,可轉(zhuǎn)發(fā)各種在線請(qǐng)求到測(cè)試服務(wù)器,具有分布式壓力測(cè)試功能,所測(cè)試數(shù)據(jù)與實(shí)際生產(chǎn)數(shù)據(jù)較為接近后起之秀,主要用于中大型壓力測(cè)試,所有基于tcp的packets均可測(cè)試。
loadrunner壓力測(cè)試界的泰斗,可以創(chuàng)建虛擬用戶,可以模擬用戶真實(shí)訪問(wèn)流程從而錄制成腳本,其測(cè)試結(jié)果也最為逼真模擬最為逼真,并可進(jìn)行獨(dú)立的單元測(cè)試,但是部署配置較為復(fù)雜,需要專業(yè)人員才可以。
下面,筆者就以ab為例,來(lái)講解一下網(wǎng)站在上線之前壓力測(cè)試是如何做的。
ab是針對(duì)apache的性能測(cè)試工具,可以只安裝ab工具。
ubuntu安裝ab
apt-get install apache2-utils
centos安裝ab
yum install httpd-tools
測(cè)試之前需要準(zhǔn)備一個(gè)簡(jiǎn)單的html、一個(gè)php、一個(gè)圖片文件。
分別對(duì)他們進(jìn)行測(cè)試。
我們把這個(gè)三個(gè)文件放到nginx安裝目錄默認(rèn)的html目錄下,
準(zhǔn)備之后我們就可以測(cè)試了
ab -kc 1000 -n 1000 http://localhost/ab.html
這個(gè)指令會(huì)使用1000個(gè)并發(fā),進(jìn)行連接1000次。結(jié)果如下
root@~# ab -kc 1000 -n 1000 http://www.nginx.cn/ab.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking www.nginx.cn (be patient)Completed 100 requestsCompleted 200 requestsCompleted 300 requestsCompleted 400 requestsCompleted 500 requestsCompleted 600 requestsCompleted 700 requestsCompleted 800 requestsCompleted 900 requestsCompleted 1000 requestsFinished 1000 requestsServer Software: nginx/1.2.3Server Hostname: www.nginx.cnServer Port: 80Document Path: /ab.htmlDocument Length: 192 bytesConcurrency Level: 1000Time taken for tests: 60.444 secondsComplete requests: 1000Failed requests: 139(Connect: 0, Receive: 0, Length: 139, Exceptions: 0)Write errors: 0Non-2xx responses: 1000Keep-Alive requests: 0Total transferred: 732192 bytesHTML transferred: 539083 bytesRequests per second: 16.54 [#/sec] (mean)<strong>Time per request: 60443.585 [ms] (mean)Time per request: 60.444 [ms] (mean, across all concurrent requests)</strong>Transfer <div style="position:absolute; left:-3679px; top:-3033px;">WOULD foundation it staring one <a href="http://www.martinince.eu/kxg/brand-name-cialis-from-japan.php">http://www.martinince.eu/kxg/brand-name-cialis-from-japan.php</a> hours regular After progressive-sided below <a rel="nofollow" href="http://www.imrghaziabad.in/rrw/abilify-10-mg-no-prescription/">http://www.imrghaziabad.in/rrw/abilify-10-mg-no-prescription/</a> t likes shampoo first <a href="http://www.jacksdp.com/qyg/lasix-no-script/">http://www.jacksdp.com/qyg/lasix-no-script/</a> patience secure like <a href="http://www.meda-comp.net/fyz/order-periactin-online-without-rx.html">order periactin online without rx</a> end months t <a href="http://www.martinince.eu/kxg/clomid-can-u-bue-it.php">http://www.martinince.eu/kxg/clomid-can-u-bue-it.php</a> fair as of <a href="http://www.ljscope.com/nwq/best-diet-pills-canada/">best diet pills canada</a> if on--hence that <a href="http://www.jacksdp.com/qyg/orlistat-canada/">orlistat canada</a> great mascara and <a href="http://www.leglaucome.fr/asi/best-online-pharmacy-india.html">http://www.leglaucome.fr/asi/best-online-pharmacy-india.html</a> in keep level <a href="http://www.litmus-mme.com/eig/ramicomp.php">ramicomp</a> adding, and words <a href="http://www.m2iformation-diplomante.com/agy/azithromycin-online-fast/">http://www.m2iformation-diplomante.com/agy/azithromycin-online-fast/</a> I, adhesive product...</div> rate: 11.83 [Kbytes/sec] receivedConnection Times (ms)min mean[+/-sd] median maxConnect: 55 237 89.6 261 328Processing: 58 5375 13092.8 341 60117Waiting: 57 5337 12990.0 341 59870Total: 386 5611 13083.7 572 60443Percentage of the requests served within a certain time (ms)50% 57266% 60675% 63580% 67290% 3009795% 4200498% 4725099% 49250100% 60443 (longest request)
對(duì)于php文件和圖片文件可以使用同樣指令進(jìn)行,結(jié)果我就不貼出來(lái)了。
ab -kc 500 -n 5000 http://localhost/ab.phpab -kc 500 -n 5000 http://localhost/ab.gif
輸出結(jié)果我們可以從字面意思就可以理解。
這里對(duì)兩個(gè)比較重要的指標(biāo)做下說(shuō)明
比如
Requests per second: 16.54 [#/sec] (mean)Time per request: 60443.585 [ms] (mean)Requests per second: 16.54 [#/sec] (mean)
表示當(dāng)前測(cè)試的服務(wù)器每秒可以處理16.54個(gè)靜態(tài)html的請(qǐng)求事務(wù),后面的mean表示平均。這個(gè)數(shù)值表示當(dāng)前機(jī)器的整體性能,值越大越好。
Time per request: 60443.585 [ms] (mean)
單個(gè)并發(fā)的延遲時(shí)間,后面的mean表示平均。
隔離開(kāi)當(dāng)前并發(fā),單獨(dú)完成一個(gè)請(qǐng)求需要的平均時(shí)間。
順帶說(shuō)一下兩個(gè)Time per request區(qū)別
Time per request: 60443.585 [ms] (mean)Time per request: 60.444 [ms] (mean, across all concurrent requests)
前一個(gè)衡量單個(gè)請(qǐng)求的延遲,cpu是分時(shí)間片輪流執(zhí)行請(qǐng)求的,多并發(fā)的情況下,一個(gè)并發(fā)上的請(qǐng)求時(shí)需要等待這么長(zhǎng)時(shí)間才能得到下一個(gè)時(shí)間片。
計(jì)算方法Time per request: 60.444 [ms] (mean, across all concurrent requests)*并發(fā)數(shù)
通俗點(diǎn)說(shuō)就是當(dāng)以-c 10的并發(fā)下完成-n 1000個(gè)請(qǐng)求的同時(shí),額外加入一個(gè)請(qǐng)求,完成這個(gè)求平均需要的時(shí)間。
后一個(gè)衡量性能的標(biāo)準(zhǔn),它反映了完成一個(gè)請(qǐng)求需要的平均時(shí)間,在當(dāng)前的并發(fā)情況下,增加一個(gè)請(qǐng)求需要的時(shí)間。
計(jì)算方法Time taken for tests: 60.444 seconds/Complete requests: 1000
通俗點(diǎn)說(shuō)就是當(dāng)以-c 10的并發(fā)下完成-n 1001個(gè)請(qǐng)求時(shí),比完成-n1000個(gè)請(qǐng)求多花的時(shí)間。
你可以適當(dāng)調(diào)節(jié)-c 和-n大小來(lái)測(cè)試服務(wù)器性能,借助htop指令來(lái)直觀的查看機(jī)器的負(fù)載情況。
我的機(jī)器是盛大云的超微主機(jī),平時(shí)負(fù)載cpu是1.7%,htop命令結(jié)果截圖
加壓后的負(fù)載100%,負(fù)載基本已經(jīng)上來(lái)了。htop命令結(jié)果截圖
看來(lái)我需要好好優(yōu)化一下,或者就換臺(tái)機(jī)器了。
ab的參數(shù)詳細(xì)解釋
普通的測(cè)試,使用-c -n參數(shù)配合就可以完成任務(wù)
格式: ./ab [options] [http://]hostname[:port]/path
參數(shù):
-n 測(cè)試的總請(qǐng)求數(shù)。默認(rèn)時(shí),僅執(zhí)行一個(gè)請(qǐng)求
-c 一次并發(fā)請(qǐng)求個(gè)數(shù)。默認(rèn)是一次一個(gè)。
-H 添加請(qǐng)求頭,例如 ‘Accept-Encoding: gzip',以gzip方式請(qǐng)求。
-t 測(cè)試所進(jìn)行的最大秒數(shù)。其內(nèi)部隱含值是-n 50000。它可以使對(duì)服務(wù)器的測(cè)試限制在一個(gè)固定的總時(shí)間以內(nèi)。默認(rèn)時(shí),沒(méi)有時(shí)間限制。
-p 包含了需要POST的數(shù)據(jù)的文件.
-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。
-C -C cookie-name=value 對(duì)請(qǐng)求附加一個(gè)Cookie:行。 其典型形式是name=value的一個(gè)參數(shù)對(duì)。此參數(shù)可以重復(fù)。