宋 勇,韋強(qiáng)申,董昭陽,葉曉舟,歐陽曄,3
(1.北京大學(xué),北京 100080;2.亞信科技(中國)有限公司,北京 100193;3.廣州亞信技術(shù)有限公司,廣東 廣州 511400)
如今,越來越多的應(yīng)用程序使用微服務(wù)架構(gòu)[1]。微服務(wù)架構(gòu)將單體應(yīng)用切分成多個(gè)獨(dú)立的微服務(wù),這些微服務(wù)具有獨(dú)立開發(fā)、獨(dú)立部署、責(zé)任單一等優(yōu)點(diǎn),使得整個(gè)系統(tǒng)更可靠、可擴(kuò)展、更具彈性[2]。
然而,微服務(wù)的規(guī)模數(shù)量巨大,且依賴關(guān)系復(fù)雜,例如,騰訊微信系統(tǒng)有超過3 000個(gè)微服務(wù)[3];Netflix有大約500個(gè)微服務(wù),日均處理20億應(yīng)用請求[4]。因此,當(dāng)一個(gè)微服務(wù)出現(xiàn)故障的時(shí)候,故障會沿著微服務(wù)的依賴關(guān)系傳播,從而引起大規(guī)模服務(wù)異常,使得微服務(wù)系統(tǒng)性能大大降低。此外,容器實(shí)例可以按照需求動(dòng)態(tài)地創(chuàng)建和銷毀,使得系統(tǒng)具有高度的動(dòng)態(tài)性和復(fù)雜性。因此,為保證系統(tǒng)運(yùn)行的性能,快速檢測故障和定位根因仍然是一項(xiàng)艱巨的任務(wù)。
通過分析現(xiàn)有文獻(xiàn)發(fā)現(xiàn),目前已經(jīng)有大量關(guān)于故障檢測和根因定位的方法,包括基于非結(jié)構(gòu)化日志的故障檢測方法[5-6]、基于系統(tǒng)關(guān)鍵性能指標(biāo)的故障檢測方法[7-8]、基于調(diào)用鏈日志的異常服務(wù)檢測方法并做根因分析[9-11],以及比較流行的通過構(gòu)造故障傳播圖實(shí)現(xiàn)的根因定位方法[12]。由于有些故障并不會嚴(yán)格按照節(jié)點(diǎn)調(diào)用的某一個(gè)方向傳播,且并不一定會體現(xiàn)在前端節(jié)點(diǎn)上,或者由于其他因素影響,有些統(tǒng)計(jì)相關(guān)性高的指標(biāo)實(shí)際并不一定具有很大的相關(guān)性;因此,使用以上方法不一定能夠?qū)崿F(xiàn)較好的根因定位效果。
本文提出了一種基于調(diào)用鏈時(shí)序分解的微服務(wù)根因定位方法StudRank,該方法的前提是,需要對前端性能指標(biāo)做異常檢測,一旦發(fā)現(xiàn)異常,才會啟動(dòng)StudRank的根因分析。具體而言,首先對調(diào)用鏈數(shù)據(jù)做預(yù)處理,計(jì)算節(jié)點(diǎn)的調(diào)用耗時(shí),并且解析成含有調(diào)用關(guān)系的時(shí)序數(shù)據(jù);其次對調(diào)用關(guān)系的指標(biāo)做時(shí)序的異常檢測,如果為異常,則把節(jié)點(diǎn)標(biāo)記為異常;再次在動(dòng)態(tài)構(gòu)建的拓?fù)鋱D中,萃取含有異常節(jié)點(diǎn)的異常子圖;最后構(gòu)造異常傳播的概率轉(zhuǎn)移矩陣,應(yīng)用隨機(jī)游走算法PageRank對異常節(jié)點(diǎn)打分排序。使用2020AIOps挑戰(zhàn)賽公開數(shù)據(jù)集[13]對本文所提方法進(jìn)行實(shí)驗(yàn)與測試。實(shí)驗(yàn)結(jié)果表明,所提方法在top1的精確度達(dá)到了84%,并與微服務(wù)根因分析經(jīng)典方法進(jìn)行了對比,較其中效果最好的MicroRCA準(zhǔn)確度提升了97.6%。
本文的其余部分安排為:第1節(jié)討論相關(guān)工作,第2節(jié)詳細(xì)介紹StudRank方法,第3節(jié)描述實(shí)驗(yàn)評估,第4節(jié)總結(jié)全文。
目前已經(jīng)有許多關(guān)于微服務(wù)分布式系統(tǒng)的故障檢測和根因定位研究??偟膩碚f,這些研究提出的方法分為基于非結(jié)構(gòu)化日志分析的方法、基于系統(tǒng)關(guān)鍵性能指標(biāo)的方法、基于調(diào)用鏈日志的方法以及構(gòu)建故障傳播圖的方法。
非結(jié)構(gòu)化日志分析的方法是一種常用的系統(tǒng)異常檢測方法。LogDC[5]是一種基于日志模型的問題診斷工具,其使用非結(jié)構(gòu)化日志分析方法對Kubernetes的云應(yīng)用程序進(jìn)行異常檢測。Jia等人[6]提出了一種基于日志的自動(dòng)異常檢測方法,構(gòu)建了一個(gè)能夠捕獲服務(wù)間和服務(wù)內(nèi)的正常執(zhí)行流程的混合模型,如果觀察到的與模型存在偏差,則發(fā)出異常告警。然而這種非結(jié)構(gòu)化文本日志分析方法,很難進(jìn)行因果關(guān)系推導(dǎo),因此不太適用于故障根因定位。
系統(tǒng)關(guān)鍵性能指標(biāo),指的是系統(tǒng)節(jié)點(diǎn)(物理機(jī)、虛擬機(jī)、應(yīng)用等)的CPU、內(nèi)存、磁盤等相關(guān)的性能指標(biāo)。很多方法通過分析性能指標(biāo)來定位根因,例如,Sieve方法[7]首先過濾掉不重要的指標(biāo)來降低指標(biāo)的維度,其次基于格蘭杰因果關(guān)系檢驗(yàn),分析組件之間的度量依賴關(guān)系,得到異常的根因;MicroRCA方法[8]通過將應(yīng)用程序性能癥狀與相應(yīng)的系統(tǒng)資源利用率相關(guān)聯(lián)來實(shí)時(shí)推斷根本原因,這種根因定位方法基于一個(gè)屬性圖,該圖對跨服務(wù)和機(jī)器的異常傳播進(jìn)行建模。然而,這些方法僅通過分析指標(biāo)的相關(guān)性來推斷服務(wù)是否異常,并不能準(zhǔn)確地判定根因結(jié)果。
當(dāng)前已經(jīng)有很多記錄調(diào)用鏈日志的跟蹤工具和系統(tǒng)[14-17],如TraceAnomaly模型[10]基于調(diào)用鏈數(shù)據(jù)構(gòu)造服務(wù)的跟蹤向量,然后通過深度貝葉斯網(wǎng)絡(luò)學(xué)習(xí)跟蹤向量分布,如果檢測的跟蹤向量不符合分布,則會被認(rèn)為是異常;Seer模型[9]通過神經(jīng)網(wǎng)絡(luò)來分析調(diào)用鏈日志,并基于卷積神經(jīng)網(wǎng)絡(luò)模型過濾掉不影響性能的調(diào)用鏈節(jié)點(diǎn),然后使用長短期記憶網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)學(xué)習(xí)時(shí)間和空間模式,來分析服務(wù)質(zhì)量;TraceRank模型[11]利用調(diào)用鏈數(shù)據(jù)的信息構(gòu)造異常傳播圖,并引入頻譜分析和基于PageRank的隨機(jī)游走方法來檢測異常服務(wù)。但是深度學(xué)習(xí)方法需要消耗大量的計(jì)算資源,并需要對不同的調(diào)用鏈模式建模,當(dāng)系統(tǒng)發(fā)生改變的時(shí)候,會導(dǎo)致模型效果大大降低,且構(gòu)造圖的方法需要遍歷所有的服務(wù)節(jié)點(diǎn),因此,對于一個(gè)超大型的微服務(wù)系統(tǒng)來說,基于調(diào)用鏈日志的方法是低效的。
軟件架構(gòu)經(jīng)歷了從單體架構(gòu)到微服務(wù)的轉(zhuǎn)變,以實(shí)現(xiàn)軟件開發(fā)的彈性、敏捷性和可擴(kuò)展性,進(jìn)而構(gòu)建故障傳播圖來定位故障根因。MicroHECL根因定位方法[12]基于動(dòng)態(tài)構(gòu)建的服務(wù)調(diào)用圖分析可能的異常傳播鏈,并基于相關(guān)性分析對候選根本原因進(jìn)行排序。但是由于有些故障并不會嚴(yán)格按照節(jié)點(diǎn)調(diào)用的某一個(gè)方向傳播,且并不一定會體現(xiàn)在前端節(jié)點(diǎn)上,或者由于其他因素影響,有些統(tǒng)計(jì)相關(guān)性高的指標(biāo)實(shí)際并不一定具有很大的相關(guān)性;因此,使用這些方法不一定能夠?qū)崿F(xiàn)較好的根因定位效果。
如圖1所示,StudRank總體方案分為3個(gè)部分:數(shù)據(jù)預(yù)處理、指標(biāo)異常檢測和根因定位。
圖1 StudRank流程
數(shù)據(jù)預(yù)處理需要把調(diào)用鏈數(shù)據(jù)轉(zhuǎn)化為時(shí)序數(shù)據(jù),并把調(diào)用鏈中節(jié)點(diǎn)的調(diào)用關(guān)系(父子節(jié)點(diǎn)對)挖掘出來組成時(shí)序數(shù)據(jù)序列。本節(jié)內(nèi)容將詳細(xì)介紹數(shù)據(jù)預(yù)處理的流程。
2.1.1 調(diào)用鏈數(shù)據(jù)的結(jié)構(gòu)
調(diào)用鏈數(shù)據(jù)描述的是請求執(zhí)行過程中,調(diào)用微服務(wù)記錄的信息,其結(jié)構(gòu)如圖2所示。
圖2 某一次請求調(diào)用微服務(wù)的拓?fù)浣Y(jié)構(gòu)
每一次調(diào)用微服務(wù)一般會記錄時(shí)間戳、微服務(wù)名稱、響應(yīng)時(shí)延、該次調(diào)用的唯一標(biāo)識ID、上游節(jié)點(diǎn)ID,以及標(biāo)識每一次用戶請求的ID等信息。表1是某系統(tǒng)調(diào)用鏈數(shù)據(jù)的主要屬性。
表1 某系統(tǒng)調(diào)用鏈數(shù)據(jù)的主要屬性
2.1.2 計(jì)算節(jié)點(diǎn)的時(shí)延性能
圖3展示的是某一次請求調(diào)用鏈的結(jié)構(gòu)和日志信息,長方形代表調(diào)用鏈訪問的微服務(wù)節(jié)點(diǎn),記錄了時(shí)間戳、節(jié)點(diǎn)名稱和時(shí)延。
圖3 某一個(gè)調(diào)用鏈路
定義t(N)代表節(jié)點(diǎn)N的時(shí)間損耗,t0(N)代表N調(diào)用子節(jié)點(diǎn)的時(shí)間損耗,即節(jié)點(diǎn)N的時(shí)延性能,t0(N)表達(dá)式為:
式中:Ni是N的下游節(jié)點(diǎn)。
計(jì)算節(jié)點(diǎn)的時(shí)延性能,是因?yàn)樗芟龝r(shí)延在有依賴關(guān)系節(jié)點(diǎn)的異常傳播。如圖3,節(jié)點(diǎn)A和B明顯時(shí)延過大,有異常的癥狀。計(jì)算兩個(gè)節(jié)點(diǎn)的時(shí)延性能t0(A)=250 ms。顯然,B節(jié)點(diǎn)的異常癥狀沒有傳播到A節(jié)點(diǎn)。
2.1.3 構(gòu)建結(jié)構(gòu)向量
使用父節(jié)點(diǎn)時(shí)間戳、父節(jié)點(diǎn)、子節(jié)點(diǎn)、父節(jié)點(diǎn)時(shí)延性能構(gòu)造1個(gè)4元組向量。定義向量為:
式中:t為調(diào)用鏈訪問N節(jié)點(diǎn)的時(shí)間戳;N為調(diào)用鏈的某個(gè)節(jié)點(diǎn);N1,N2,…,Nm為N的下游子節(jié)點(diǎn)。如圖3,可以構(gòu)建兩個(gè)向量:(t1,A,[B],250),(t2,B,[C,D],1 930)。
2.1.4 構(gòu)造時(shí)序數(shù)據(jù)
將向量轉(zhuǎn)化為時(shí)序指標(biāo),父節(jié)點(diǎn)和任意一個(gè)子節(jié)點(diǎn)組成一個(gè)二元指標(biāo),式(2)可以轉(zhuǎn)化為m個(gè)指標(biāo),分別為(N,N2),(N,N2)…,(N,Nm),t0(N)轉(zhuǎn)化為指標(biāo)在時(shí)間t的值。
對指標(biāo)按照分鐘平均采樣?;谟^察,如果一個(gè)節(jié)點(diǎn)出現(xiàn)故障,那么任意一個(gè)訪問該節(jié)點(diǎn)的調(diào)用鏈或者包含該節(jié)點(diǎn)的指標(biāo)對應(yīng)的時(shí)延或時(shí)延性能值都會過大,即這樣過大的值是占大多數(shù)的。對指標(biāo)按照分鐘采樣取平均,節(jié)點(diǎn)的故障特征不會被消除。如果該節(jié)點(diǎn)沒有故障,僅僅是同級節(jié)點(diǎn)故障造成的包含該節(jié)點(diǎn)的指標(biāo)值過大,這樣的點(diǎn)是少數(shù),可以通過平均采樣消除這些噪點(diǎn)的影響。
對于待檢測的時(shí)間點(diǎn)或者時(shí)間段,檢測每一個(gè)指標(biāo)在該檢測時(shí)間下的值是否異常。采用核密度估計(jì)方法和差值法檢測,具體如下文所述。
2.2.1 核密度估計(jì)方法
對于某個(gè)指標(biāo),取一段正常的歷史數(shù)據(jù),根據(jù)該數(shù)據(jù),估計(jì)一個(gè)概率密度函數(shù)。如圖4所示,直方圖外面包裹的實(shí)線就是概率密度函數(shù)。
圖4 單指標(biāo)密度函數(shù)
對于待檢測數(shù)據(jù),計(jì)算檢測值的累積概率,定義如下:
式中:x為連續(xù)型隨機(jī)變量,為檢測時(shí)間點(diǎn)指標(biāo)對應(yīng)的值,或者檢測時(shí)間段指標(biāo)對應(yīng)的平均值;f(x)為概率密度;α為可調(diào)閾值。Pr值越小,表明越可能是異常。
2.2.2 差值法
定義x-是指標(biāo)歷史正常值的均值,σ是指標(biāo)歷史正常值的標(biāo)準(zhǔn)差,θ是大于0的調(diào)節(jié)因子。α是檢測時(shí)間點(diǎn)指標(biāo)對應(yīng)的值,或者檢測時(shí)間段指標(biāo)對應(yīng)的平均值,如滿足式(4),則認(rèn)為該指標(biāo)是異常。
2.2.3 其他情況
如果時(shí)序指標(biāo)在某一個(gè)時(shí)間點(diǎn)是空值,那么,所有的調(diào)用鏈訪問這兩個(gè)父子節(jié)點(diǎn)對都沒有數(shù)據(jù),據(jù)筆者觀察,這是由被調(diào)用節(jié)點(diǎn)的故障導(dǎo)致的。
基于集成的方法中,如果核密度估計(jì)方法和差值法的結(jié)果都是異常,或者在檢測窗口存在空值,那么指標(biāo)就是異常。
異常檢測算法的部分流程如下:
通過2.1節(jié)和2.2節(jié)檢測出了可疑的異常節(jié)點(diǎn),但是,無法確定哪個(gè)節(jié)點(diǎn)更可能是根因。受文獻(xiàn)[11]和文獻(xiàn)[18-21]的啟發(fā),筆者考慮使用隨機(jī)游走算法,即個(gè)性化的PageRank[22],對節(jié)點(diǎn)根因進(jìn)行定位。
2.3.1 PageRank算法
PageRank算法最初是谷歌公司用于網(wǎng)頁鏈接分析的算法,它可以對搜索引擎搜索的網(wǎng)頁鏈接進(jìn)行排序。其原理是根據(jù)網(wǎng)頁鏈接的數(shù)量,對網(wǎng)頁的重要性進(jìn)行排名。該算法通過概率轉(zhuǎn)移矩陣描述網(wǎng)頁之間的鏈接,為了防止有些網(wǎng)站鏈接不出去,又設(shè)計(jì)了偏好向量。PageRank算法描述如下:
式中:π為節(jié)點(diǎn)(網(wǎng)頁)重要性得分向量;P為概率轉(zhuǎn)移矩陣;u為偏好向量;α∈[0,1],為阻尼因子。α越接近0,隨機(jī)游走越以偏好向量訪問節(jié)點(diǎn);α越接近1,隨機(jī)游走越以概率轉(zhuǎn)移矩陣(圖結(jié)構(gòu))訪問節(jié)點(diǎn)。PageRank算法不僅可以用于網(wǎng)頁重要性排名,也可以用于系統(tǒng)的故障根因定位,其中,作為節(jié)點(diǎn)的異常得分越大,則節(jié)點(diǎn)故障的可能性越大。
2.3.2 圖的構(gòu)造
在定位根因之前,需要構(gòu)造異常傳播圖。由于觀察到異常在調(diào)用路徑上傳播,可以根據(jù)調(diào)用鏈數(shù)據(jù)的動(dòng)態(tài)構(gòu)建異常傳播圖。構(gòu)建過程如下:
(1)截取故障前一批調(diào)用鏈數(shù)據(jù)。數(shù)據(jù)包含了很多調(diào)用鏈,例如圖5中的調(diào)用鏈1、調(diào)用鏈2、調(diào)用鏈3。
(2)確定圖的節(jié)點(diǎn)。把調(diào)用鏈數(shù)據(jù)中包含的節(jié)點(diǎn)作為圖節(jié)點(diǎn),如圖5所示的調(diào)用鏈數(shù)據(jù)中的節(jié)點(diǎn)A、B、C、D、E、F、G。
(3)確定圖的邊。如果調(diào)用鏈數(shù)據(jù)中,存在A節(jié)點(diǎn)調(diào)用B節(jié)點(diǎn),那么在圖中,可以賦予圖節(jié)點(diǎn)A到B的有向邊,表示節(jié)點(diǎn)A出現(xiàn)故障的原因是節(jié)點(diǎn)B出現(xiàn)了故障,例如圖5中的A→B、A→C、B→D、B→E、B→F、C→G。
圖5 異常傳播圖構(gòu)造過程
總的來說,定義圖G=<V,E>,V是微服務(wù)節(jié)點(diǎn)(調(diào)用節(jié)點(diǎn))的集合,定義E代表有向邊的集合,如果eij∈E,代表節(jié)點(diǎn)vi調(diào)用節(jié)點(diǎn)vj,即為vi到vj的有向邊。
2.3.3 子圖的萃取
如圖6(a)所示,得到異常傳播圖后,還需要萃取異常子圖,異常子圖記為G'=<V',E'>。在2.1節(jié)數(shù)據(jù)預(yù)處理中,把調(diào)用鏈轉(zhuǎn)化為多個(gè)時(shí)序指標(biāo)數(shù)據(jù),即父節(jié)點(diǎn)調(diào)用子節(jié)點(diǎn)的時(shí)序數(shù)據(jù),而時(shí)序指標(biāo)正好對應(yīng)了故障傳播圖的邊。把異常節(jié)點(diǎn)定義為異常時(shí)序指標(biāo)對應(yīng)邊起始的兩個(gè)節(jié)點(diǎn)。如圖6(b)所示,檢測到時(shí)序指標(biāo)(A,B)、(B,E)、(B,F(xiàn))是異常,則對應(yīng)的虛線邊就是異常,虛線邊兩邊的節(jié)點(diǎn)A、B、E、F是異常節(jié)點(diǎn)。那么,提取異常節(jié)點(diǎn)和異常邊作為子圖,如圖6(c)所示。
圖6 子圖萃取過程
2.3.4 子圖邊權(quán)重
得到異常子圖G'=<V',E'>后,對于邊ei'j∈E'的權(quán)重計(jì)算如下:
式中:x為2.2節(jié)中式(4)的差值;α和a為調(diào)節(jié)參數(shù)。使用該方法計(jì)算邊的權(quán)重的原因是,節(jié)點(diǎn)的調(diào)用時(shí)延越大越可能是異常,而x是時(shí)延指標(biāo)的偏移量,x越大,對應(yīng)的Sij越大,就代表調(diào)用vj產(chǎn)生異常的概率也越大。
2.3.5 概率轉(zhuǎn)移矩陣
隨機(jī)游走算法將按照子圖G'=<V',E'>游走,并且以Sij的概率前向游走。但是,由于環(huán)境的復(fù)雜性,子圖并不足以描述異常的傳播關(guān)系,例如,節(jié)點(diǎn)vi調(diào)用節(jié)點(diǎn)vj,對應(yīng)檢測出的時(shí)延性能值異常,既可能是vi故障的癥狀表現(xiàn),也可能是vj故障的癥狀表現(xiàn)。因此,為了使結(jié)果具有魯棒性,需要進(jìn)一步定義隨機(jī)游走算法的概率轉(zhuǎn)移矩陣P。
(1)前向游走。如果eij∈E',那么vi調(diào)用vj產(chǎn)生的時(shí)延性能異常,很可能vj是異常的因,即故障由vj傳播到vi,且權(quán)重Sij越大,傳播的可能性也越大。由式(6)可知Sij∈[0,1],所以可以定義P的轉(zhuǎn)移概率pij等于Sij,即:
(2)后向游走。對于eij∈E',且eji?E',如果vi是異常的因,隨機(jī)游走從vi以概率pij游走到vj,那么就再也無法游走到真正的根因了。因此,前向游走需要允許以一定的概率返回,則后向概率定義為:
式中:δ∈[0,1],為可調(diào)參數(shù)。
(3)其他游走。對于eij?E',且eji?E',考慮到系統(tǒng)的復(fù)雜性,可以賦予一個(gè)低的概率值,則定義:
結(jié)合前向游走、后向游走和其他游走,隨機(jī)游走算法在子圖G'=<V',E'>的概率矩陣定義為:
再對概率矩陣標(biāo)準(zhǔn)化,就可以得到概率轉(zhuǎn)移矩陣P:
2.3.6 偏好向量
偏好向量代表的是節(jié)點(diǎn)的異常概率。從2.1節(jié)的式(1)可以看出,節(jié)點(diǎn)調(diào)用的時(shí)延性能消除了時(shí)延異常的傳播依賴,因此如果節(jié)點(diǎn)出現(xiàn)故障,那么該節(jié)點(diǎn)調(diào)用或者被調(diào)用時(shí)出現(xiàn)時(shí)延性能異常癥狀的概率越大。在提取的異常子圖中,節(jié)點(diǎn)的中心度越大,則越有可能是故障。因此,通過計(jì)算子圖節(jié)點(diǎn)的中心度來代表節(jié)點(diǎn)的異常程度,節(jié)點(diǎn)vi的異常表示如下:
對節(jié)點(diǎn)的中心度歸一化,就可以得到偏好向量為:
2.3.7 節(jié)點(diǎn)排名
綜上,通過計(jì)算概率轉(zhuǎn)移矩陣和偏好向量u,基于PageRank式(5),對節(jié)點(diǎn)異常得分向量π進(jìn)行迭代,直到π趨于平穩(wěn),就是各個(gè)節(jié)點(diǎn)的最終得分,根據(jù)得分就可以判斷故障根因。
在這一部分,將使用2020國際AIOps挑戰(zhàn)賽公開數(shù)據(jù)集評估的方法,將本文所提方法與硬編碼、MircoRCA、MicroHECL 3種常用方法進(jìn)行對比,最后將討論所提方法的特征。
3.1.1 數(shù)據(jù)
測試StudRank方法使用的數(shù)據(jù)是2020國際AIOps挑戰(zhàn)賽公開的數(shù)據(jù),該數(shù)據(jù)來源于某運(yùn)營商真實(shí)生產(chǎn)環(huán)境。通過統(tǒng)計(jì)甄別公開的15天的數(shù)據(jù),得到3種故障類型,分別為網(wǎng)絡(luò)故障、CPU故障和數(shù)據(jù)庫故障。本文實(shí)驗(yàn)只使用其中的調(diào)用鏈數(shù)據(jù),并且實(shí)驗(yàn)方法只定位到調(diào)用鏈訪問的節(jié)點(diǎn),不考慮資源依賴的宿主機(jī)。
3.1.2 對比方法說明
本文采用的對比方法為硬編碼、MircoRCA、MicroHECL,這3種方法的具體介紹如下文所述。
(1)硬編碼
硬編碼是將規(guī)則或數(shù)據(jù)直接嵌入到程序中的方法。設(shè)置指標(biāo)的靜態(tài)閾值,并根據(jù)設(shè)置的靜態(tài)閾值產(chǎn)生的告警分析根因。使用該方法進(jìn)行實(shí)驗(yàn)時(shí),模擬靜態(tài)閾值的方法,設(shè)置微服務(wù)調(diào)用時(shí)延的閾值為1 000 ms。超過閾值,則微服務(wù)為異常。再利用已知的拓?fù)潢P(guān)系定位根因。
(2)MircoRCA
該方法基于已知拓?fù)鋱D關(guān)系,利用BIRCH算法計(jì)算服務(wù)的時(shí)延調(diào)用異常,并基于異常檢測構(gòu)建異常子圖以及時(shí)延和性能指標(biāo)的相關(guān)性計(jì)算子圖邊的權(quán)重,再利用個(gè)性化PageRank算法,對異常節(jié)點(diǎn)評分。本文使用該方法進(jìn)行實(shí)驗(yàn)時(shí),不考慮與調(diào)用無關(guān)的宿主機(jī)節(jié)點(diǎn),在計(jì)算相關(guān)性的時(shí)候,不考慮容器或主機(jī)的網(wǎng)絡(luò)指標(biāo)。
(3)MicroHECL
該方法分為3個(gè)部分:首先根據(jù)待分析的時(shí)間窗口動(dòng)態(tài)構(gòu)建服務(wù)依賴圖,其次采用剪枝策略分析異常傳播鏈,最后基于皮爾森相關(guān)系數(shù)對候選根因排序??紤]到本文實(shí)驗(yàn)數(shù)據(jù)的特性,只分析服務(wù)的響應(yīng)時(shí)間。在使用該方法進(jìn)行實(shí)驗(yàn)時(shí),使用和StudRank一樣的方法做異常檢測。
3.1.3 度量標(biāo)準(zhǔn)
為了度量算法在數(shù)據(jù)集的性能,將使用以下度量指標(biāo):
(1)排名前的精度,記為PR@K,指的是算法推斷出的根因排名在前面的概率。定義:
式中:R為故障根因集合;r為某一個(gè)故障的根因集;f(i,r)的值為1或0,如果算法推理出的根因排名中的第i個(gè)在r里,為1;若不在r里,則為0。
(2)平均精度,記為AP,指PR@K的平均值,其表達(dá)式為:
式中:N為微服務(wù)的數(shù)量。
表2、表3、表4和表5對比了StudRank與硬編碼、MircoRCA、MicroHECL這3種方法對所有故障和各個(gè)類型故障的根因定位表現(xiàn),并進(jìn)行了具體的分析,其中,inf表示對比對象的值為0,提升幅度極大。
表2 StudRank與硬編碼、MircoRCA、MicroHECL在故障集根因定位的效果對比
表3 StudRank與硬編碼、MircoRCA、MicroHECL在網(wǎng)絡(luò)故障根因定位的效果對比
表4 StudRank與硬編碼、MircoRCA、MicroHECL在CPU故障根因定位的效果對比
表5 StudRank與硬編碼、MircoRCA、MicroHECL在DB故障檢測根因定位的效果對比
3.2.1 StudRank效果
算法StudRank在整個(gè)故障集R的評測指標(biāo)中,PR@1達(dá) 到84%,PR@3,PR@5和AP都超過了92%。這在一定程度上體現(xiàn)了StudRank算法在調(diào)用鏈根因定位的優(yōu)越性。在各種故障類型中,所提算法對CPU故障進(jìn)行根因定位的效果最好,所有評測指標(biāo)都達(dá)到100%。這是因?yàn)镃PU故障會對服務(wù)的調(diào)用時(shí)延和被調(diào)用時(shí)延都產(chǎn)生影響,癥狀比較明顯,根因很容易被檢測到。對網(wǎng)絡(luò)故障的根因定位效果僅次于對CPU故障進(jìn)行根因定位的效果,除了PR@1外,其他指標(biāo)都超過了90%。網(wǎng)絡(luò)故障比CPU故障效果差,是因?yàn)槟承└驔]有在調(diào)用鏈節(jié)點(diǎn)上,比如os_001和os_009,數(shù)據(jù)中也沒有微服務(wù)與這些宿主機(jī)節(jié)點(diǎn)的映射信息;因此,這類根因是無法推斷出來的。表現(xiàn)最差的是針對DB故障的根因定位,這是因?yàn)橛行┕收喜粫w現(xiàn)在服務(wù)的調(diào)用時(shí)延上,這種基于調(diào)用時(shí)延的根因定位方法是無法檢測出來的。
3.2.2 方法對比
在整個(gè)故障集R上進(jìn)行實(shí)驗(yàn)的結(jié)果表明,StudRank相對于表現(xiàn)其次的MicroRCA,指標(biāo)PR@1提升了97.6%,指標(biāo)PR@3提升了21.2%,指標(biāo)PR@5提升了16.4%,AP提升了13.8%。硬編碼的效果最差,因?yàn)殪o態(tài)的閾值不能有效地捕獲到異常。
在對網(wǎng)絡(luò)故障數(shù)據(jù)進(jìn)行根因定位的實(shí)驗(yàn)中,StudRank在所有的指標(biāo)都表現(xiàn)得最好,指標(biāo)值都在90%左右,相對于MicroRCA,StudRank的PR@1提升了69.30%,AP提升了6.5%。硬編碼和MicroHECL的效果最差。
在對CPU故障數(shù)據(jù)進(jìn)行根因定位的實(shí)驗(yàn)中,StudRank表現(xiàn)最好,所有指標(biāo)都達(dá)到了100%,原因正如3.2.1節(jié)分析的那樣。相對而言,MicroRCA除在PR@1指標(biāo)上差了一些,其他指標(biāo)都與StudRank接近。排除硬編碼方法,MicroHECL表現(xiàn)得最差,PR@1和PR@3均低于14%。這是因?yàn)镃PU故障的根因有些并不在拓?fù)滏湕l的最下游或者最上游,這與MicroHECL的假設(shè)相違背了。
在對DB故障數(shù)據(jù)進(jìn)行根因定位的實(shí)驗(yàn)中,如3.2.1節(jié)分析的那樣,有些故障不會體現(xiàn)在服務(wù)的調(diào)用時(shí)延上,或者時(shí)延性能的癥狀并不明顯。因此,基于相關(guān)性分析的MicroRCA和MicroHECL,很難捕捉到異常癥狀,其PR@1和PR@3不足8%。而StudRank不涉及相關(guān)性分析,基于核密度估計(jì)和差值統(tǒng)計(jì)量能夠捕捉到微弱的異常癥狀,因此,StudRank方法的表現(xiàn)最好,PR@1達(dá)到了40%,PR@3達(dá)到了73.3%。
StudRank是基于指標(biāo)異常檢測進(jìn)行根因分析,那么,指標(biāo)異常檢測的質(zhì)量在一定程度上影響了根因分析的結(jié)果。本節(jié)將進(jìn)一步討論核密度估計(jì)方法超參數(shù)和差值法超參數(shù)對結(jié)果的影響。
核密度估計(jì)方法檢測質(zhì)量受控于式(3)中的閾值α,即顯著水平,如圖7所示,其中,橫坐標(biāo)代表閾值取值,縱坐標(biāo)代表PR@K值的水平。在實(shí)驗(yàn)的時(shí)候,把原來異常檢測模塊的差值法去掉,調(diào)整核密度的超參數(shù)。已知閾值取值在[0,1]范圍,值越大,則對異常越靈敏,檢測的異常越多。對于PR@1,橫坐標(biāo)閾值越大,對應(yīng)的縱坐標(biāo)性能值有逐漸減小的趨勢。這是因?yàn)殡S著異常檢測越來越靈敏,出現(xiàn)假陽性的概率也越大,從而會影響最后異常評分的排名。對于PR@3,雖然閾值變大,異常檢測越來越靈敏,但性能值不會有多大的變化。這是因?yàn)檎嬲漠惓V笜?biāo)不會被漏檢,在構(gòu)造異常子圖權(quán)重和偏好向量時(shí)不會有太大的改變,因此,最后評分的排名也不會有過大的變動(dòng)。
圖7 核密度估計(jì)方法調(diào)節(jié)閾值后,PR@K值的表現(xiàn)
差值法受控于式(4)中的調(diào)節(jié)因子。調(diào)節(jié)因子是一個(gè)大于0的正數(shù),值越小則對異常越靈敏。圖8給出了在調(diào)節(jié)因子分別為1,2,3,4,5的條件下性能的情況。如圖8所示,調(diào)節(jié)因子對結(jié)果無影響。這是因?yàn)樵摦惓z測方法能檢測到所有由根因故障引起的異常指標(biāo),當(dāng)調(diào)節(jié)因子變大時(shí),雖然異常指標(biāo)變少了,但是基于PageRank的隨機(jī)游走算法還是能夠正常推斷出根因。
圖8 差值法調(diào)節(jié)因子后,PR@K值的表現(xiàn)
本文提出了一種基于調(diào)用鏈時(shí)序分解的微服務(wù)根因定位方法StudRank。該方法首先通過計(jì)算調(diào)用節(jié)點(diǎn)的時(shí)延性能,把調(diào)用鏈數(shù)據(jù)轉(zhuǎn)化為多個(gè)時(shí)序數(shù)據(jù);其次基于指標(biāo)異常檢測,構(gòu)造異常子圖;最后基于PageRank的隨機(jī)游走算法,對節(jié)點(diǎn)根因定位?;诠_數(shù)據(jù)集對所提方法進(jìn)行實(shí)驗(yàn),結(jié)果表明,所提方法的PR@1指標(biāo)達(dá)到了84%,并與微服務(wù)根因分析經(jīng)典方法進(jìn)行了對比,較其中效果最好的MicroRCA指標(biāo)提升了97.6%。然而,如果存在某一種類型的調(diào)用鏈,其歷史數(shù)據(jù)比較少,或者訪問的頻次小,出現(xiàn)故障時(shí),很可能這類故障會被漏檢。此時(shí),如果分析每個(gè)調(diào)用鏈,又會造成計(jì)算效率低下的問題。因此,如何高效且細(xì)粒度地分析調(diào)用鏈,是未來需要進(jìn)一步研究的方向。