? ? ? ? 上一篇文章里說過,目前互聯(lián)網(wǎng)公司的測試開發(fā)崗位分兩類坡脐。多數(shù)的一類是既要負(fù)責(zé)業(yè)務(wù)測試奥务、自動化測試物独,同時也要去開發(fā)測試框架、效率工具來輔助業(yè)務(wù)測試氯葬。這類測試開發(fā)的崗位(主要指后端的崗位)一般多少都要接觸壓力測試挡篓。
? ? ? ? 壓力測試、性能測試帚称、負(fù)載測試瞻凤、穩(wěn)定性測試在網(wǎng)絡(luò)上有很多文章介紹概念和區(qū)別,通常在項目過程中不會區(qū)分那么多世杀,實(shí)際項目中都是以目標(biāo)為導(dǎo)向,通常實(shí)際項目中都會說肝集,壓測一下看下性能瞻坝,所以這里就不管詳細(xì)的概念和區(qū)別了。為了好理解杏瞻,我們這里統(tǒng)一叫壓測所刀,并以得到性能數(shù)據(jù)為性能測試,以觀察穩(wěn)定性為穩(wěn)定性測試捞挥。
? ? ? ? 性能測試和穩(wěn)定性測試的相同之處在于都是使用壓測工具來進(jìn)行浮创。但目標(biāo)不同,性能測試是通過壓力測試得到系統(tǒng)的極限性能或者和上一版本的性能對比數(shù)據(jù)砌函。而穩(wěn)定性測試則是通過壓力測試提供穩(wěn)定或者變化的持續(xù)流量斩披,來觀察系統(tǒng)持續(xù)運(yùn)行的情況下是否存在異常。
? ? ? ? 正常情況下讹俊,一般系統(tǒng)先做性能測試垦沉,拿到極限性能或者性能對比數(shù)據(jù)(對于非1.0項目,性能數(shù)據(jù)一般需要和上一個版本對比)之后仍劈,再通過安全的流量持續(xù)壓測更長時間厕倍,來完成穩(wěn)定性的驗(yàn)證。
? ? ? ? 下面我們就具體介紹一下怎么做性能測試和穩(wěn)定性測試贩疙。
一. 性能測試
? ? ? ? 1. 確定目標(biāo)&收集線上數(shù)據(jù)
? ? ? ? 性能測試的第一步要確定目標(biāo)讹弯,就是為什么要做性能測試况既,要達(dá)到什么樣的目標(biāo)或者效果。比如某個首次上線的系統(tǒng)组民,性能測試主要是為了得到系統(tǒng)的極限性能數(shù)據(jù)棒仍;再比如,系統(tǒng)優(yōu)化邪乍,更換了RPC協(xié)議或者消息隊列降狠,性能測試就是為了量化此次系統(tǒng)優(yōu)化在性能上優(yōu)化的效果。另外庇楞,也不是所有的項目都需要性能測試榜配,比如一個內(nèi)部系統(tǒng),用戶數(shù)和流量本身就很少吕晌,而且在未來一段時間也不會有增量蛋褥,這就基本不需要性能測試。
? ? ? ? 如果是從無到有的1.0項目睛驳,因?yàn)轫椖窟€沒有上線烙心,所以只能評經(jīng)驗(yàn)來預(yù)估線上的流量數(shù)據(jù);但如果是非1.0項目乏沸,就可以收集當(dāng)前的線上數(shù)據(jù)淫茵。具體收集的數(shù)據(jù)如下(僅供參考,要按照實(shí)際情況來調(diào)整):1)被測系統(tǒng)或模塊各類請求流量比例蹬跃;2)系統(tǒng)或模塊目前平均成箫、峰值维费、最小 qps俺夕;3)線上部署方式和規(guī)模襟铭;4)被測系統(tǒng)或模塊依賴能承受的QPS或者容量。
? ? ? ? 2.確定壓測方案&部署壓測環(huán)境
? ? ? ? 確定目標(biāo)和收集完線上現(xiàn)有數(shù)據(jù)之后翁都,需要根據(jù)目標(biāo)和現(xiàn)有數(shù)據(jù)確定壓測方案碍论,比如,每個階段通過多大并發(fā)或者流量來壓測柄慰、分幾個階段鳍悠、每個階段多長時間、以及壓測過程中需要觀察和記錄哪些數(shù)據(jù)等坐搔。
? ? ? ? 同時贼涩,也要準(zhǔn)備壓測環(huán)境,壓測的環(huán)境要盡可能的和線上一致薯蝎,如果達(dá)不到遥倦,就做等比縮放。比如,一個系統(tǒng)有A袒哥、B兩個模塊組成缩筛,線上A部署了20臺機(jī)器,B部署了5臺機(jī)器堡称,那么壓測就可以A部署4臺瞎抛,B部署1臺。機(jī)器和實(shí)例的數(shù)量只是一個方面却紧,同時也要考慮機(jī)器的性能(CPU盒數(shù)桐臊、內(nèi)存、磁盤晓殊、網(wǎng)卡等)断凶,還要考慮依賴方(如DB、緩存巫俺、消息隊列等)的部署认烁。部署壓測環(huán)境的核心思路就是要用這套環(huán)境反應(yīng)出線上環(huán)境的真實(shí)情況。
? ? ? ? 3.準(zhǔn)備壓測工具&構(gòu)造壓測數(shù)據(jù)
? ? ? ? 要進(jìn)行壓力測試就一定要有壓測工具介汹,一般來說壓測http或者其他開源協(xié)議可以在網(wǎng)上找到現(xiàn)成的工具却嗡,比如jmater之類的。但如果場景比較特殊嘹承,或者使用的是公司或項目的私有協(xié)議窗价,就只能使用公司內(nèi)部的工具或者自己動手開發(fā)了。
? ? ? ? 選擇好壓測工具就要構(gòu)造壓測數(shù)據(jù)了叹卷。構(gòu)造壓測數(shù)據(jù)主要分兩點(diǎn):
? ? ? ? 第一點(diǎn)是要構(gòu)造壓測環(huán)境系統(tǒng)中的數(shù)據(jù)撼港。因?yàn)榫€上系統(tǒng)內(nèi)部一定是有一定數(shù)據(jù)的,我們要盡量模擬線上就要在系統(tǒng)中添加相應(yīng)的數(shù)據(jù)豪娜。
? ? ? ? 另一點(diǎn)就是要準(zhǔn)備壓測的請求數(shù)據(jù)。這點(diǎn)跟選擇的壓測工具有關(guān)哟楷,一般來說分2種:
? ? ? ? 1)數(shù)據(jù)詞典瘤载, 壓測的請求提前準(zhǔn)備好,存入文件卖擅、DB或緩存里鸣奔,數(shù)據(jù)量較大的時候一般需要寫程序生成。
? ? ? ? 2)實(shí)時生成惩阶,這種是壓測工具在壓測的時候根據(jù)配置規(guī)則來實(shí)時隨機(jī)生成請求挎狸。
? ? ? ? 4.執(zhí)行壓測&觀察并記錄性能數(shù)據(jù)
? ? ? ? 準(zhǔn)備工作一切就緒,下一步就開始做壓測的執(zhí)行断楷。這時候主要就是根據(jù)壓測方案的從低到高去調(diào)整壓測工具的并發(fā)數(shù)或請求數(shù)锨匆,來對目標(biāo)系統(tǒng)或模塊進(jìn)行壓測。
? ? ? ? 壓測時冬筒,要觀察CPU恐锣、內(nèi)存茅主、網(wǎng)絡(luò)IO、磁盤空間土榴、被壓目標(biāo)日志诀姚、依賴系統(tǒng)或者模塊的狀態(tài)等數(shù),也要記錄不同并發(fā)下目標(biāo)系統(tǒng)或者模塊處理請求的QPS和響應(yīng)時間玷禽。同時也要注意有沒有內(nèi)存泄漏赫段、句柄泄漏、系統(tǒng)崩潰等問題矢赁。
? ? ? ? 5.整理性能數(shù)據(jù)&產(chǎn)出性能分析報告
? ? ? ? 實(shí)際上部分?jǐn)?shù)據(jù)在記錄的過程中就可以初步整理出來糯笙。這里要針對上一步記錄的數(shù)據(jù),進(jìn)行匯總坯台,主要要產(chǎn)出在不同并發(fā)下炬丸,上面提到的數(shù)據(jù)都是什么情況。需要根據(jù)數(shù)據(jù)判斷出極限性能蜒蕾,找到這種部署情況下瓶頸在哪稠炬,以及是什么原因造成的,為后續(xù)擴(kuò)容提供依據(jù)咪啡。有些情況還需要跟以前的數(shù)據(jù)做對比首启,看性能提升或者下降的程度是不是符合預(yù)期。最后撤摸,把這些信息綜合匯總毅桃、分析之后,產(chǎn)出性能測試的報告准夷。
二.穩(wěn)定性測試
? ? ? ? 通常性能測試之后拿到了性能數(shù)據(jù)之后钥飞,都會在安全的并發(fā)或者流量下持續(xù)壓測更長的時間來確保服務(wù)的穩(wěn)定性。比如衫嵌,筆者通常測試性能的時候读宙,每輪可能壓測半小時到一小時(在剛開始并發(fā)或者流量較小的時候可能會更短),在得到期限性能之后楔绞,會控制極限性能時80%-%90的流量或者并發(fā)去壓測更長的時間结闸,這個時間一般會比較長,而且多數(shù)情況下會在晚上下班前啟動酒朵,然后第二天到公司來看結(jié)果桦锄。
? ? ? ? 除了長時間通過安全流量來驗(yàn)證外,有些時候在特殊場景下蔫耽,也需要驗(yàn)證在安全流量范圍內(nèi)结耀,流量急曾或者急降的情況下,穩(wěn)定性是否有影響”牵或者香伴,驗(yàn)證在一定流量下,模擬某個依賴或者系統(tǒng)內(nèi)部的模塊出現(xiàn)問題具则,執(zhí)行相應(yīng)預(yù)案時即纲,對系統(tǒng)整體的影響是否符合預(yù)期。
? ? ? ? 當(dāng)然博肋,穩(wěn)定性很多情況是異常低斋,但更多的異常會在異常測試?yán)锶プ觯@里的穩(wěn)定性測試是指在一定流量壓力下的穩(wěn)定性測試匪凡,其他的就不做討論了膊畴。
三. 實(shí)例?
? ? ? ? 上面介紹了壓力測試?yán)铮阅軠y試和穩(wěn)定性測試要做什么病游,那具體怎么做呢唇跨?下面我們就通過一個實(shí)例來簡單介紹一下。
? ? ? 一個消息推送的系統(tǒng)衬衬,推送的消息就是我們?nèi)粘J謾C(jī)APP的通知消息买猖。這個消息通知的系統(tǒng)有三個接口,分別是單播(指定推送給某個人)滋尉、組播(推送給一個組玉控,組里可能有多個人)、廣播(推送給APP所有用戶)∈ㄏВ現(xiàn)在這個系統(tǒng)做了一個重構(gòu)高诺,更新了內(nèi)部交互的RPC協(xié)議,所以要壓一下碾篡,跟之前的性能數(shù)據(jù)做個對比虱而。另外,系統(tǒng)重構(gòu)前开泽,線上集群極限性能為30000 QPS牡拇。
? ? ? ? 下面,我們就按照前面的步驟眼姐,來簡單介紹一下具體怎么做诅迷。
? ? ? ? 1. 確定目標(biāo)&收集線上數(shù)據(jù)
? ? ? 目標(biāo)就是要得到重構(gòu)后的系統(tǒng)性能數(shù)據(jù)佩番,并和原有的做對比众旗,原有的極限性能已知,大概在30000 QPS左右趟畏。
? ? ? ? 收集線上數(shù)據(jù)贡歧,比如說我們收集到單播、組播、廣播的請求比例為5:78:1利朵;組內(nèi)人數(shù)大概在300-1000律想;發(fā)送的消息字符數(shù)在30-100這個區(qū)間。
? ? ? ? 2.確定壓測方案&部署壓測環(huán)境
? ? ? ? 壓測方案要先確定部署方案绍弟,比如這個系統(tǒng)向上是20臺機(jī)器(或者實(shí)例)技即,壓測采用2臺機(jī)器(等比縮放)。壓測機(jī)器是線上的1/10樟遣,所以我們的目標(biāo)性能就是3000qps而叼。那么我們壓測的方案就可以如下設(shè)置:
? ? ? ? 第一輪,2個并發(fā)豹悬,5-10分鐘葵陵,主要目的是為了先驗(yàn)證環(huán)境和壓測工具沒有問題;
? ? ? ? 第二輪瞻佛,根據(jù)上一輪并發(fā)數(shù)和機(jī)器資源(CPU脱篙、內(nèi)存、IO)的情況伤柄,調(diào)整并發(fā)到極限的一半多一些(比如绊困,之前是2個并發(fā),CPU占用10%左右响迂,內(nèi)存考抄、IO占用都很小,那么就以CPU的占用作為參考來計算蔗彤,1個并發(fā)大概占用5%川梅,那我們就可以吧并發(fā)調(diào)到10-12,目標(biāo)CPU占用是50-60%)然遏。這其實(shí)才真正開始壓測贫途,如果沒問題,就開始逐步加壓待侵;
? ? ? ? 第三輪丢早,開始逐步增加,按照實(shí)際情況一次增加2-5個并發(fā)秧倾,直到性能達(dá)到瓶頸怨酝。
? ? ? ? 這里是假設(shè)壓測工具通過調(diào)整并發(fā)數(shù)來操作壓力,主要需要看下并發(fā)對系統(tǒng)CPU那先、內(nèi)存农猬、IO的影響,根據(jù)壓測時機(jī)器的資源占用信息來判斷增加多少并發(fā)售淡。
? ? ? ? 確定好方案斤葱,就需要部署壓測環(huán)境了慷垮,這里要注意,盡量使用跟線上一致配置的機(jī)器揍堕。
? ? ? ? 3.準(zhǔn)備壓測工具&構(gòu)造壓測數(shù)據(jù)
? ? ? ? 壓測工具要根據(jù)實(shí)際業(yè)務(wù)做選擇料身,必要的時候需要自己開發(fā),工具開發(fā)后面如果有機(jī)會在其他的文章里介紹衩茸,這里就不多介紹了芹血。我們這個例子因?yàn)槭窍到y(tǒng)更換內(nèi)部協(xié)議,對外接口不變楞慈,所以可以使用原有壓測工具祟牲。
? ? ? ? 下面就是要構(gòu)造數(shù)據(jù):
? ? ? ? 首先,要構(gòu)造系統(tǒng)內(nèi)部的數(shù)據(jù)抖部,比如用戶信息说贝、設(shè)備信息、組信息慎颗,這里既要根據(jù)線上的收集到的信息來構(gòu)造乡恕,比如用戶數(shù)、組的數(shù)量俯萎、組內(nèi)用戶數(shù)等傲宜。這類如果方便的話可以直接在DB里插入,或者掉相應(yīng)的系統(tǒng)API來準(zhǔn)備夫啊。
? ? ? ? 然后就是壓測的請求數(shù)據(jù)函卒,比如說壓測工具是用數(shù)據(jù)詞典來壓測,那么這里我們就通過腳本撇眯,來生成壓測請求數(shù)據(jù)报嵌。這里要注意線上收集到的各個接口的占比,即5:78:1熊榛。壓測的時候按照這個比例來提供流量锚国。
? ? ? ? 4.執(zhí)行壓測&觀察并記錄性能數(shù)據(jù)
? ? ? ? 準(zhǔn)備工作完成,開始做壓測玄坦。
? ? ? ? 這時候要先吧各類數(shù)據(jù)觀察準(zhǔn)備好血筑,一般現(xiàn)在的互聯(lián)網(wǎng)大廠都有圖形化的工具來看,如果沒有也可以通過linux的一些命令來看煎楣。常用的命令有top\ps\vmstat豺总, 這里推薦使用top來查看實(shí)時的資源情況,使用vmstat的來定時輸出當(dāng)資源情況(vmstat -t 1 就是每秒輸出一次)择懂。
? ? ? ? 準(zhǔn)備好了觀測喻喳,那就啟動壓測工具,按照方案壓測休蟹。壓測方案上面已經(jīng)介紹沸枯,這里就不重復(fù)了。
? ? ? ? 假如我們并發(fā)加到20個的時候赂弓,CPU占用達(dá)到85%左右绑榴,處理請求達(dá)到3600qps,其他資源占用都不足機(jī)器的一半盈魁;并發(fā)加到22個的時候翔怎,CPU占用達(dá)到95-100,處理請求是3700qps杨耙;并發(fā)加到24赤套,CPU打滿,處理請求3800QPS珊膜,并且出現(xiàn)錯誤日志容握。這時候就可以停止壓測了。
? ? ? ? 5.整理性能數(shù)據(jù)&產(chǎn)出性能分析報告
? ? ? 數(shù)據(jù)整理车柠,我們首先要整理一個表格或者圖標(biāo)剔氏,我們這里用表格:
? ? ? ?這個表格就是壓測產(chǎn)出的最核心的數(shù)據(jù),由于CPU是明顯的性能瓶頸竹祷,表格里就不體現(xiàn)其他資源了谈跛,如果其他資源使用率也比較高,也要放到這個表格里塑陵,又或者瓶頸在外部依賴感憾,也要體現(xiàn)出來。通過這個數(shù)據(jù)可以看出令花,3700QPS就是系統(tǒng)處理的極限阻桅,安全的流量在3600QPS。這時候就可以用17-20的并發(fā)數(shù)兼都,長時間壓測壓測一下鳍刷,看看系統(tǒng)整體的穩(wěn)定性。
? ? ? 那么性能報告怎么寫呢俯抖?下面就給出一個比較簡單的性能報告樣例输瓜。
? ? ? ? 標(biāo)題:消息推送RPC協(xié)議升級性能測試報告
? ? ? ? 一、項目背景
? ? ? ? ? ? ? ? 這里寫項目背景和目標(biāo)
? ? ? ? 二芬萍、壓測環(huán)境
? ? ? ? ? ? ? ? 線上20臺物理機(jī)尤揣,壓測環(huán)境使用2臺物理機(jī),配置與線上一致柬祠,具體如下:
? ? ? ? ? ? ? ? XX核北戏,XXG內(nèi)存,萬兆網(wǎng)卡漫蛔,硬盤 400G * 6 SSD
? ? ? ? ? ? ? ? DB:XX主XX從XX備
? ? ? ? 三嗜愈、壓測方案和數(shù)據(jù)
1. 請求比例
? ? ? 單播:組播:廣播 =? 5:78:1
2. 壓測過程數(shù)據(jù)
? ? ? 3.? 資源占用圖
? ? 可以把QPS和CPU占用使用工具(比如excel)生成一個折線圖旧蛾,另外,可以把其他資源數(shù)占用的數(shù)據(jù)圖片貼一下蠕嫁。
? ? ? ? 四锨天、結(jié)論
? ? ? ? 壓測過程中,壓力達(dá)到3700qp時剃毒,內(nèi)存與IO正常病袄,CPU占用達(dá)到98%,無錯誤日志赘阀。壓力達(dá)到3800qps時CPU打滿益缠,且5分鐘后開始出現(xiàn)錯誤日志。因此系統(tǒng)在2臺物理機(jī)部署極限性能為3700qps基公,性能瓶頸在CPU幅慌,預(yù)計線上20臺機(jī)器極限性能為37000qps.
? ? ? ? 系統(tǒng)RPC協(xié)議升級前20臺機(jī)器30000qps,升級后預(yù)計能達(dá)到37000qps轰豆,性能整體提升23%欠痴,符合預(yù)期。
? ? ? ? 上面就是一個比較簡單的報告秒咨,真實(shí)項目中瓶頸不一定是CPU喇辽,可能是其他資源,也可能是依賴的系統(tǒng)或者模塊雨席,這些都需要觀察和分析壓測中的數(shù)據(jù)來得出菩咨。
四、綜述
? ? ? ? 壓力測試是后端測試和測試開發(fā)人員的必備技能陡厘,這篇文章只是根據(jù)筆者的經(jīng)驗(yàn)針對壓力測試進(jìn)行的總結(jié)抽米,不能覆蓋所有壓測場景,僅給大家做個參考糙置。更多的是需要我們根據(jù)系統(tǒng)的實(shí)際情況去探索和實(shí)踐云茸。