http性能測試點滴

做者:樊春霖 騰訊移動互聯網高級工程師
商業轉載請聯繫騰訊WeTest得到受權,非商業轉載請註明出處。
原文連接:https://wetest.qq.com/lab/view/410.htmlhtml

WeTest 導讀

在服務上線以前,性能測試必不可少。本文主要介紹性能測試的流程,須要關注的指標,性能測試工具apache bench的使用,以及常見的坑。docker

_apache

什麼是性能測試

性能測試是經過自動化的測試工具模擬多種正常、峯值以及異常負載條件來對系統的各項性能指標進行測試。負載測試和壓力測試都屬於性能測試,二者能夠結合進行。經過負載測試,肯定在各類工做負載下系統的性能,目標是測試當負載逐漸增長時,系統各項性能指標的變化狀況。壓力測試是經過肯定一個系統的瓶頸或者不能接受的性能點,來得到系統能提供的最大服務級別的測試。api

性能測試的目標是什麼

性能測試最終的目的,是找到系統的瓶頸,通常來講,是找到服務單機最大TPS(每秒完成的事務數)。服務器

須要注意的是,服務的TPS須要結合請求平均耗時來綜合考慮。例如:服務TPS壓到1000,平均請求耗時500ms,可是假如咱們定的服務請求耗時不能超過200ms,那麼這個1000的TPS是無效的。cookie

不少場景下,服務都會設置超時時間,若平均耗時超過此超時時間,則可認爲服務處於不可用狀態。網絡

何時須要性能測試

1.功能測試完成以後,上線以前。session

正常狀況下,上線以前,都應該進行性能測試,尤爲是請求量較大的接口,重點業務的核心接口,以及直接影響用戶操做流程的接口。併發

2.各類大促,運營活動開始以前。app

大促,運營活動,都會致使流量激增,所以上線以前作好壓力測試,評估系統性能是否知足預估流量,提早作好準備。

舉個反面例子:聚美優品,年年大促年年掛。

再來個正面的例子:每一年雙十一以前,阿里都會有全鏈路壓測,各個業務本身也會有獨立的壓測,阿里在這塊作得仍是很是不錯的。

怎麼作性能測試

常見的http性能測試工具

  1. httpload

圖片描述

  1. wrk

圖片描述

  1. apache bench

圖片描述
圖片描述
圖片描述

最終咱們選擇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&timestamp=%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。

相關文章
相關標籤/搜索