壓測工具http_load與Ab
http_load
簡介
http_load
以並行複用的方式執行,用以測試Web伺服器的吞吐量與負載。但是它不同於大多數壓力測試工具,其可以以一個單一的程序執行,這樣就不會把客戶機搞死,還可以測試HTTPS類的網站請求。關於http_load
的詳細資訊參見這裡,點選這裡下載。
安裝
# tar xzvf http_load-09Mar2016.tar.gz
# cd http_load-09Mar2016
# make && make install
- 1
- 2
- 3
測試
http_load
的命令引數比較簡單,直接在命令列下執行http_load
就能看到,具體如下:
-parallel簡寫-p:併發的使用者程序數。
-fetches簡寫-f:總計的訪問次數
-rate簡寫-r:每秒的訪問頻率
-seconds簡寫-s:總計的訪問時間
http_load的命令格式也比較簡單,各引數可以自由組合,常用格式如下:
$ http_load -p 併發訪問程序數 -f 訪問總數 需要訪問的URL檔案
$ http_load -r 每秒訪問頻率 -s 訪問時間 需要訪問的URL檔案
- 1
- 2
通常:引數pf一起使用,引數rs一起使用。
這裡以某網頁測試為例說明之:
$ vi test.url
http://www.xxxxx.com
- 1
- 2
當然上面存放請求URL的檔案中,可以存放多個URL,每行一個。
$ http_load -p 5 -s 300 test.url
11694 fetches, 5 max parallel, 5.6872e+08 bytes, in 300 seconds
48633.5 mean bytes/connection
38.98 fetches/sec, 1.89573e+06 bytes/sec
msecs/connect: 10.476 mean, 9008.81 max, 5.002 min
msecs/first-response: 36.5928 mean, 5383.94 max, 16.614 min
7 timeouts
10428 bad byte counts
HTTP response codes:
code 200 -- 7552
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
上面命令表示:5個併發程序,持續300秒請求某網頁。
#http_load -r 5 -s 300 test.url
1499 fetches, 5 max parallel, 9.49031e+07 bytes, in 300.017 seconds
63310.9 mean bytes/connection
4.99638 fetches/sec, 316326 bytes/sec
msecs/connect: 21.5961 mean, 3020.17 max, 16.782 min
msecs/first-response: 36.6554 mean, 61.907 max, 17.919 min
1261 bad byte counts
HTTP response codes:
code 200 -- 1261
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
上面命令表示:每秒頻率為5條請求,持續300秒請求某網頁。
結果分析如下:
(1)1499 fetches, 5 max parallel, 9.49031e+07 bytes, in 300.017 seconds
說明在上面的測試中運行了1499個請求,最大的併發程序數是5,總計傳輸的資料是9.49031e+07 bytes,執行的時間是300.017秒
(2)63310.9 mean bytes/connection
說明每個連線平均傳輸的資料量63310.9/1499=42.24
(3)4.99638 fetches/sec, 316326 bytes/sec
說明每秒的響應請求為4.99638,每秒傳遞的資料為316326 bytes/sec
(4)msecs/connect: 21.5961 mean, 3020.17 max, 16.782 min
說明每個連線的平均響應時間是21.5961 msecs,最大的響應時間3020.17 msecs,最小的響應時間16.782 msecs
(5)HTTP response codes: code 200 — 1261
說明開啟響應頁面的型別,如果403的型別過多,那可能要注意是否系統遇到了瓶頸
特殊說明:測試結果中主要的指標是fetches/sec和msecs/connect,即伺服器每秒能夠響應的請求次數和每個連線的平均響應時間。當然僅有這兩個指標並不能完成對效能的分析,這兩個指標主要反映的是QPS和RT。此外,還需要對伺服器的CPU(idle和load)、Mem進行分析,才能得出結論。
需要注意的是:http_load請求方式預設為GET方式,不支援POST方式。
apache ab
簡介
ab即ApacheBench,是apache自帶的一款功能強大的測試工具,安裝了apache一般就自帶了,即httpd(在bin目錄下)。
ab可以同時模擬多個併發請求,專門用於HTTP Server的benchmark testing。
ab命令格式如下: ab [options] [http[s]://]hostname[:port]/path
ab的引數比較多,直接在命令列下執行ab就能看到,常用引數如下:
-n在測試會話中所執行的請求個數。預設時,僅執行一個請求。
-c一次產生的請求個數。預設是一次一個。
-t測試所進行的最大秒數。其內部隱含值是-n 50000,它可以使對伺服器的測試限制在一個固定的總時間以內。預設時,沒有時間限制。
-p包含了需要POST的資料的檔案。
-P對一箇中轉代理提供BASIC認證信任。使用者名稱和密碼由一個:隔開,並以base64編碼形式傳送。無論伺服器是否需要(即, 是否傳送了401認證需求程式碼),此字串都會被髮送。
-T POST資料所使用的Content-type頭資訊。
-v設定顯示資訊的詳細程度-4或更大值會顯示頭資訊,3或更大值可以顯示響應程式碼(404,200等),2或更大值可以顯示警告和其他資訊。
-V顯示版本號並退出。
-w以HTML表的格式輸出結果。預設時,它是白色背景的兩列寬度的一張表。
-i執行HEAD請求,而不是GET。
-x設定<table>
屬性的字串。
-X對請求使用代理伺服器。
-y設定<tr>
屬性的字串。
-z設定<td>
屬性的字串。
-C對請求附加一個Cookie:行。其典型形式是name=value的一個引數對,此引數可以重複。
-H對請求附加額外的頭資訊。此引數的典型形式是一個有效的頭資訊行,其中包含了以冒號分隔的欄位和值的對(如,”Accept-Encoding:zip/zop;8bit”)。
-A對伺服器提供BASIC認證信任。使用者名稱和密碼由一個:隔開,並以base64編碼形式傳送。無論伺服器是否需要(即,是否傳送了401認證需求程式碼),此字串都會被髮送。
-h顯示使用方法。
-d不顯示”percentage served within XX [ms] table”的訊息(為以前的版本提供支援)。
-e產生一個以逗號分隔的(CSV)檔案,其中包含了處理每個相應百分比的請求所需要(從1%到100%)的相應百分比的(以微妙為單位)時間。由於這種格式已經“二進位制化”,所以比’gnuplot’格式更有用。
-g把所有測試結果寫入一個’gnuplot’或者TSV(以Tab分隔的)檔案。此檔案可以方便地匯入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行為標題。
-i執行HEAD請求,而不是GET。
-k啟用HTTP KeepAlive功能,即在一個HTTP會話中執行多個請求。預設時,不啟用KeepAlive功能。
-q如果處理的請求數大於150,ab每處理大約10%或者100個請求時,會在stderr輸出一個進度計數。此-q標記可以抑制這些資訊。
需要注意的是:ab每次只能測試一個URL,適合做重複壓力測試,支援POST方式。
測試
(1)如果要測試POST請求,可以使用如下命令:
$ ab -n 1000000 -c 100 -p data.txt -T 'application/x-protobuf' 'http://www.xxxxx.com/'
- 1
上面命令表示模擬100個併發使用者,傳送1000000個POST請求到http://www.xxxxx.com/,POST資料從檔案data.txt讀取,Content-type為application/x-protobuf。
$ ab -t 300 -c 100 -p data.txt -T 'application/x-protobuf' 'http://www.xxxxx.com/'
- 1
上面命令表示模擬100個併發使用者,持續300秒傳送POST請求到http://www.xxxxx.com/,POST資料從檔案data.txt讀取,Content-type為application/x-protobuf。
需要注意的是:如果在傳送請求完後,出現如下錯誤:
apr_poll: The timeout specified has expired (70007)
- 1
使用-k引數指定傳送keep-alive指令到伺服器端,可以解決上面問題:
#ab -t 300 -c 100 -k -p data.txt -T 'application/x-protobuf' 'http://www.xxxxx.com/'
- 1
(2)如果要測試GET請求,可以使用如下命令(這裡以搜狗首頁測試為例說明之):
$ ab -t 300 -c 5 -k http://www.sogou.com
- 1
執行上面命令會出現如下錯誤:
ab: invalid URL
Usage: ab [options] [http[s]://]hostname[:port]/path
- 1
- 2
上面錯誤的意思是URL後面要加/path,從提示也能看出來,可以改成如下即可:
$ ab -t 300 -c 5 -k http://www.sogou.com/
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.sogou.com (be patient)
Completed 5000 requests
Finished 5211 requests
Server Software: nginx #被測試服務名稱
Server Hostname: www.sogou.com #請求地址
Server Port: 80 #請求埠號
Document Path: / #請求頁面
Document Length: 15785 bytes #頁面長度
Concurrency Level: 5 #併發數
Time taken for tests: 300.011 seconds #整個測試持續的時間
Complete requests: 5211 #完成的請求數
Failed requests: 0 #失敗的請求數
Write errors: 0
Keep-Alive requests: 0
Total transferred: 86136965 bytes #總共傳輸位元組數,包含http的頭資訊等
HTML transferred: 82258493 bytes #html位元組數,實際的頁面傳遞位元組數
Requests per second: 17.37 [#/sec] (mean) #每秒請求數(這是一個非常重要的指標,即伺服器的吞吐量)
Time per request: 287.863 [ms] (mean) #使用者平均請求等待時間(這也是一個非常重要的指標,即請求延遲)
Time per request: 57.573 [ms] (mean, across all concurrent requests) #伺服器平均處理時間,即伺服器吞吐量的倒數
Transfer rate: 280.38 [Kbytes/sec] received #每秒網路上的流量(可以幫助排除是否存在網路流量過大導致響應時間延長的問題)
Connection Times (ms)
min mean[+/-sd] median max
Connect: 28 42 215.8 34 9034
Processing: 86 233 2009.8 108 93465
Waiting: 29 71 547.5 37 21034
Total: 114 275 2031.9 143 93493
Percentage of the requests served within a certain time (ms)
50% 143 #50%的請求在143ms內返回
66% 148 #60%的請求在148ms內返回
75% 154
80% 160
90% 179
95% 195
98% 469
99% 3158
100% 93493 (longest request) #最大響應時間小於93493ms
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
特殊說明:測試結果中主要的指標是Requests per second和Time per request(第一個),即每秒請求數和使用者平均請求等待時間,這兩個指標主要反映的是QPS和RT。