如何提升测试环境的稳定性?来看看阿里内部的实践总结
阿里妹導讀:測試環境是研發/測試同學最常用的功能,穩定性直接影響到研發效率,那如何提升測試環境的穩定性?阿里巴巴應用與基礎運維平臺高級開發工程師張勁,通過阿里內部實踐,總結了一套測試環境穩定性提升方法,供大家參考。
痛點
每一次容器申請失敗直接造成研發測試停滯, 同時帶來答疑及問題排查(程序猿最怕的就是在代碼寫得正嗨的時候被人給打斷,所以一般我都帶耳機),涉及到測試鏈路上各個系統。隨著集團pouch化的全面推進,半年來測試環境日容器申請量暴增10倍以上,低成功率導致研發低效的問題越來越凸顯,每天累計造成集團上百小時的研發測試停滯,損失不可接受,也漸漸成為了pouch化推進過程中的一個阻力。
因此, 測試環境穩定性亟待大幅提升。經過答疑匯總和錯誤分析,主要集中在兩個方面:
已成功申請的資源不可用
測試環境宿主機較差(過保機器),且虛擬比高,容易發生故障。
宿主機故障時,其上的容器不會被自動遷移,很可能導致再次部署重啟時失敗。
調度系統巡檢會將故障宿主機置為不可調度,由于其上仍有容器,不能下線修復后重用, 造成機器資源越來越少。
新申請資源時成功率低
測試環境機器被分為優先級不同的資源池,資源池間機器資源不共享。
測試環境機器的容量/余量不透明,沒有告警,造成因資源不足的調度失敗。
因為測試環境與線上環境有很大不同,資源調度系統之前沒有針對測試場景優化, 成功率不高。
目標
容器申請成功率:99.9%
方案
指標數據
從一開始我們就覺的數據非常重要,沒有相關的穩定性數據,那我們就無的放矢,根據數據我們就能找到需要優化的點以及持續優化的動力。所以項目開始階段就做了挺長時間的數據收集工作。
測試環境鏈路數據收集:從上至下包括Normandy(基礎應用運維平臺),黃蜂(資源申請平臺),Zeus(二層調度),Sigma(集團資源調度系統);其中我們最關心的就是最終容器交付的成功率,以及失敗case。失敗case可以幫助我們分析整個系統中到底哪些地方存在問題,成功率趨勢則幫助我們檢驗新的修復優化是否真的有效且穩定,也是最終成果的衡量指標。
測試環境鏈路穩定性數據展示平臺:其實上下游的每個系統都有自己的數據,但是沒有整合,有的用阿里表哥,有的是發郵件,有的則沒有展示出來,所以做這樣一個小東西的目的就是將上下游系統的數據統一整合在一個頁面上,更便于查看分析問題。
每日/周/月錯誤分析:收集每天的錯誤數量及樣例,便于分析問題。
已申請容器不可用
容器自動置換
容器自動置換是為了解決已申請的容器不可用問題,簡單來說就是在另一臺好的宿主機上擴一個新容器,然后將原來在故障宿主機上的舊容器下線。
整個流程如下:Sigma(資源調度系統)自動巡檢出故障宿主機(比如磁盤滿/硬件故障等),通知Atom(故障機替換)置換該故障宿主機上容器,Atom向Normandy(基礎應用運維平臺)發起機器置換流程。
通過自動置換將故障機騰空,然后下線修復。
新申請容器失敗
合理化資源池分配
屏蔽底層系統失敗
因為測試環境與線上環境差異很大,一般測試環境使用的機器都是線上淘汰機,同時為了節省預算,每臺宿主機的虛擬比都很高,導致在創建和使用容器時都特別容易失敗,所以有必要做一個容器buffer池屏蔽掉底層失敗對用戶的影響。
buffer池的整個邏輯非常簡單清晰:在測試環境容器生產鏈路靠近用戶的一端嵌入buffer池,預生產一批容器,在用戶需要的時候分配給他。即使申請buffer容器失敗,依然可以按原生產鏈路繼續生產容器。每次從buffer池申請一個容器后,buffer池會自動異步補充一個相同規格的容器進來,以維持buffer池的容量。
如何確定buffer哪些規格的容器及池子的容量是另一個關鍵點:需要統計每種規格-鏡像-資源池的歷史申請量,按比例分配每種buffer的容量。同時為了保證即使在底層系統中斷服務時,整個系統依然對用戶可用,還需要確定高峰期的容器申請量,可允許中斷時長以及測試環境機器資源, 用來確定整個buffer池子的容量。
還需要考慮的一點是,用戶也分為普通用戶(研發測試人員),系統用戶(比如自動化測試系統等),他們的優先級也不同,需要優先保證普通用戶可用。
同時為了最大程度的降低引入buffer池后可能對用戶造成的影響,buffer池內加了許多動態開關,用于及時屏蔽某些功能。比如可針對具體應用設置是否需要修改容器主機名,此操作非常耗時,如果不改主機名,則平均不到1秒內會申請成功;如果某個應用不想使用buffer,也可立即屏蔽;如果buffer池本身出現問題,可以快速降級,在整個鏈路中去掉buffer功能。
另外buffer池在交付buffer容器前會額外做一次檢查,判斷容器是否可用,避免容器交付后,因為容器不可用而導致的服務部署失敗,用戶使用不了等問題。buffer池內部也會定期清理臟容器(不可用, 數據不一致等)和補充新的buffer容器。
上圖展示測試環境最近2個月的容器申請成功率趨勢,包括buffer池全量前后一個月。
從圖中可以看到,11月末12月初的兩天成功率極低,均是因為調度失敗,之后根據資源池余量預測及報警及時調整了各個資源池的容量,提前消除了調度失敗的可能,在此之后,成功率波幅都減少很多。
另一點,從buffer全量后,成功率波幅明顯比buffer全量前大幅減小,波動次數明顯減少,成功率趨于穩定。
buffer池全量后的一周內,由于buffer池內部的bug以及buffer命中率較低,成功率浮動較大,在bug修復以及提高buffer池命中率后,成功率基本穩定。
上圖展示近兩個月的每日成功率趨勢圖,縱向對比了用戶視角(有buffer)與底層系統視角(無buffer)。從圖中可以看出,buffer池確實屏蔽了許多底層系統失敗,除了其中一天buffer池被穿透導致成功率大跌。
展望
雖然經過一系列改造優化后,成功率有了明顯的提升,但是依然有很多地方需要完善:
資源池容量自動調配:目前算法簡單,有些情況無法解決,比如大規模的新增或刪除容器造成對余量趨勢的誤判。另外也要避免引入自動調配后造成宿主機標簽的混亂。
buffer池模版動態的增減以及每種buffer的數量動態變化。當前buffer池一個難題就是如何覆蓋到低頻的應用鏡像,這種鏡像雖然低頻但是容易申請失敗,一旦這種容器大量申請,容易穿透buffer池,造成大量失敗。
擴大buffer池的容量,需要根據機器資源伸縮。
除了對以前工作的完善,測試環境依然有許多要做的事情:比如如何提高整個測試環境資源的利用率, 如何減少容器交付耗時(從用戶申請到用戶可用),如何推動應用的可調度化等等,希望能夠和大家一起探討。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的如何提升测试环境的稳定性?来看看阿里内部的实践总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《阿里巴巴Android开发手册》正式发
- 下一篇: 如何实现32.5万笔/秒的交易峰值?阿里