前言
隨著業(yè)務(wù)的快速發(fā)展我們?nèi)粘S龅降南到y(tǒng)性能壓力問題也逐漸出現(xiàn),甚至在部分場合會遇到一些突發(fā)的營銷活動,會導(dǎo)致系統(tǒng)性能突然暴漲,可能導(dǎo)致我們系統(tǒng)的癱瘓档玻。最近幾年隨著電商的各種促銷活動,有一個詞也漸漸進(jìn)入我們眼簾--“全鏈路壓測”茫藏。全鏈路壓測被眾多互聯(lián)網(wǎng)公司的程序員定義為核武器误趴,傳統(tǒng)性能測試更多的是以事務(wù)為核心,更多的是由單個或者多個事務(wù)構(gòu)成業(yè)務(wù)場景進(jìn)行壓測务傲。那全鏈路壓測到底是什么凉当?一般指完全引入相關(guān)聯(lián)的系統(tǒng) 真實模擬線上硬件環(huán)境枣申,更多的是以請求為核心,完全模擬真實請求流量看杭,通過引流等方式進(jìn)行場景的模擬進(jìn)行壓測忠藤,更多的適用于業(yè)務(wù)鏈路較長的交易。
筆者以前只是一直聽說全鏈路壓測楼雹,但是并沒有真正經(jīng)歷過模孩,對全鏈路壓測的理解也不是很全面,前年在互聯(lián)網(wǎng)電商公司雙11的時候參加過一次全鏈路的壓測贮缅,當(dāng)時全公司第一次做大范圍的全鏈路壓測瓜贾,整個架構(gòu)部也是第一次牽頭來完成了整個全鏈路壓測,經(jīng)過大家1個月的努力携悯,最后在活動期間完全扛住了壓力,并且還有性能過剩筷笨。當(dāng)時做完后因為忙的太累憔鬼,沒有進(jìn)行過總結(jié),最近新的公司正好在壓測胃夏,借此也總結(jié)下全鏈路壓測轴或。
1. 為什么需要全鏈路壓測
我們在整個業(yè)務(wù)流程中,最大的困難在于評估從用戶登錄到完成全部交易的整個鏈條中仰禀,核心頁面和交易關(guān)鍵交易的實際承載能力照雁。如果得到了各個系統(tǒng)的實際承載能力,就可以在路由網(wǎng)關(guān)進(jìn)行相關(guān)交易限流控制答恶,來防止在大并發(fā)來了以后系統(tǒng)出現(xiàn)宕機饺蚊,我們都知道一旦系統(tǒng)宕機就會導(dǎo)致災(zāi)難性的后果,而且就算運維短時間重啟了起來恢復(fù)了運行悬嗓,但是可能過了一會兒過程系統(tǒng)承載量又出現(xiàn)宕機污呼,早期阿里在雙十一的時候就發(fā)生過這樣的問題,系統(tǒng)在0點包竹,出現(xiàn)大面積癱瘓燕酷,重啟后又癱瘓,為什么會出現(xiàn)這個問題周瞎,就是因為大家對整個全交易鏈條上的各個環(huán)節(jié)的系統(tǒng)承壓能力不清楚苗缩,所以在出現(xiàn)了全鏈路壓測,一方面能夠讓各個產(chǎn)品知道自己的承壓極限在哪声诸?有的同學(xué)會問了通過單系統(tǒng)壓測不是也可以知道各個系統(tǒng)的承壓能力嗎捌显?但是實際情況不可能那么簡單痪欲,那么順利,在活動開始的瞬間叶眉,從CDN、網(wǎng)關(guān)接入矫夯、前端、緩存、中間件宫纬、后端服務(wù)、數(shù)據(jù)庫整個交易鏈路都會面臨巨大的訪問壓力膏萧,這個時候系統(tǒng)服務(wù)除了受自生的影響漓骚,還依賴于其他關(guān)聯(lián)系統(tǒng)的情況,并且影響會一直蔓延榛泛,只要有一個節(jié)點出現(xiàn)故障蝌蹂,那么故障在上下游系統(tǒng)經(jīng)過層層累加后會造成的影響誰都說不清楚,所以最好的辦法就是模擬完全的真實情況來做到提前心里有數(shù)曹锨。驗證的最好辦法就是讓事件提前發(fā)生孤个,通過全鏈路壓測就可以提早發(fā)現(xiàn)問題。
另一方面也可以讓各個系統(tǒng)能夠有個明確的優(yōu)化目標(biāo)并找出性能瓶頸沛简,同時對于一些特殊環(huán)節(jié)可以通過臨時增加公有云的方式來提高整體的性能齐鲤,一旦通過全鏈路壓測,了解了瓶頸所在就可以坦然的去按照壓測指標(biāo)去申請公有云資源椒楣,活動結(jié)束后再歸還資源给郊,這樣做到成本最低化。
2.? 全鏈路壓測常常遇到的問題
如何開展全鏈路壓測捧灰?在說這個問題前淆九,我們先考慮下,全鏈路壓測有哪些問題比較難解決毛俏。
1)涉及的系統(tǒng)太多炭庙,牽扯的開發(fā)人員太多;
在壓測過程中煌寇,做一個全鏈路的壓測一般會涉及到大量的系統(tǒng)煤搜,在整個壓測過程中,光各個產(chǎn)品的人員協(xié)調(diào)就是一個比較大的工程唧席,牽扯到太多的產(chǎn)品經(jīng)理和開發(fā)人員擦盾,如果公司對全鏈路壓測早期沒有足夠的重視,那么這個壓測工作是非常難開展的淌哟。
2)模擬的測試數(shù)據(jù)和訪問流量不真實迹卢;
在壓測過程中經(jīng)常會遇到壓測后得到的數(shù)據(jù)不準(zhǔn)確的問題,這就使得壓測出的數(shù)據(jù)參考性不強徒仓,為什么會產(chǎn)生這樣的問題腐碱?主要就是因為壓測的環(huán)境可能和生成環(huán)境存在誤差、參數(shù)存在不一樣的地方、測試數(shù)據(jù)存在不一樣的地方這些因素綜合起來導(dǎo)致測試結(jié)果的不可信症见。
3)壓測生產(chǎn)數(shù)據(jù)未隔離喂走,影響生產(chǎn)環(huán)境;
在全鏈路壓測過程中谋作,壓測數(shù)據(jù)可能會影響到生產(chǎn)環(huán)境的真實數(shù)據(jù)芋肠,舉個例子,電商系統(tǒng)在生產(chǎn)環(huán)境進(jìn)行全鏈路壓測的時候可能會有很多壓測模擬用戶去下單遵蚜,如果不做處理帖池,直接下單的話會導(dǎo)致系統(tǒng)一下子會產(chǎn)生很多廢訂單,從而影響到庫存和生產(chǎn)訂單數(shù)據(jù)吭净,影響到日常的正常運營睡汹。
3. 如何開展全鏈路壓測
其實進(jìn)行全鏈路壓測對于整個公司技術(shù)要求還是很高的,如果沒有一定能力的公司最好不要貿(mào)然嘗試全鏈路壓測寂殉,因為如果沒做好可能會把生產(chǎn)環(huán)境搞宕囚巴,所以對于沒有一定科技能力的公司還是盡量不要貿(mào)然追潮流實施全鏈路壓測。對于科技能力不強的公司如果也想達(dá)到全鏈路壓測那該怎么辦友扰?其實辦法也很簡單彤叉,可以在壓測環(huán)境進(jìn)行模擬,做一個比例模擬焕檬,模擬1%-2%的訪問量在測試環(huán)境進(jìn)行壓測,得到數(shù)據(jù)后乘以對應(yīng)的倍數(shù)來得到總的壓測指標(biāo)澳泵,這里的比例當(dāng)然不是簡單的倍數(shù)相乘实愚,需要各個系統(tǒng)得到系統(tǒng)線性擴(kuò)展和單機壓測指標(biāo)的一個線性值,因為一般來說的線性擴(kuò)展都不可能是100%的兔辅,一定會有一定擴(kuò)展后的損失腊敲。
1)分析需壓測業(yè)務(wù)場景涉及系統(tǒng)
在壓測前我們一定要首先分析清楚需要壓測的業(yè)務(wù)場景,只有分析清楚了業(yè)務(wù)場景才能梳理出來涉及的相關(guān)系統(tǒng)维苔,分析清楚后也可以更快的找到性能瓶頸進(jìn)行系統(tǒng)優(yōu)化碰辅。這個工作一般是由架構(gòu)師來梳理并確認(rèn)涉及的相關(guān)系統(tǒng),梳理清楚后就可以反饋給總壓測負(fù)責(zé)人進(jìn)行人員和資源的協(xié)調(diào)了介时。
2)協(xié)調(diào)各個壓測系統(tǒng)資源
在全鏈路壓測過程中没宾,最難的工作其實不是系統(tǒng)優(yōu)化、壓測環(huán)境搭建等技術(shù)工作沸柔,最難的是壓測資源的協(xié)調(diào)工作循衰。這里的資源不單單指壓測硬件、公有云等資源褐澎,還包括了人力資源会钝,在整個壓測過程中,需要各個相關(guān)產(chǎn)品的產(chǎn)品經(jīng)理和技術(shù)開發(fā)人人員參與進(jìn)去工三,這個工作可能不是架構(gòu)師或者一個牽頭產(chǎn)品的負(fù)責(zé)人能夠協(xié)調(diào)的動的迁酸,必須要有一個自上而下的推力去推動先鱼,需要一個有一定級別的領(lǐng)導(dǎo)做背書,我們當(dāng)時是分管科技的老總召集了所有的產(chǎn)品經(jīng)理和各個產(chǎn)品技術(shù)開發(fā)負(fù)責(zé)人開了一個全鏈路壓測的方案討論會奸鬓,這個會一方面說明了這個事情的重要性焙畔,讓各個產(chǎn)品都當(dāng)場立下軍令狀,并且安排出支持的人員全蝶,同時也授權(quán)給壓測負(fù)責(zé)人闹蒜。這個搞定以后壓測負(fù)責(zé)人后續(xù)就可以光明正大的協(xié)調(diào)各個產(chǎn)品的配合人員了。
3)壓測環(huán)境
壓測環(huán)境也是個比較頭疼的問題抑淫,很多系統(tǒng)可能壓根就沒有壓測環(huán)境绷落,所以全鏈路壓測有個和傳統(tǒng)壓測比較大的區(qū)別就是,全鏈路壓測是在生產(chǎn)環(huán)境始苇,這種做法其實是存在一定風(fēng)險的砌烁,一方面是系統(tǒng)風(fēng)險,一方面是業(yè)務(wù)數(shù)據(jù)風(fēng)險催式。對于全鏈路壓測系統(tǒng)風(fēng)險一定是首要考慮的問題函喉,不能因為壓測把系統(tǒng)搞宕機影響到日常生產(chǎn)環(huán)境的正常運營,我們當(dāng)時做的電商系統(tǒng)還好荣月,不涉及相關(guān)的監(jiān)管管呵。但是在銀行業(yè)這樣做還是有很大的風(fēng)險的,一旦生產(chǎn)系統(tǒng)出現(xiàn)關(guān)鍵交易系統(tǒng)的宕機可能導(dǎo)致一些金融事故哺窄,會對金融市場造成恐慌捐下,而且會被銀監(jiān)會通報,所以銀行的壓測還是不要進(jìn)行全鏈路壓測萌业,不過可以在測試環(huán)境盡量仿真的模擬全鏈路壓測坷襟。
前年在電商環(huán)境上做全鏈路壓測直接在生產(chǎn)上進(jìn)行壓測,用生產(chǎn)環(huán)境最大的好處就是環(huán)境的真實性生年,通過生產(chǎn)環(huán)境能夠最高程度的還原生產(chǎn)環(huán)境不用額外準(zhǔn)備壓測環(huán)境婴程。但是使用生產(chǎn)環(huán)境進(jìn)行壓測需要考慮將請求和訪問、業(yè)務(wù)數(shù)據(jù)處理都進(jìn)行隔離抱婉,防止影響到生產(chǎn)環(huán)境档叔,具體如何實施,涉及到比較多的細(xì)節(jié)這里就不詳細(xì)描述了蒸绩《灼眩總的思路就是在發(fā)起請求的時候通過請求報文頭中的壓測標(biāo)示來進(jìn)行區(qū)分處理,將壓測的流量都分流到指定的應(yīng)用服務(wù)器和指定的存儲進(jìn)行數(shù)據(jù)保存和處理侵贵。
進(jìn)行全鏈路壓測的時候届搁,為了防止系統(tǒng)崩潰,可以選擇在凌晨用戶量最小的時候進(jìn)行,這樣就算發(fā)生故障也可以將影響降到最低卡睦。
4)壓測數(shù)據(jù)
環(huán)境準(zhǔn)備好了宴胧,可能就需要考慮造壓測數(shù)據(jù)了,壓測數(shù)據(jù)準(zhǔn)備有兩方面數(shù)據(jù)需要準(zhǔn)備表锻,一方面是壓測請求數(shù)據(jù)的準(zhǔn)備恕齐,需要模擬請求數(shù)據(jù),請求數(shù)據(jù)最好的辦法就是采用生產(chǎn)的真實數(shù)據(jù)瞬逊,我們當(dāng)時的做法是直接錄制3-5天的生產(chǎn)訪問請求流量显歧,只需要對錄制的請求進(jìn)行數(shù)據(jù)清洗就可以了,將某個用戶的請求替換成一個壓測虛擬用戶的請求确镊,請求的商品也替換成壓測虛擬商品士骤,這個數(shù)據(jù)漂白替換的工作是比較復(fù)雜的,對于做數(shù)據(jù)漂白的的同學(xué)對系統(tǒng)的接口非常了解蕾域,否則很可能造成業(yè)務(wù)數(shù)據(jù)的混亂拷肌,造成大量的業(yè)務(wù)報表和系統(tǒng)數(shù)據(jù)的臟數(shù)據(jù);另一方面是測試數(shù)據(jù)的準(zhǔn)備旨巷,我們當(dāng)時準(zhǔn)備了壓測虛擬商品的數(shù)據(jù)巨缘、虛擬商品庫存數(shù)據(jù)、虛擬供貨商采呐、虛擬用戶若锁。
5)壓測數(shù)據(jù)隔離
因為是在生產(chǎn)環(huán)境做的壓測,壓測數(shù)據(jù)需要與正常的業(yè)務(wù)數(shù)據(jù)隔離開斧吐,我們當(dāng)時的方案是對于壓測的這些臟數(shù)據(jù)都做了特定標(biāo)示又固,對于虛擬用戶、虛擬商品会通、虛擬訂單口予、虛擬庫存都是有特殊標(biāo)示的娄周,這樣這類數(shù)據(jù)在統(tǒng)計的時候都不會進(jìn)行統(tǒng)計涕侈,在壓測后也會對這些數(shù)據(jù)進(jìn)行清理,防止污染正常業(yè)務(wù)數(shù)據(jù)煤辨。
6)壓測數(shù)據(jù)實時監(jiān)控
在壓測過程中裳涛,為了能發(fā)現(xiàn)性能問題,我們需要對壓測過程中各個系統(tǒng)的cpu众辨、內(nèi)存端三、磁盤io都進(jìn)行系統(tǒng)層面的監(jiān)控,同時也需要對各個業(yè)務(wù)節(jié)點的耗時進(jìn)行監(jiān)控鹃彻,一方面從業(yè)務(wù)層面去監(jiān)控壓測事務(wù)性能郊闯,另一方面從系統(tǒng)層面監(jiān)控,這樣我們可以先從業(yè)務(wù)層面找到性能瓶頸,再單獨分析各個系統(tǒng)的系統(tǒng)層面的瓶頸团赁,最終找到優(yōu)化方案育拨。
我們當(dāng)時公司內(nèi)部有個實時監(jiān)控平臺,這個平臺是基于大眾點評開源的cat實現(xiàn)的多平臺監(jiān)控系統(tǒng)欢摄,能夠?qū)崟r監(jiān)控各個系統(tǒng)的實時交易運行情況熬丧,這樣能夠在第一時間發(fā)現(xiàn)遇到大流量的情況后,性能瓶頸在哪怀挠?然后進(jìn)行針對性的優(yōu)化析蝴。
4. 全鏈路壓測優(yōu)化思路
性能優(yōu)化的核心在我看來其實就是一個充分利用系統(tǒng)資源并平衡IO的過程。這句話怎么理解绿淋,首先在保證代碼沒有問題的情況下闷畸,充分利用系統(tǒng)的cpu、內(nèi)存躬它、磁盤資源腾啥,一般來說在保證cpu、內(nèi)存都消耗到80%以上基本上就達(dá)到了性能峰值了冯吓,但是我們在壓測過程中常常遇到的問題是cpu倘待、內(nèi)存消耗都不高,而是卡在了IO上组贺,IO包括了磁盤IO凸舵、數(shù)據(jù)庫IO、網(wǎng)絡(luò)IO失尖,我們需要根據(jù)監(jiān)控的數(shù)據(jù)從這3方面去找到瓶頸啊奄,并去解決IO的問題。一般來說造成這種情況一般都是因為IO聚集導(dǎo)致了阻塞掀潮,可以考慮采用緩存菇夸、異步的方式去解決,對于一些關(guān)鍵交易的事務(wù)的完整性可以考慮采用先緩存最后通過緩存同步數(shù)據(jù)庫的方式來保證最終一致性仪吧。
全鏈路壓測一般可以從3個層面去進(jìn)行優(yōu)化:
1)優(yōu)化單個系統(tǒng)性能
就算不進(jìn)行全鏈路壓測庄新,單個系統(tǒng)的性能優(yōu)化也是要考慮的問題,對單個系統(tǒng)的優(yōu)化薯鼠,其實方法有很多择诈,但是萬變不離其宗,就是在壓測過程中監(jiān)控系統(tǒng)各項指標(biāo)出皇,從中挑出慢交易羞芍,針對慢交易進(jìn)行優(yōu)化,對于聯(lián)機系統(tǒng)大部分都是因為各種IO問題導(dǎo)致性能上不去郊艘『煽疲可以根據(jù)各種介質(zhì)IO訪問的性能來優(yōu)化(內(nèi)存緩存>文件>數(shù)據(jù)庫>網(wǎng)絡(luò))唯咬,基本上通過緩存和異步處理這兩顆銀彈就可以解決80%的性能問題。
當(dāng)鏈路上的單個系統(tǒng)性能提升了畏浆,整體的全鏈路性能自然就提升了副渴。
2)優(yōu)化關(guān)聯(lián)路徑
但是在優(yōu)化的過程中,我們常常發(fā)現(xiàn)絕大部分系統(tǒng)性能都很高全度,但是總的TPS還是很低煮剧,這就需要去根據(jù)監(jiān)控了解下目前整個鏈路上的性能瓶頸到底在哪?通過全鏈路監(jiān)控可以發(fā)現(xiàn)整個業(yè)務(wù)流程在哪個節(jié)點耗時最長将鸵,那么這個耗時最長的節(jié)點就是我們需要優(yōu)化的地方勉盅,只要這些關(guān)鍵路徑的性能提升上來以后整體的性能就上來了。關(guān)鍵節(jié)點的優(yōu)化方式和單系統(tǒng)優(yōu)化思路一致顶掉。
3)優(yōu)化業(yè)務(wù)流程
很多開發(fā)人員都會將優(yōu)化思路集中在技術(shù)層面草娜,但是很多時候從業(yè)務(wù)流程上進(jìn)行優(yōu)化效果可能更好,而且提升的效果會非常明顯痒筒。業(yè)務(wù)層面的優(yōu)化主要是從分散IO的角度去考慮宰闰,將實際業(yè)務(wù)場景中的用戶請求進(jìn)行分散,例如常見的大秒系統(tǒng)簿透、驗證碼系統(tǒng)移袍、游戲工具等都是為了進(jìn)行業(yè)務(wù)層面的IO分散來保證。這類業(yè)務(wù)流程的優(yōu)化首先要梳理清楚整個業(yè)務(wù)流程老充,包括所有的細(xì)節(jié)葡盗。然后針對每個環(huán)節(jié)在保證用戶體驗的情況下分散用戶請求,這樣可以最大限度的保證體驗啡浊。
總結(jié)
整個壓測優(yōu)化過程就是一個不斷優(yōu)化不斷改進(jìn)的過程觅够,通過長期的循序漸進(jìn)的改進(jìn)不斷發(fā)現(xiàn)問題,優(yōu)化系統(tǒng)巷嚣,才能讓系統(tǒng)的穩(wěn)定性和性能都得到質(zhì)的提升喘先。整個壓測優(yōu)化的思路其實和高并發(fā)架構(gòu)設(shè)計的思路是一致的,接下來也會寫一些關(guān)于高并發(fā)架構(gòu)的文章廷粒,本篇的全鏈路壓測只是給大家做個入門介紹窘拯,其中涉及到的問題遠(yuǎn)遠(yuǎn)不止文中提到的這些,而且問題的解決辦法也遠(yuǎn)遠(yuǎn)不是說的那么簡單评雌,造虛擬用戶树枫、虛擬商品并不是隨便造的直焙,數(shù)據(jù)隔離也不是簡單加個前綴什么的就可以的景东,也是有很多講究的,因為全鏈路壓測涉及到的內(nèi)容太多而且還涉及到各家公司的組織架構(gòu)奔誓,所以這里就不展開了斤吐,只是給大家一個思路搔涝,按照這個思路結(jié)合自己公司的情況去實施,慢慢摸索總結(jié)出一套適合自己產(chǎn)品的全鏈路壓測和措。
作者:monkey01
鏈接:http://www.reibang.com/p/27060fd61f72
來源:簡書
簡書著作權(quán)歸作者所有庄呈,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。