在營運工作中,壓力測試是一項非常重要的工作。比如在一個網站上線之前,能承受多大訪問量、在大訪問量情況下效能怎樣,這些資料指標好壞將會直接影響使用者體驗。
但是,在壓力測試中存在一個共性,那就是壓力測試的結果與實際負載結果不會完全相同,就算壓力測試工作做的再好,也不能保證100%和線上效能指標相同。面對這些問題,我們只能盡量去想方設法去類比。所以,壓力測試非常有必要,有了這些資料,我們就能對自己做維護的平台做到心中有數。
目前較為常見的網站壓力測試工具有webbench、ab(apache bench)、tcpcopy、loadrunner。
webbench由Lionbridge公司開發,主要測試每秒鐘請求數和每秒鐘資料轉送量,同時支援靜態、動態、SSL,部署簡單,靜動態均可測試。適用於小型網站壓力測試(單例最多可類比3萬並發) 。
ab(apache bench)Apache內建的壓力測試工具,主要功能用於測試網站每秒鐘處理請求個數,多見用於靜態壓力測試,功能較弱,非專業壓力測試工具。
tcpcopy基於底層應用提取複寫,可轉寄各種線上請求到測試伺服器,具有分布式壓力測試功能,所測試資料與實際生產資料較為接近後起之秀,主要用於中大型壓力測試,所有基於tcp的packets均可測試。
loadrunner壓力測試界的泰鬥,可以建立虛擬使用者,可以類比使用者真實訪問流程從而錄製成指令碼,其測試結果也最為逼真類比最為逼真,並可進行獨立的單元測試,但是部署配置較為複雜,需要專業人員才可以。
下面,筆者就以ab為例,來講解一下網站在上線之前壓力測試是如何做的。
ab是針對apache的效能測試工具,可以只安裝ab工具。
ubuntu安裝ab
apt-get install apache2-utils
centos安裝ab
測試之前需要準備一個簡單的html、一個php、一個圖片檔案。
分別對他們進行測試。
我們把這個三個檔案放到nginx安裝目錄預設的html目錄下,
準備之後我們就可以測試了
ab -kc 1000 -n 1000 http://localhost/ab.html
這個指令會使用1000個並發,進行串連1000次。結果如下
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)
對於php檔案和圖片檔案可以使用同樣指令進行,結果我就不貼出來了。
ab -kc 500 -n 5000 http://localhost/ab.phpab -kc 500 -n 5000 http://localhost/ab.gif
輸出結果我們可以從字面意思就可以理解。
這裡對兩個比較重要的指標做下說明
比如
Requests per second: 16.54 [#/sec] (mean)Time per request: 60443.585 [ms] (mean)Requests per second: 16.54 [#/sec] (mean)
表示當前測試的伺服器每秒可以處理16.54個靜態html的請求事務,後面的mean表示平均。這個數值表示當前機器的整體效能,值越大越好。
Time per request: 60443.585 [ms] (mean)
單個並發的延遲時間,後面的mean表示平均。
隔離開當前並發,單獨完成一個請求需要的平均時間。
順帶說一下兩個Time per request區別
Time per request: 60443.585 [ms] (mean)Time per request: 60.444 [ms] (mean, across all concurrent requests)
前一個衡量單個請求的延遲,cpu是分時間片輪流執行請求的,多並發的情況下,一個並發上的請求時需要等待這麼長時間才能得到下一個時間片。
計算方法Time per request: 60.444 [ms] (mean, across all concurrent requests)*並發數
通俗點說就是當以-c 10的並發下完成-n 1000個請求的同時,額外加入一個請求,完成這個求平均需要的時間。
後一個衡量效能的標準,它反映了完成一個請求需要的平均時間,在當前的並發情況下,增加一個請求需要的時間。
計算方法Time taken for tests: 60.444 seconds/Complete requests: 1000
通俗點說就是當以-c 10的並發下完成-n 1001個請求時,比完成-n1000個請求多花的時間。
你可以適當調節-c 和-n大小來測試伺服器效能,藉助htop指令來直觀的查看機器的負載情況。
我的機器是盛大雲的超微主機,平時負載cpu是1.7%,htop命令結果截圖
加壓後的負載100%,負載基本已經上來了。htop命令結果截圖
看來我需要好好最佳化一下,或者就換台機器了。
ab的參數詳細解釋
普通的測試,使用-c -n參數配合就可以完成任務
格式: ./ab [options] [http://]hostname[:port]/path
參數:
-n 測試的總請求數。預設時,僅執行一個請求
-c 一次並發請求個數。預設是一次一個。
-H 添加要求標頭,例如 ‘Accept-Encoding: gzip',以gzip方式請求。
-t 測試所進行的最大秒數。其內部隱含值是-n 50000。它可以使對伺服器的測試限制在一個固定的總時間以內。預設時,沒有時間限制。
-p 包含了需要POST的資料的檔案.
-T POST資料所使用的Content-type頭資訊。
-v 設定顯示資訊的詳細程度 – 4或更大值會顯示頭資訊, 3或更大值可以顯示響應代碼(404, 200等), 2或更大值可以顯示警告和其他資訊。 -V 顯示版本號碼並退出。
-w 以HTML表的格式輸出結果。預設時,它是白色背景的兩列寬度的一張表。
-i 執行HEAD請求,而不是GET。
-C -C cookie-name=value 對請求附加一個Cookie:行。 其典型形式是name=value的一個參數對。此參數可以重複。