羊麟威,李 靜,饒涵宇,高 穎,毛 冬,喬宇杰
(1.南京航空航天大學 計算機科學與技術學院,江蘇 南京 211106;2.國網浙江省電力有限公司 信息通信分公司,浙江 杭州 310016;3.國家電網有限公司 信息通信分公司,北京 100761)
隨著云計算、移動計算等不同計算方式的出現,微服務架構[1]成為軟件服務設計、開發(fā)和交付的最新趨勢,越來越多的互聯網企業(yè)采用微服務架構開發(fā)、部署分布式應用軟件。例如,騰訊的微信系統(tǒng)包含3 000多個微服務模塊,運行在20 000多臺物理主機上[2]。但微服務體系結構帶來便捷開發(fā)的同時,由于其復雜的依賴關系以及頻繁交付和部署,導致系統(tǒng)面臨更多發(fā)生故障的潛在威脅[3],系統(tǒng)隨時可能出現意想不到的故障,如并發(fā)異步錯誤、運行資源短缺錯誤等,當某一微服務模塊發(fā)生故障時,相關模塊組件也會因為依賴調用而發(fā)生故障,從而導致大規(guī)模的微服務級聯故障。為了保證微服務的可靠運行和服務質量,開發(fā)人員必須快速修復系統(tǒng)故障。
然而,在微服務體系架構中定位故障會遇到以下挑戰(zhàn):(1)復雜的依賴關系。在微服務架構中,微服務的數量通常多達上百或者上千個,并且通常分布在多臺服務主機上,服務之間的調用和依賴復雜且動態(tài)變化,一個服務的性能下降可能會廣泛傳播,導致多個服務出現異常。(2)大量的監(jiān)控指標。大規(guī)模服務之間的通信和調用產生了大量的指標,從中分析出微服務發(fā)生異常的每個指標閾值是非常耗時的。(3)頻繁的微服務更新。為滿足用戶需求,需要經常更新微服務模塊,在更新過程中,舊模塊被新服務所替代,服務之間的依賴關系也會隨著更新而變化,從而形成一個動態(tài)的體系架構。
針對以上問題,該文提出一種基于自編碼器的云上微服務故障定位方法:MicroAFL。MicroAFL是一個基于容器微服務非侵入式程序模型,無需對微服務系統(tǒng)本身作任何修改。MicroAFL首先通過編碼器檢測系統(tǒng)異常,一旦檢測到系統(tǒng)異常,MicroAFL通過微服務之間的調用關系構建服務調用關系圖,并將微服務的性能狀態(tài)與系統(tǒng)資源利用率相關聯從而計算服務調用關系圖中每個節(jié)點的異常權重,接著通過加權的PageRank算法對故障微服務進行排序,完成故障自動定位。實驗表明,MicroAFL在故障定位精度上優(yōu)于對比方法。
該文的貢獻如下:
(1)提出基于自編碼器重構誤差的微服務異常檢測方法,學習微服務運行狀態(tài)與響應時間波動的關聯關系,實時檢測微服務運行狀態(tài)。
(2)通過解析微服務之間的通信數據,捕獲微服務之間的調用關系,從而構造服務調用關系圖以模擬故障傳播路徑,結合自編碼器對微服務響應時間的重構誤差與系統(tǒng)資源的利用率更新服務調用關系圖中節(jié)點的異常權重。
(3)基于服務調用關系圖中節(jié)點的異常權重關系,提出加權的PageRank算法,增強隨機游走概率與節(jié)點異常程度的關聯性。
(4)通過在華為云上的CCE集群中搭建的Sock-shop微服務系統(tǒng)中注入不同類型的故障檢測MicroAFL性能,實驗結果表明,MicroAFL在故障定位精度上相較對比方法有所提升。
微服務系統(tǒng)在運行過程中某個微服務可能發(fā)生網絡延遲、系統(tǒng)資源分配不足等問題,進而引起該微服務運行異常,最終導致整個系統(tǒng)異常,無法對外提供正常服務。該文將檢測異常微服務和定位引發(fā)系統(tǒng)異常的故障微服務的過程稱之為故障定位。目前,學術界和工業(yè)界已提出許多解決方案來實現分布式系統(tǒng)中的故障定位,主要分為以下三類。
日志是由代碼運行過程中輸出的非結構化信息,記錄了系統(tǒng)運行的完整信息,是故障診斷常見的信息來源。Xu等人[4]通過挖掘不同組件的系統(tǒng)日志來構建每次請求的執(zhí)行路徑,根據執(zhí)行路徑差異診斷故障,該方法往往通常針對特定微服務系統(tǒng),診斷結果往往依賴于日志質量,因此不具有很好的通用性。Nandi等人[5]從原始日志中挖掘模板,并從挖掘的模板中提取序列特征以形成跨越分布式組件的控制流圖,通過標記與運行時日志預期行為的偏差進行故障定位。然而,隨著微服務系統(tǒng)復雜性的不斷增加,日志規(guī)模不斷擴大,導致這類方法在分析微服務異常方面的效率較低。
執(zhí)行軌跡指的是利用Pinpoint[6]等工具準確記錄程序執(zhí)行路徑、調用關系等信息,生成類似圖結構的鏈路追蹤信息。Gan等人[7]通過收集調用鏈路數據信息學習服務行為模式,主動檢測系統(tǒng)運行過程中出現與正常服務相違背的行為來分析故障原因。Mi等人[8]通過跟蹤執(zhí)行路徑來收集信息,通過分析路徑上的延遲偏差確定故障根因。陳皓等人[9]通過收集并建模微服務的追蹤信息,將未知故障的執(zhí)行追蹤信息與已知故障的執(zhí)行追蹤信息相匹配, 采用字符串編輯距離衡量相似度以診斷可能的故障原因。但是這類方法往往需要將監(jiān)測代碼注入到目標系統(tǒng)以獲得準確調用鏈信息,面對一個由多個開發(fā)團隊使用不同語言開發(fā)的微服務系統(tǒng)而言,在系統(tǒng)中加入監(jiān)測點的開銷成果過高,可用性較低。
通過調用操作系統(tǒng)或應用系統(tǒng)提供的接口可以采集性能指標數據來分析系統(tǒng)性能變化情況,從而診斷故障根因[10]。Lin等人[11]實時收集性能指標數據并與歷史數據相結合,將表現異常的微服務模塊添加到故障微服務候選集中,并根據異常微服務和性能指標之間的相關性對異常微服務排序。Thalheim等人[12]構建指標縮減框架和指標依賴關系提取器,通過結合指標維度來推斷組件之間的依賴關系進行根因定位。Gulenko等人[13]通過收集不同微服務的性能指標數據構建對應向量,利用聚類算法訓練對應微服務性能指標正常特征空間。在實時監(jiān)測過程中,檢查對應性能指標數據構成的向量是否處于正常特征空間來檢測微服務是否發(fā)生性能故障。Liu等人[14]通過跟蹤固定監(jiān)測數據分析異常微服務,接著通過拓撲圖的傳播方向分析異常傳播鏈,異常傳播鏈末端的微服務被視為可能的故障根因。時間窗口中的服務依賴關系構建拓撲圖,結合歷史監(jiān)測數據分析異常微服務,接著通過拓撲圖的傳播方向分析異常傳播鏈,異常傳播鏈末端的微服務被視為可能的故障根因。
該文提出一種云上微服務故障自動定位方法,其總體框架如圖1所示,主要包括3個模塊。數據收集模塊負責收集應用程序指標和系統(tǒng)級別指標數據,其中應用程序指標用于檢測應用性能問題,系統(tǒng)級別指標用于后續(xù)服務調用關系圖中節(jié)點權重更新。異常檢測模塊通過自編碼器對應用程序指標數據進行編碼重構,檢測微服務模塊是否發(fā)生異常。一旦檢測到系統(tǒng)異常,故障定位模塊通過解析微服務之間的調用關系構造服務調用關系圖以分析異常傳播路徑,利用系統(tǒng)資源利用率與微服務性能的相關性計算服務調用關系圖中每個微服務節(jié)點的異常權重,最終利用改進的加權PageRank算法定位故障根因微服務模塊。
圖1 MicroAFL總體框架
微服務系統(tǒng)運行監(jiān)測是異常檢測及故障診斷的基礎,MicroAFL作為一個非侵入式故障定位方法,無需對微服務系統(tǒng)進行代碼注入便可實時監(jiān)測并收集微服務系統(tǒng)運行指標數據。該文實時監(jiān)測的指標主要分為物理資源利用率指標和微服務之間調用的響應時間指標。
(1)
(2)
(3)
一旦檢測到系統(tǒng)異常,MicroAFL開始定位引發(fā)異常的故障微服務。針對微服務系統(tǒng)復雜的依賴調用關系,通過構建服務調用關系圖可以有效地展示服務之間的依賴關系,從而刻畫故障在微服務之間的傳播途徑。構建服務調用關系圖的步驟如下:首先,MicroAFL將微服務系統(tǒng)中的微服務集合記為V={v1,v2,…,vn},其中n表示微服務個數。對于任意vi∈V,映射生成圖節(jié)點si,最終得到圖節(jié)點集合S={s1,s2,…,sn};然后,通過解析各個微服務之間的通信數據來捕捉微服務之間的調用關系,若微服務vi向微服務vj發(fā)送服務請求,則構造一條從si指向sj的有向邊eij,構成邊集合E={eij},1≤i,j≤n,相同服務請求只會構造一條有向邊;接著,將微服務模塊ve的響應時間監(jiān)測指標的重構誤差作為節(jié)點se的初始異常權重f(se)。遍歷計算每個微服務模塊的異常初始權重,得到節(jié)點異常權重集合F={f(se)},se∈S;最終,得到服務調用關系圖G(S,E,F)。
以服務調用關系圖G(S,E,F)為基礎,根據服務調用關系圖中相鄰節(jié)點間異常權重關系[15]自動更新每個節(jié)點的異常權重[16]。對于任意節(jié)點se∈S,將包含指向節(jié)點se的有向邊的相鄰節(jié)點構成集合AN(se),將包含指向5AN(se)中任一節(jié)點的有向邊的相鄰的節(jié)點構成集合NAN(se)。例如圖2中的節(jié)點s3,AN(s3)={s1,s5,s6},NAN(s3)={s2,s4,s8,s9}。
圖2 AAN和NHAN集合示例
接著,計算AN(se)的平均異常權重aScore(se):
(4)
其中,f(si)表示節(jié)點si的異常權重, inDegree(se)表示節(jié)點se的入度。計算AN(se)的平均異常權重cScore(se):
(5)
其中,aScore(se)反映了AN(se)整體上的異常程度。cScore(se)表示NAN(se)整體上的異常程度。結合aScore(se)和cScore(se)的特征計算節(jié)點se的異常權重acScore(se):
acScore(se)=aScore(se)-cScore(se)
(6)
(7)
遍歷計算每個微服務節(jié)點的異常權重完成服務調用關系圖中所有節(jié)點異常權重更新。接著采用PageRank算法[17]在服務調用關系圖G(S,E,F)中“隨機游走”,進一步對每個微服務模塊作為故障根因微服務的概率大小進行排序[18]。針對微服務故障定位場景,該文提出一種改進的加權PageRank算法,利用節(jié)點異常權重與相連節(jié)點異常權重的關系計算游走概率,提升定位故障根因定位準確性。加權PageRank算法隨機游走策略是基于每個節(jié)點訪問其他節(jié)點的概率,因此首先需要定義服務調用關系圖節(jié)點轉移概率矩陣U:
(8)
其中,uij代表從節(jié)點sj隨機游走至節(jié)點si的概率。節(jié)點異常權值的大小與游走概率相關[19],計算從節(jié)點sj隨機游走至節(jié)點si的概率uij:
(9)
其中,sj→si表示存在從節(jié)點sj指向節(jié)點si的一條有向邊,linkOut(sj)表示節(jié)點sj指向的節(jié)點的異常權重和。對于任意節(jié)點se∈S,e={1,2,…,n},初始化PR分數為PR0(se)=1/n,將所有節(jié)點的PR分數表示為向量R0:
R0=(PR0(s1),PR0(s2),…,PR0(sn))T
(10)
在每輪隨機游走過程中,迭代更新每個節(jié)點的PR分數:
Rm=dU·Rn-1+(1-d)R0
(11)
其中,Rm表示第m輪迭代后所有節(jié)點的PR分數向量,U∈Rn×n表示隨機游走概率矩陣,d∈(0,1)表示索尼系數,通常d=0.85[19]。經不斷迭代更新,每個節(jié)點的PR分數會趨于收斂,此時節(jié)點PR分數越高,所對應的微服務模塊是故障根因的可能性越大,最終根據節(jié)點PR分數從高到低的順序輸出故障根因微服務排名列表。
3.1.1 實驗環(huán)境搭建
搭建的實驗環(huán)境框架如圖3所示。將Sock-shop通過Docker部署在華為云CCE集群中,每個Pod副本最大容量設置為3,Istio作為服務代理與每個容器共同部署在相同Pod中,通過編寫locust腳本模擬用戶對Sock-shop的接口發(fā)起請求,利用第三方工具對Sock-shop注入不同類型的故障來模擬微服務系統(tǒng)出現不同的故障,利用prometheus(普羅米修斯)收集每個微服務相應監(jiān)測指標。
圖3 實驗環(huán)境框架
搭建實驗環(huán)境的主要軟硬件配置信息如表1所示。
表1 實驗環(huán)境搭建使用的硬件和軟件配置信息
3.1.2 實驗對象
Sock-Shop是一款基于Springboot開發(fā)的模擬銷售襪子的電子商務網站微服務應用程序,是廣泛使用的微服務基準應用,微服務之間的通信以HTTP通信為主,并使用RESTful的接口設計風格。每個微服務都可獨立開發(fā)、部署和擴展。
3.1.3 模擬訪問
該文使用分布式開源工具Locust根據不同微服務接口請求規(guī)則編寫對應Locust腳本,并發(fā)生成多個線程執(zhí)行對不同微服務的請求,模擬用戶訪問Sock-shop系統(tǒng)從而使得各個微服務模塊之間正常通信與調用請求,考慮到不同微服務模塊被訪問的頻率存在差異,如表2所示,對不同微服務模塊配置了不同的請求頻率。
表2 模塊請求頻率配置
3.1.4 故障注入
為了模擬微服務系統(tǒng)在運行過程中遇到的性能故障問題,在Sock-shop中注入了以下三種類型的故障:(1)網絡延遲(Latency):使用tc工具造成微服務的網絡300 ms延遲,模擬在微服務運行過程中的網絡延遲。(2)CPU資源耗盡(CPU Hog):stress-ng是一款占用計算機CPU資源的工具,通過stress-ng占用CPU資源80%,耗盡系統(tǒng)CPU資源,模擬微服務缺少運行所需CPU資源故障。(3)內存泄漏(Memory Leak):使用stress-ng對某個微服務節(jié)點持續(xù)分配內存,模擬微服務系統(tǒng)因所在服務器內存不足而引發(fā)的內存泄漏故障。
為了評估MicroAFL的故障自動定位性能,選取以下方法作為實驗性能對比方法:
Random selection(RS):隨機選擇是運維人員在不了解系統(tǒng)特定領域知識的情況下使用的一種方法,故障修復人員每次都會從未排查的微服務中隨機選擇一個微服務進行故障診斷,直到定位故障。
MicroRCA:MicroRCA[18]利用聚類算法發(fā)現異常微服務,再基于服務依賴圖提取異常子圖,最終使用隨機游走算法進行故障定位。
AAMR:AAMR[16]首先基于實時指標數據構建服務依賴圖,并通過計算每個微服務的異常分數自動更新每個微服務的異常權重。最后,應用基于頁面的隨機游走對根本原因進行進一步排序,即對潛在的故障根因微服務模塊按照可能性大小進行排序。
為了量化算法模型的性能,采用評估指標AC@K和MAP衡量故障定位效果[18]。
(12)
MAP量化算法的故障定位平均準確率,其中n是微服務的數量。MAP在異常測試集A上定義為:
(13)
表3展示了注入不同類型故障下,MicroAFL在Sock-shop中不同微服務上的故障定位準確率。從表3中可以看出,MicroAFL在每個微服務上的故障定位平均準確率達到了0.85以上。此外,發(fā)現 MicroAFL在Shipping微服務上的故障定位準確率普遍低于其他模塊,分析這是由于相比其他模塊,Shipping微服務被請求的頻率以及訪問其他??斓念l率較低,使得Shipping微服務的響應時間指標監(jiān)測序列數據波動變化更小,即使由于Shipping微服務引發(fā)系統(tǒng)異常,也不易被判定為故障根因。
表3 MicroAFL在不同模塊上的故障定位準確率
為了比較MicroAFL與對比方法在故障定位準確率上的差異,復現了對比方法在本實驗收集的故障注入測試用例集上的實驗結果。實驗結果如圖4所示,在注入三種故障以及K取不同值的情況下,MicroAFL的故障定位準確率均高于其他方法,表明MicroAFL在故障定位方面準確率方面確實得到了有效提升。通過分析,故障定位的準確率提升主要歸因于構建服務調用關系圖時結合了異常檢測時的重構誤差,重構誤差的大小在一定程度上反映了故障的嚴重程度和持續(xù)時間,在服務調用關系圖節(jié)點權重更新時結合了重構誤差所攜帶的特征。
圖4 故障定位準確率對比實驗結果
進一步,通過計算故障定位評價指標MAP衡量MicroAFL算法故障定位平均準確率,實驗結果如圖5所示。從圖5中可以看出,MicroAFL算法對網絡延遲(Latency)的故障定位平均精度為0.920,對CPU資源短缺(CPU Hog)故障定位的平均精度為0.864,對內存泄漏故障(Memory Leak)定位的平均精度為0.912,優(yōu)于對比方法,證明了文中方法對于提高故障定位準確率的有效性。
圖5 故障定位平均準確率對比結果
該文設計了一種名為MicroAFL的云上微服務故障自動定位方法,用于云環(huán)境下微服務系統(tǒng)異常檢測和故障定位。MicroAFL通過微服務之間的調用關系構建服務調用關系圖以刻畫云上具有復雜依賴關系的微服務之間的故障傳播路徑,進而使用一種基于異常權重加權的PageRank隨機游走算法對故障微服務進行排序,完成故障自動定位。但該方法在節(jié)點異常權重計算過程中只利用了監(jiān)測指標信息,特征提取相對單一,在以后的工作中,將在服務調用關系圖構建以及節(jié)點權重計算過程中,結合日志、調用鏈等信息進一步分析微服務運行特征,從而研究更細粒度的故障定位。