大家好,我是李哥。
進阿里以來一直聽說一句話:“沒有經過雙11峰值驗證過的技術都是玩具”。雖然有些誇張,但是不可否認的是,一年一度的雙11,是技術最好的孵化器,也是技術同學最嚮往的閱兵場。
上篇我們以全域性的視角聊完了大促:《面試官:如果你是大促技術負責人》。
接下來我們便開始展開技術細節。
今天主要聊一聊:
壓測
。
什麼是壓測?
全鏈路壓測是以全鏈路業務模型為基礎,將前端系統、後端應用、中間適配層、DB等整個系統環境,完整得納入到壓測範圍中,以http請求為載體,模擬真實的使用者行為,在線上構造出真實的超大規模的訪問流量,以全鏈路壓測模型施壓,直至達到目標峰值,在壓測過程中發現系統瓶頸和驗證系統能力。
全鏈路壓測(Loadcenter)為企業提供涵蓋效能壓測、壓測報告輸出以及壓測風險防控的一站式壓測服務。結合公司多年的線上全鏈路壓測經驗,歷經幾代產品打磨,為您提供高模擬、低成本、高風險識別的線上壓測體驗。
全鏈路壓測支援模板化和自定義兩種指令碼模式,為您提供靈活、開放的指令碼框架,滿足不同複雜度的壓測需求。另外,該產品還具備自動化壓測報告輸出、效能基線分析、壓測風險防控等業界領先的壓測技術能力。
使用全鏈路壓測能夠幫助您發現業務系統的效能問題,為企業的系統性能評估、容量規劃、效能基線跟蹤等提供有力的平臺支撐。
為什麼要做壓測?
1、
瞭解你的系統
系統所能承受最大的壓力是什麼?
當前系統叢集的瓶頸是什麼?
系統的核心服務的最大QPS/TPS分別是多少?
核心鏈路的下游最大QPS/TPS是多少?
當服務在最大QPS/TPS水位線的時候,此時CPU的使用率是多少?磁碟的使用率是多少?
單機最大QPS/TPS是多少?叢集最大QPS/TPS是多少?
……
2、
保護你的系統
,
最佳化你的系統
,
保護下游系統
在《瞭解你的系統》後,你發現你的系統到處都是問題,比如:
壓測發現無效的日誌打太多導致日誌檔案實在是太大了
怎麼一個介面進行了好幾次序列化與反序列化,實在是太浪費cpu了
平時不會出問題的地方,出現了併發問題
發現下游口頭提供了1000qps,實際上壓測發現就200qps
……
誰去做壓測?
一般由:
系統owner
或某專案的技術同學owner或同項目組的技術同學
或大促活動參與者負責壓測模組的技術同學
……
什麼時候做壓測?
一般有:
大促前技術保障
日常壓測,效能最佳化,摸高
新專案上線,介面壓測,效能探索
……
如何做壓測?
這部分有點東西,請讓我們倒一杯咖啡,慢慢聊。
1、瞭解整體流程
全鏈路壓測的整體流程包含系統改造、資料遷移、模型構建和施壓四個核心部分。
1。1、系統改造
系統改造的目的是:
讓壓測流量可以暢通無阻地走通整條鏈路。
(1)中介軟體升級到支援壓測標傳遞的版本,當前版本已都支援壓測標傳遞;
(2)部分安全邏輯繞過,壓測過程中URL會重複執行多次,針對csrf校驗等操作,對壓測流量繞過
(3)非同步執行緒切換導致的丟標改造,非同步執行緒切換時,上下文會丟掉,壓測標也會隨著上下文的丟失而丟失,因此需要在多執行緒切換中,將執行緒的上下文複製過去,保持壓測標傳遞下去
(4)影子表構建,在DB的庫表同步中執行影子表同步即可
1。2、資料遷移
資料遷移是為了將資料從線上表遷移到影子表中,一般首先遷移的是基礎資料及其關聯資訊,比如使用者資料,交易資料等,交易中是買家、賣家、商品這三者以及三者的關聯,具體遷移分為三步:
(1)資料遷移:將資料從線上表中讀出,寫入到影子表中
(2)資料關聯:被遷移資料,將其表中各個欄位資料關聯的其它表中的資料也要同步遷移,保障其資料的完整性
(3)資料脫敏:為防止影子資料汙染線上資料並保護線上資料安全,會對資料進行脫敏,脫敏的原理是在線上的資料上加上一個很大的值(線上資料增加N年也趕不上的值),總之,這樣做的目的是資料隔離,讓真實資料與壓測資料徹底隔離。
1。3、模型構建
模型構建的目的,主要是結合業務,設計預測出大促壓測模型,然後按照壓測模型組織壓測資料,構建出可執行的壓測流量。模型構建分為兩部分:模型設計和流量構建。
模型設計:模型設計的目的主要是將業務進行採集並抽象成可執行的壓測模型,並對各個子模型中的元素進行預測和設計,最終產生可以執行的壓測模型,模型預測和設計的過程如下圖所示。
流量構建:流量構建的過程就是將影子資料按照不同的業務規則進行構建,其中包含優惠、資金、限購、購物車新增、URL構建等,最終的體現是包含各個業務屬性的url集合,配置上設定的QPS,形成壓測方案。
1。4、施壓
壓測控制和操作在壓測控制檯上執行,壓測控制檯上管理了很多的施壓引擎,可提供千萬級的壓測能力,將壓測方案推送至壓測控制檯後,壓測控臺會為壓測方案進行分配壓測引擎、上傳資料、登入、施壓操作,在壓測過程中可自由調節壓測量級,靈活方便,準確高效。
施壓過程中請持續關注系統告警!觀察系統資源使用情況!出現問題請立即執行預案!
2、瞭解壓測執行流程
全鏈路壓測執行的過程,主要分為以下5個步驟:
壓測方案配置
預跑
預熱
正式壓測
壓測結果
2。1、壓測方案配置
壓測模型資料構建好後,會給模型中的各個場景按照大促目標配置好QPS,然後推送到壓測平臺,進行資料上傳。
你需要知道:
為什麼壓測
需要多少壓力機資源
壓哪些系統,哪些介面
單壓還是混壓
當前是多少
預期目標是多少
壓測過程中出現問題是否有預案
壓測策略(逐步加壓、脈衝、併發量等)
……
2。2、預跑
預跑一般安排在正式壓測前1~2天,按照模型的小比例壓測,主要目的是驗證模型資料的準確性和當前環境的可用性。
2。3、預熱
預熱的目的是將當前系統中的本地快取、分散式快取、DB快取等預熱到大促態,同時為防止核心應用在流量脈衝進來時,程式碼還沒有編譯,需要提前進行jit預熱,預熱的最終效果是讓應用的各級快取達到熱的狀態,在大促脈衝的瞬間快取能穩定執行。
2。4、正式壓測
正式壓測當天,會按照大促當天進行演練,全天無壓測執行,0點脈衝前一個小時執行提前批預案,而後在按照壓測策略執行壓測,一般會分為下面幾步:
1、0點脈衝:系統保持大促態,完全模擬大促峰值流量,0點脈衝值大促目標值,觀察各個系統表現
2、摸高:放開限流,將壓力抬高當前目標峰值的10%~20%,觀察系統的極限值,如果在這個範圍內還穩定,可以繼續往上加壓,一直到有系統扛不住為止
3、限流驗證:在摸高達到最高狀態後,生效限流,限制會大促目標峰值,檢視流量是否準確回到限流值,驗證限流效果
4、破壞性測試:在該階段,維持大促態峰值壓測,各業務系統執行其緊急預案,觀察這些預案對系統性能影響
2。5、壓測結果
整個壓測結束後,會組織各系統核心成員,進行壓測覆盤,講述當前系統中的瓶頸並給出後續修復計劃,所有系統瓶頸及其後續計劃覆盤完成後,將各個系統資料以及系統瓶頸彙總成壓測報告。
3、影子表執行原理
要在線上實現壓測,必回涉及到資料的讀寫,如果使用線上資料壓測,總會造成資料汙染,為避免該問題,引入影子體系,將壓測資料和線上資料隔離,並使壓測資料走的業務路徑和線上資料一致,保持壓測的有效性和真實性。
如上圖所示,透過壓測標t=1,實現了壓測流量和線上流量的區分,影子標t=1透過URL中的biz_loadtest=1對映而來,然後附著在上下文中,在各個中介軟體中實現傳遞,最終落庫時,透過DB Proxy的判斷讀寫到影子表中。
總結
壓測,就像一袋袋沙袋堆積在一個正在行走打工人的肩上。沙袋就是流量模型,逐漸施壓,一袋兩袋三袋……,施壓的過程中你要持續觀察這個打工人的身體狀況怎麼樣,到底是肩膀先扛不住?還是腰部先扛不住?還是腿部先受不了?一旦他喊疼,你就要立即卸下這些沙袋,否則可能會影響他走路,也可能會讓他摔倒。
好了,今天我們就暫時先到這裡了,明天我們換個地方,接著大促這篇聊:
限流
。敬請期待!感謝閱讀~感謝關注~