全鏈路壓測第一次實踐
- 2019 年 12 月 2 日
- 筆記
每年雙十一,對買家來說是一場買買買的剁手之旅,但對於電商公司的技術人員來說,卻是一次嚴峻的技術期末考。如何保證系統在預估的流量洪峰來臨時,既能保證用戶的買買買不受影響,
促進業務及營銷活動的目標達成,又能用儘可能少的成本投入保障系統的穩定可用性,是技術童鞋必須面對的挑戰。我司在雙十一來臨的最後關口完成了整個核心鏈路的全鏈路壓測,
大幅提高了核心鏈路的服務性能,並發布了最終優化版本。在雙十一期間,也取得了一定的成果,期間包括技術、運營、產品、行政等各部門都為之付出了很多努力。
下面的內容,是從啟動到雙十一這段時間,我們在雙十一項目上所做的關於全鏈路壓測的一些實踐。
一、面臨的挑戰
從項目kickoff到雙十一活動開始,第一次雙十一大促,我們面臨著巨大的挑戰。
挑戰一:核心鏈路梳理
電商業務本身比較複雜,且當前階段我們微服務架構下,各個服務間依賴高,調用關係複雜,且沒有較為清晰的鏈路梳理,理論上來說,只有一部分系統才是核心鏈路。所以,面臨的第一個挑戰,就是從錯綜複雜的系統中梳理出核心業務鏈路。
挑戰二:環境成本高昂
按照業內的實踐經驗和方案,全鏈路壓測都是在生產環境進行,這樣測試的結果才能更貼近實際的生產場景。但由於我們是第一次進行全鏈路壓測,因此只能選擇折中方案——按照生產環境當前的配置,搭建一套等配鏡像環境。鏡像環境從資源準備到服務部署聯調都比較耗時,且成本高昂,這逼迫我們必須拿到更好的結果,才能提高ROI。
挑戰三:流量評估困難
為了儘可能使壓測場景更貼近真實的生產場景,需要對核心鏈路的流量模型進行比較準確的評估和模型確認。由於各服務間依賴較高,且調用關係複雜,這對我們提出了新的挑戰——如何評估出更接近真實場景的流量模型。
挑戰四:任務多線開展
從雙十一啟動到結束,需要同時開展的任務較多。比如服務拆分、耦合任務遷移、DB&Redis垂直拆分、正常版本迭代、全鏈路壓測及性能優化,以及新的業務線不斷拓展,這些都是我們需要面對並且克服的困難。
二、壓測的過程
啟動階段
1、任務規劃
項目kickoff後,在技術負責人牽頭下迅速確定了本次雙十一大促的TODO項。主要是如下幾項:
前端:降級點確認、容錯保護、監控數據接入;
後端:核心鏈路梳理、監控&服務保護接入、專項預案、
測試:資源準備、壓測模型梳理、壓測方案、全鏈路壓測、預案演練、線上功能驗證;
基礎架構:架構優化、網關替換、DB垂直拆分、基礎設施接入(鏈路追蹤、監控、報警……);
資源保障:容量規劃、鏡像環境搭建、服務部署聯調、線上擴容;
2、估時排期
確認任務規劃後,各個技術團隊迅速組織協調資源投入了各自的工作。由於雙十一迫在眉睫,且待辦事項較多,故按照時間進行任務估時倒排。
準備階段
準備階段,按照任務規劃拆解出來的細化任務進行同步開展,下面是準備階段我們開展的主要事項。
1、核心鏈路梳理
各業務研發團隊的owner對我們目前的核心業務鏈路進行了梳理,主要包括:首頁、商品、訂單、支付、用戶、風控、優惠券、大促活動、基礎服務。下面為示意圖表:

2、鏡像環境準備
由於本次壓測是在和生產等配的鏡像環境進行,相當於從零開始搭建一套環境,無論是資源準備、服務部署還是服務聯調驗證,都耗費了較多的時間,從中也發現了我們之前的一些不足,累積了很多經驗。
3、壓測任務排期
根據大促任務規劃,性能測試同學從中拆解出了較為詳細的壓測任務,並進行排期,同時積極主動的推動了整個壓測任務的開展實施。
4、專項預案溝通
專項預案主要包括如下幾項:限流、降級、熔斷、脈衝、破壞性驗證五種場景。在服務治理這一項,基礎架構的同學接入了sentinel進行相關管理。
5、大促指標溝通
為保證壓測流量和生產預估流量對齊,由技術負責人牽頭,和運營產品同學進行了多次溝通,確認了本次雙十一大促活動相關的活動場次、時間段、優惠券投放量、預估DAU等相關關鍵指標。
6、壓測模型梳理
壓測模型的梳理,主要包括核心業務鏈路的優先順序、調用依賴關係、流量模型轉化(漏斗模型)等,限於保密措施,這裡不過多介紹。
7、流量模型梳理
關於流量模型,建議梳理出核心交易鏈路對應的依賴大圖,並粗估雙十一峰值數據,作為接下來壓測、性能優化的技術目標。
8、線上容量評估
為了在壓測開展前對目前線上的服務容量有一個初步的了解,需要對各個核心服務、消息隊列、快取以及DB的容量進行了梳理匯總。
9、線上鏈路監控
監控就是我們的眼睛,有了監控,才能快速發現問題並定位修復問題。這一點,基礎架構的同學為此做了很多工作。比如:鏈路追蹤監控的Cat、可視化監控大盤Grafana以及更多的監控組件。
10、壓測數據準備
為了儘可能保證壓測數據的真實性,我們的解決方案是複製生產庫的數據,進行脫敏和可用性驗證,用來做壓測的基礎數據。在數據脫敏和可用性驗證這點需要高度重視。
11、資損防控梳理
由於現在雙十一大促活動主要玩法都是優惠券以及滿減相關,且涉及到訂單支付業務,因此資損防控也是準備階段的重中之重。
12、確定性能水位
為了精確測定各服務單機的水位性能,並留存一定的buffer作為流量高峰時刻的緩衝,結合業內經驗和我們當前的系統情況,最終確定以單機40%的水位性能作為線上擴容和容量規劃的驗收標準。
13、輸出測試方案
前期做了相當多的準備工作,在正式開展全鏈路壓測之前,性能測試同學輸出了本次雙十一全鏈路壓測的測試方案,通過評審後,全鏈路壓測工作就可以正式開展。
實施階段
在全鏈路壓測實施階段,根據測試場景和採用的測試策略,我們主要進行了如下的工作。
1、單機單鏈路基準測試
在目前的微服務架構下,整體鏈路的性能瓶頸,取決於短板(木桶原理)。因此,單機單鏈路基準測試的目的,是在全鏈路壓測開始前進行性能摸底,定位排查鏈路瓶頸。
2、單機混合鏈路水位驗證
單機混合鏈路壓測的目的,是排查上下游調用依賴的瓶頸,並以此測試結果作為限流預案的基準值。
3、全鏈路壓測演練
全鏈路壓測作為備戰雙十一的重中之重,是今年雙十一大促項目的基礎保障。在整個實施階段,需要不斷的壓測,排查定位分析問題並進行優化,對最終的線上發布和容量規劃提供了支援。
4、專項演練
專項演練主要是針對服務限流降級熔斷以及高可用、服務擴容進行驗證。進行演練的目主要如下:
①、驗證預案是否生效;
②、針對預案設定閾值進行測試調優;
③、驗證預案生效時服務本身的性能表現;
④、針對上述專項場景進行實戰演練;
5、穩定性測試
穩定性測試的目的,是驗證系統處於負載情況下,能否長時間提供穩定可用的服務能力。
6、每日問題復盤
在備戰雙十一期間,會針對每天壓測發現的問題進行復盤追蹤,儘可能讓性能問題及時解決。
發布階段
經過閉關作戰半個月,針對我們的核心業務鏈路,進行了多輪的壓測和性能優化,各系統qps已經基本達到了預定的目標(等比例),TPS整體提升3倍以上。
在雙十一峰值流量期來臨之前,做最終的線上擴容和優化版本發布。針對雙十一,我們還做了預案的梳理並提前執行、服務降級、快取預熱、job任務降級錯峰處理。
三、收穫與思考
整個過程中,大部分同學都是沒有全鏈路壓測實戰經驗的,但每個人都迸發出了巨大的能量。整個過程中發現了很多存在的問題,但還是有很多是值得改進的地方,比如:
時間緊促,留給性能瓶頸定位和優化的時間太少,後續可以考慮測試左移;
對一些問題定位排查工具的使用姿勢應該熟練,對流量的預估應該更加準確;
項目的推進方面得積極主動,大家都應該有owner意識;
總之,生產的穩定性是服務的基石,尤其對我們性能來說穩定壓倒一切!
四、未來的規劃
為了保障明年的618大促、雙11大促,同時為了應對業務快速發展,訪問流量的劇增,我們已經開展了全鏈路壓測平台的建設工作,後續技術團隊會不斷投入精力去完善整個全鏈路壓測平台和相關工作,希望可以將壓測變成:
輪詢化:線上鏈路測試機器人,實時監控,檢測生產服務;
常規化:減少人力成本投入;
日常化:儘可能白天完成壓測工作,畢竟熬夜不利於身體健康;
圖形化:鏈路壓測規劃圖形化展示,與業務結合,一鍵完成數據準備工作。