做者:樊春霖 騰訊移動互聯網高級工程師
商業轉載請聯繫騰訊WeTest得到受權,非商業轉載請註明出處。
原文連接:https://wetest.qq.com/lab/view/410.htmlhtml
在服務上線以前,性能測試必不可少。本文主要介紹性能測試的流程,須要關注的指標,性能測試工具apache bench的使用,以及常見的坑。docker
_apache
性能測試是經過自動化的測試工具模擬多種正常、峯值以及異常負載條件來對系統的各項性能指標進行測試。負載測試和壓力測試都屬於性能測試,二者能夠結合進行。經過負載測試,肯定在各類工做負載下系統的性能,目標是測試當負載逐漸增長時,系統各項性能指標的變化狀況。壓力測試是經過肯定一個系統的瓶頸或者不能接受的性能點,來得到系統能提供的最大服務級別的測試。api
性能測試最終的目的,是找到系統的瓶頸,通常來講,是找到服務單機最大TPS(每秒完成的事務數)。服務器
須要注意的是,服務的TPS須要結合請求平均耗時來綜合考慮。例如:服務TPS壓到1000,平均請求耗時500ms,可是假如咱們定的服務請求耗時不能超過200ms,那麼這個1000的TPS是無效的。cookie
不少場景下,服務都會設置超時時間,若平均耗時超過此超時時間,則可認爲服務處於不可用狀態。網絡
1.功能測試完成以後,上線以前。session
正常狀況下,上線以前,都應該進行性能測試,尤爲是請求量較大的接口,重點業務的核心接口,以及直接影響用戶操做流程的接口。併發
2.各類大促,運營活動開始以前。app
大促,運營活動,都會致使流量激增,所以上線以前作好壓力測試,評估系統性能是否知足預估流量,提早作好準備。
舉個反面例子:聚美優品,年年大促年年掛。
再來個正面的例子:每一年雙十一以前,阿里都會有全鏈路壓測,各個業務本身也會有獨立的壓測,阿里在這塊作得仍是很是不錯的。
最終咱們選擇apache bench
看上去wrk纔是最完美的,可是咱們卻選擇了ab。咱們驗證過各類工具請求數據是否準確,壓測的時候,經過後臺日志記錄,最終得出結論,ab的請求數偏差在千分之二左右,而其餘兩個工具在千分之五左右。
不過不得不說,wrk的確是一款很是優秀的壓測工具,採用異步IO模型,能壓到很是高的TPS。曾經用空邏輯接口壓到過7w的TPS,而相同接口,ab只能壓到2w多。
apache bench的使用
前面已經給了一個簡單的例子了,下面詳細介紹下ab的使用。
如何安裝?若是docker容器已經安裝的apache,那麼恭喜,ab是apache自帶的一個組件,不用從新安裝了。固然,也能夠本身單獨安裝apache bench。
ab 經常使用參數介紹 參數說明: 格式:ab [options] [http://]hostname[:port]/path -n requests Number of requests to perform //本次測試發起的總請求數 -c concurrency Number of multiple requests to make //一次產生的請求數(或併發數) -t timelimit Seconds to max. wait for responses //測試所進行的最大秒數,默認沒有時間限制。 -r Don't exit on socket receive errors. // 拋出異常繼續執行測試任務 -p postfile File containing data to POST //包含了須要POST的數據的文件,文件格式如「p1=1&p2=2」.使用方法是 -p 111.txt -T content-type Content-type header for POSTing //POST數據所使用的Content-type頭信息,如 -T 「application/x-www-form-urlencoded」 。 (配合-p) -v verbosity How much troubleshooting info to print //設置顯示信息的詳細程度 – 4或更大值會顯示頭信息, 3或更大值能夠顯示響應代碼(404, 200等), 2或更大值能夠顯示警告和其餘信息。 -V 顯示版本號並退出。 -C attribute Add cookie, eg. -C 「c1=1234,c2=2,c3=3」 (repeatable) //-C cookie-name=value 對請求附加一個Cookie:行。 其典型形式是name=value的一個參數對。此參數能夠重複,用逗號分割。 提示:能夠藉助session實現原理傳遞 JSESSIONID參數, 實現保持會話的功能,如-C 」 c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。 -w Print out results in HTML tables //以HTML表的格式輸出結果。默認時,它是白色背景的兩列寬度的一張表。 -i Use HEAD instead of GET -x attributes String to insert as table attributes -y attributes String to insert as tr attributes -z attributes String to insert as td or th attributes -H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Inserted after all normal header lines. (repeatable) -A attribute Add Basic WWW Authentication, the attributes are a colon separated username and password. -P attribute Add Basic Proxy Authentication, the attributes are a colon separated username and password. -X proxy:port Proxyserver and port number to use -V Print version number and exit -k Use HTTP KeepAlive feature -d Do not show percentiles served table. -S Do not show confidence estimators and warnings. -g filename Output collected data to gnuplot format file. -e filename Output CSV file with percentages served -h Display usage information (this message)
性能測試報告
測試報告應該包含如下內容。固然,根據場景不一樣,能夠適當增減指標,例若有的業務要求關注cpu,內存,IO等指標,此時就應該加上相關指標。
常見的坑
1.AB發送的是http1.0請求。
2.-t能夠指定時間,-n指定發送請求總數,同時使用時壓測會在-t秒或者發送了-n個請求以後中止。可是-t必定要在-n以前(ab的bug,-n在-t以前最多隻會跑5s)。
3.爲了使測試結果更可靠,單次壓測時間應在2分鐘以上。
理論上,壓測時間越長,結果偏差越小。同時,能夠在瓶頸附近進行長時間壓測,例如一個小時或者一天,能夠用來測試系統穩定性。許多系統的bug都是在持續壓力下才會暴露出來。
4.當心壓測客戶端成爲瓶頸。
例如上傳,下載接口的壓測,此時壓測客戶端的網絡上行,下行速度都會有瓶頸,千萬當心服務器還沒到達瓶頸時,客戶端先到了瓶頸。此時,能夠利用多客戶端同時壓測。
5.ab能夠將參數寫入文件中,用此種方式能夠測試上傳文件的接口。
須要配合-p -t 使用。
$ ab -n 10000 -c 8 -p post_image_1k.txt -T "multipart/form-data; boundary=1234567890" http://xxxxxxx
文件內容以下:
6.ab不支持動態構建請求參數,wrk可配合lua腳本支持動態構建請求參數,仍是比較牛的。
package.path = '/root/wrk/?.lua;' local md5 = require "md5" local body = [[BI_login|userid{145030}|openid{4-22761563}|source{}|affiliate{}|creative{}|family{}|genus{0}|ip{180.111.151.116}|from_uid{0}|login_date{2016-11-04}|login_time{10:40:13}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012} BI_logout|userid{184103}|openid{4-22784181}|family{}|genus{0}|ip{218.2.96.82}|logout_date{2016-11-04}|logout_time{10:40:42}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012} BI_role_logout|roleid{184103}|userid{184103}|openid{4-22784181}|ip{218.2.96.82}|level{100}|money{468}|power{1}|exp{252}|lijin{0}|online_time{0}|mapid{0}|posx{0}|posy{0}|rolelogout_date{2016-11-04}|rolelogout_time{10:40:42}|extra{0}|srcid{0}|snid{1002}|clientid{1253}|gameid{2100012} BI_logout|userid{71084}|openid{4-20974629}|family{}|genus{0}|ip{117.136.8.76}|logout_date{2016-11-04}|logout_time{10:40:43}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012}]] --local body = "hello" wrk.headers["Content-Type"] = "text/xml" local i=0 request = function() i = i+1 local path = "/v1/pub?gameid=510038×tamp=%s&key=510038&type=basic&sign=%s" local time = os.time()*1000 local v = "510038" .. time .. "basic98889999" local sign = md5.sumhexa(v) path = string.format(path, time, sign) --print(path) return wrk.format("POST", path, nil, body) end
_
騰訊WeTest推出的「壓測大師」,一分鐘完成用例配置,無需維護測試環境,支持http協議、API接口、網站等主流壓測場景。
點擊:https://wetest.qq.com/gaps 便可體驗。
若是使用當中有任何疑問,歡迎聯繫騰訊WeTest企業QQ:2852350015。