盧皓川 鄭吳杰 周揚帆 王 新
1(復旦大學計算機科學技術學院 上海 200433) 2(上海市智能信息處理重點實驗室 上海 200433)3(深圳市騰訊計算機系統有限公司 廣東 深圳 518000)
大型在線服務系統在當今互聯網時代已廣泛普及,許多公司、企業均上線了大量服務于生活方方面面的大型在線系統(如支付寶等)[1]。這些系統依托于龐大的后臺大型業務系統來實現服務功能,并利用前臺復雜精巧的客戶端來為用戶實現對服務的接入。然而,由于系統的前后臺都具有很高的復雜性,并且需要頻繁的快速迭代開發,系統往往會出現多種類型的故障,而這些故障會引發不良的用戶體驗,降低系統的可靠性[2]。因此,如何檢測系統中的故障是一個重要的任務。
傳統上,為了更好地反映系統中存在的故障以幫助檢測,許多研究及工業界方法均采用后臺指標監控的方式。這一方法通過根據以往運維經驗預設一些與系統后臺相關的關鍵運行指標[3-4](如后臺CPU工作負荷[5]),來反映系統后臺的運行狀態,從而通過異常指標表征其中存在的故障。然而,在實踐中我們發現,系統的故障不僅存在于后臺業務系統中,同樣也會廣泛地存在于前臺界面中,這些前臺故障同樣會對用戶使用體驗帶來嚴重的影響[6]。例如,前臺界面控件(如按鈕等)異常遮擋的故障將導致用戶無法正常進行相關操作;又如前臺界面中的內容錯誤(如亂碼),會對用戶使用產生困擾和誤導。面對此類故障,上述基于系統后臺的指標監控方法難以奏效,因為后臺相關運行指標難以反映前臺中的故障癥狀。更進一步地,由于前臺故障的類型與癥狀更為繁多且不可預知,若采用類似方法在前臺通過經驗人為預設一些指標進行監控,則難以達到良好的覆蓋面,許多未被事先考慮、甚至是新出現的前臺故障難以被預設的指標所表征。因此綜上,這類前臺故障尚需有效的方法對其進行合理的監控與檢測。
為了解決面對前臺故障時后臺預設指標效力不足的問題,我們認為隨著故障發生而動態地構建指標是一個良好的方式。我們發現,前臺故障更直接面向用戶。由于用戶為系統前臺最直接的使用者,他們會對其中產生的故障有及時的感知,因此我們將問題轉化為從用戶的角度進行針對于前臺故障的動態的指標構建。為了避免直接使用收集用戶數據可能造成的隱私問題,我們采用用戶反饋數據來構建動態指標。我們發現用戶往往會對所遭遇的故障實時地提出大量的反饋(通過客戶端接口、客服、官方論壇等方式),這樣的反饋主要為文本形式,其中會包含對于故障癥狀的具體描述。因此我們可以通過設計合理的自然語言處理方法從中抽取出能夠表征前臺故障的指標,以便進行對前臺故障的監控。由于這種指標構建方式可以隨著不同出現的故障所對應的反饋文本進行實時抽取,因此實現了動態構建,以及對不同故障的高覆蓋率表征。
進一步地,通過基于用戶反饋文本的動態的指標構建我們將獲得海量的針對于前臺故障的指標。由于故障檢測的時效性十分重要,因此在海量指標上實現快速的異常檢測也是一大關鍵要求。本文基于從反饋文本中構建的指標,設計了一種兩階段的檢測算法。該方法通過一個基于規則的快速過濾粗篩,以及一個基于機器學習分類模型的精細檢測,來做到準確、快速地對海量動態指標的實時監控,從而實現對前臺故障及時的檢測。
本文所提出的基于用戶反饋的動態指標構建方法以及異常檢測方法,被實際應用于多個真實的在線服務系統中,協助進行更全面的前臺故障檢測。我們通過在實踐中收集的數據來反映該方法效益,實踐結果證明提出的方法可以達到針對前臺故障良好的檢測效果。
本文所提出的具體貢獻總結如下:
(1) 為應對檢測系統前臺故障時傳統指標監控方法的局限性,我們提出了動態構建指標的新方案,并開創性地使用了利用用戶反饋數據來進行指標構建。該方法所構建的指標可以針對于前臺故障實現更大的覆蓋面,從而更全面地表征前臺出現的各種類型故障。
(2) 為在動態構建的海量指標上實現快速檢測,我們進一步提出了一種兩階段的異常檢測算法,該方法通過快速過濾與機器學習的結合,實現在海量動態指標上的實時異常檢測,保障了故障檢測的時效性。
(3) 將該方案制作成工具以實際服務于真實大型在線系統。在多個真實系統上部署了我們提供的技術方案用于前臺故障實時檢測,實踐證明該方法可以取得良好的效果。
近年來,許多大型的服務運營商均上線了大量大型在線服務系統開放給公眾使用。這些系統均為前后臺分離的架構[7],一方面,龐大的后臺系統為其業務功能提供支持,通常以上百臺云服務器的超大規模的方式進行部署。另一方面,前臺客戶端為用戶提供了服務接入的入口,通常安裝于不同類型的終端上。由于部署前臺的終端環境十分復雜且不可預知,可能產生不同的兼容性問題,因此系統前臺常常產生前臺故障[6]。這類前臺故障種類和癥狀十分多樣,如亂碼、界面控件錯亂遮擋或是部分控件無法顯示和響應等等。圖1給出了一個應用前臺故障的樣例,其按鈕控件被錯誤的遮擋,且界面上出現了亂碼。此類故障由于對系統后臺不產生明顯影響,因此很難由傳統后臺指標監控的方法監控到。即使有針對于前臺預設的指標,也難以良好地覆蓋和表征各種類型的前臺故障。然而,前臺故障在同樣系統用戶側均會造成較大的影響(如界面無法響應等),從而嚴重降低系統可靠性,影響用戶體驗,因此它們是一類無法忽略并且十分重要的故障問題。所以亟需一個更全面、有效的故障檢測方案來應對更多類型的故障。

圖1 大型在線服務系統前臺故障樣例
大型線上系統通常具有海量用戶。部分應用的日活躍用戶數量可達上億級別。由于用戶是前臺系統的直接使用者,會對各種前臺故障產生及時的感知,而這樣的故障也會在用戶群體中引起比較強烈的反響。用戶反饋就是反響的一種主要形式。當用戶在使用過程中發生不良體驗時,用戶就會試圖通過多種渠道來進行對這些不良體驗所對應的故障的反饋。這些渠道包括服務客戶端中自帶的反饋接口,或是系統官方論壇等等。由于巨大的用戶量,系統運營商每天可以收集到大量的用戶反饋,數量達到百萬級別。這些用戶反饋都是以自然語言的文本為主,內容包含了各種各樣對于系統故障的描述。表1是一些用戶反饋的示例。

表1 用戶反饋示例
系統故障檢測是維護大型系統可靠性中的一個重要任務,引起了許多學術界和工業界的研究。對于后臺故障,已有許多研究利用系統后臺預設的關鍵運行指標來進行故障檢測。例如,Laptev等[8]提出了EGADS系統,利用后臺指標的時序信息通過多種異常檢測及趨勢預測模型組合來檢測指標異常。Liu等[9]提出了Opprentice系統,其面向于某一個時間窗口內的后臺指標采用了機器學習的分類技術檢測異常。然而,利用預設的后臺指標無法有效表征和定位前臺故障。前臺故障由于癥狀繁多且復雜,目前研究方法僅針對了其中部分故障類型提出了解決方案,如Wang等[10]提出利用卷積神經網絡技術識別前臺界面中產生的文字堆疊故障。而本文利用用戶反饋進行的動態指標構建與監控方案,不僅可以有效應對前臺故障,更可以實現各種故障類型的全面覆蓋。
用戶反饋數據在過去的研究中也體現出了對于推動軟件的開發、迭代和維護的重要價值。例如,Di Sorbo等[12]提出利用主題模型總結用戶反饋中的關鍵用戶需求來輔助軟件迭代。Vu等[13]提出基于短語的聚類機制來分析App市場中的用戶評價,從而分析App的優缺點。Gao等[14]提出了IDEA工具,同樣利用主題模型分析歷史上所有的用戶反饋,從中發現與系統故障相關的主題內容。然而,以上方法只可將歷史上的用戶反饋視為一個靜態的數據進行分析,無法做到基于用戶反饋進行動態的故障檢測。同時,以上方法都需要基于復雜的自然語言模型算法,其面對海量反饋文本的時候難以快速地得到分析結果。因此,這些工作無法有效勝任實時的系統故障檢測任務。
本文所提出的基于用戶反饋進行前臺故障檢測的技術方案整體流程架構如圖2所示??梢钥吹剑摲桨钢饕譃閮蓚€部分:(1) 前臺系統關鍵指標構建階段以及(2) 指標異常分析檢測階段。

(1) 前臺系統關鍵指標構建階段 (2) 指標異常分析檢測階段圖2 基于用戶反饋的前臺故障檢測方案整體流程架構
在第一部分中,我們先通過對反饋文本進行詞語抽取,來形成監控指標的定義;并進一步對這些指標的監控值進行量化和收集,從而構建出海量針對前臺故障的監控指標。通過反饋文本抽取的指標定義實現了對不同故障癥狀的覆蓋,而對監控值的收集可以形成指標趨勢從而進行異常檢測。
在第二部分中,我們提出了兩階段的異常檢測算法來對前一部分中構建的海量指標進行檢測。首先我們通過一個基于規則的快速過濾,找到具有潛在異常風險的部分指標;進而再對這些指標進行基于機器學習的精細檢測,從而精確找到其中包含異常的指標。在第一階段中我們快速過濾掉了絕大部分不包含異常的指標,極大地減少了第二階段精細檢測的工作量,從而實現了快速、實時的故障檢測。
兩部分設計中涉及到的關鍵技術點為:文本指標抽取及量化和兩階段異常檢測算法。
(1) 指標內涵定義。我們通過對用戶反饋文本進行處理來構建指標的定義。圖3展示了這一文本處理過程。首先,通過jieba分詞技術[15]對文本進行分詞處理。進一步地,通過構建常用的停用詞表,過濾掉部分無關的停用詞。這一步操作使得我們可以分離出反饋中與故障描述相關的元素。接下來,將分離出的詞語進行兩兩組合,將每一對組合作為一個指標的定義。我們將通過這一構建方法得到的指標稱為“詞語組合指標”。

圖3 文本處理構建指標內涵定義過程
構建詞語組合指標有以下幾個方面的優點:首先,詞語組合可以提供更多的語義描述信息,例如,“[圖片,加載]”這樣的指標可以表征前臺在圖片顯示方面的故障;“[按鈕,覆蓋]”這樣的指標可以體現前臺界面上出現控件重疊的故障。也正是由于用戶反饋往往是以短句、短文本的形式呈現的,采用其中詞語組合即可對句子的核心語義有比較好的表征。因此,詞語組合指標這種構建方式在語義保留方面是有優勢的。
其次,詞語組合指標的設計同樣實現了對多種故障類型的大范圍覆蓋。通過兩兩詞語組合,我們能迅速構建出極其海量的指標(可達到十億級別)。我們可以在其中找到關于各種類型、癥狀的故障進行表征的指標,并且可以做到非常細的覆蓋粒度。相比于基于主題模型的直接主題聚類的方法,利用這種海量、細粒度的指標進行基于指標的異常檢測分析可以更有效地精確區分相似但不同的故障。
最后,構建詞語組合指標比使用復雜的自然語言處理算法模型更加高效。由于該構建方法僅需要簡單的詞語切分和詞語組合過程,因此可以在非常短的時間內完成對海量反饋文本的處理。而形成的海量指標可以利用底層數據庫系統加以維護,從而實現良好的存儲和管理。而復雜自然語言處理模型則對于單個文本需要很長的處理時間,無法實時在海量反饋文本中完成分析。
(2) 指標量化。當通過詞語組合完成指標的定義后,我們進一步收集與指標相關的數據,從而量化指標用于監控的數值。我們使用每個指標中詞語組合在每小時內所有反饋文本中的出現頻數作為其指標監控值。例如,“[菜單,遮擋]”這一詞語組合在某日18:00至19:00這1小時內所有反饋文本中出現5次,則其這1小時的指標監控值即為5。值得注意的是,這樣的指標監控值統計起來是非常迅速的,只需在對每個文本分詞并構建詞語組合指標的同時,在數據庫中查詢,若已存在該指標的索引,則在該指標的在當前時間戳下對其頻數進行累加統計,若沒有這一指標索引,則新建這一指標索引,并且初始化其當前時間的指標值為1,作為后續累加的基礎。這樣一來,隨著時間的進行,詞語組合指標在每小時的監控值會形成一個時間序列趨勢,我們將它稱為“歷史頻數趨勢”。圖4給出了一個歷史頻數趨勢的樣例。

圖4 指標對應歷史頻數趨勢樣例
從上述的定義可以看出,每一個詞語組合指標都將對應著一個專屬于它的歷史頻數趨勢。每一個指標的趨勢曲線都可以體現出其對應詞語組合在某個時間區間內的出現次數的頻數變化。我們進而就可以根據這樣的趨勢曲線分析出其中異常的變化趨勢,從而發現其對應詞語描述的嚴重系統故障。
(1) 快速規則過濾。由于基于詞語組合生成的指標數量龐大,可達上千萬級別,直接對每個指標都進行復雜的機器學習異常檢測所需要的開銷是無法承受的。因此,我們首先設計了一個快速過濾機制,利用規則對指標進行篩選,選擇出少部分具有潛在異常風險的指標。通過這一方式,我們大大地減少了后續機器學習精確檢測的處理量,為實現實時異常檢測奠定了基礎。
這一過濾方式所基于的規則介紹如下:對于一個詞語組合指標I及其對應的歷史頻數趨勢HI,在t時刻時,我們設計邏輯函數Rem(I,t)來決定當前時刻這一指標是否被留下,即篩選為潛在異常風險的指標。這一函數的定義如下:
(1)



由式(1)可見,當兩方面條件同時被滿足時,這一指標將被留下作為具有隱含故障可能性的候選指標,以待后續更精確的檢測判斷。若任意一個條件不滿足,該指標將被視為正常而過濾。該過濾策略具有較好的可控性和合理性。
這樣的過濾對于后續異常檢測工作量的減少是十分有效的。一方面,這一過濾手段僅僅基于直接的數值計算和比較,可以通過底層簡單的數據庫查詢實現。另一方面,根據統計顯示,在一周的利用反饋數據做異常檢驗的過程中共能產生千萬級別的詞語組合指標,而經過這一階段的過濾后,僅留下了數萬個具有潛在風險的詞語組合指標以供后續分析。因而這一過濾階段減少了超過99.9%的工作開銷,成為實現檢測實時性的關鍵。
(2) 機器學習檢測。通過上一過濾步驟獲得了少量具有潛在風險的指標,我們進一步利用精細的機器學習算法對其中真正具有異常的指標進行檢測。首先對這些指標進行了特征抽取。特征包含兩個方面,一是時間趨勢特征,我們將這些指標的過去7天及過去24小時內的趨勢監控值進行了提取,并計算平均數、方差等統計值,作為不同的特征維度。另一方面的特征為文本特征,我們利用詞袋模型的Jaccard距離計算了當前這一小時內與該指標詞語組合相關的反饋文本的文本多樣性,并將這一值作為特征之一。我們認為當出現故障時,用戶的反饋會集中在這一故障的描述上,因此會有較低的文本多樣性。綜合這兩方面的特征,構建出了對于每個指標的特征向量。
進一步利用XGBoost模型[16]來對這些特征向量進行分類,來識別每一個指標是否屬于異常。我們事先通過部分人工標注了千余條數據來進行訓練,來獲得具備識別功能的模型。這一標注過程引入了專家經驗來指導模型識別,使得這一檢測過程更為精確。
通過以上方式,我們利用機器學習算法精確識別出了存在異常的指標,而這些指標對應著系統存在的故障??梢詫⑦@些異常指標根據指標詞語之間的相似性進行歸類,從而具體匯總出其中的故障。這樣,該方案就完成了利用用戶反饋對前臺故障進行實時檢測的過程。
本文提出的基于用戶反饋的前臺故障檢測方法被真實地應用在多個大型線上服務系統中進行輔助性故障檢測,這些系統包括某社交媒體應用、某企業辦公應用、某游戲運營平臺、某日常娛樂類應用、某資訊類應用等。這些線上服務系統均在各大終端平臺上有不同的前臺客戶端,并時常有頻繁的更新和迭代,因此,這些在線服務系統對于前臺故障的監控有著明顯的需求。
另一方面,由于這些系統均擁有大量的用戶群體,這些用戶每日可以提供大量的用戶反饋數據來作為分析的數據源。根據統計,這些服務每日收集到的反饋量可以達到兩百萬條,其歷史反饋數據總量已達到上百GB。這樣豐富的反饋數據為本文提出方法的有效使用提供了有利條件。
作為一個檢測前臺故障的技術方案,本實驗的主要目的為檢測其檢測故障的準確率、以及對嚴重故障的召回率。此外,我們還對比了該方案與傳統上已人工方式檢測前臺故障之間的效果差異,從而體現該方案的效能。
準確率是考察該方法檢測出的所有故障中,對應著真實出現的故障的比例。檢測準確率體現了一個故障檢測方案是否可以精確地對真實故障進行報警,避免誤報的產生。
為了驗證準確率,我們對于檢測出的故障進行了人工審查,從而確認檢測到的故障中正確發現故障的數量以及誤報故障的數量。我們從兩個維度進行了實驗來評估本文方案檢測故障的準確率。一方面,以不同的服務系統為維度,研究在多種服務應用中,該方案進行故障檢測的準確性表現。這一維度主要驗證該方案在不同的服務系統場景下,是否均具有良好的通用表現。我們采用了前文所述部署該方案的五個服務系統(即社交媒體應用、企業辦公應用、游戲運營平臺、日常娛樂應用、資訊應用)為實驗對象,統計了這些應用在一個月內各自被檢測出的所有前臺故障數量,并通過人工標注獲得正確對應真實故障的檢測數量,進而計算出準確率。實驗結果數據如表2所示。

表2 不同應用系統中故障檢測準確率
可以看到,該故障檢測方案在不同應用上總體可以達到比較良好的檢測準確率,均達到70%及以上水平,在某些應用中甚至可以達到90%以上或更高。注意這一檢測是從上百萬用戶反饋中進行的有效篩選而得出的數十個乃至數個故障檢測,因此這樣的準確率已經可以達到滿意的水平,開發者可以以此檢測結果為依據在一個很小的范圍內精確、高概率地定位真實故障。
另一方面,我們以時間為維度,研究該方案在一個較長的時間過程中是否能持續保持良好的檢測準確性。我們收集了在五個月內在上述應用中的故障檢測情況及其人工審查結果,并統計其準確率,結果如表3所示。

表3 不同時間內故障檢測準確率
可以看出,該方案在幾個月內的綜合準確率表現相當穩定,準確率均能保持在70%左右的水平。這體現了該方案可以應對不同時期出現的不同反饋描述內容,在長期運維任務中也能做到良好的表現。
綜上所述,在本文提出的基于用戶反饋進行前臺故障檢測的方案在檢測準確率方面具備良好的效果。
召回率考察的是系統出現的所有故障中,被該故障檢測方案檢測到的故障數量。召回率體現了故障檢測是否可以將各種出現的故障均覆蓋到,避免漏報。
在這些服務系統中,有專門通過人工測試的方法前臺故障進行的收集。這些故障都是真實存在且經過審核的。我們以這些故障為基礎,來考察本文提出的檢測方法是否能夠高覆蓋率地檢測到這些故障。表4展示了一周以內所有人工驗證到的故障數量及其被該方案檢測到的數量和比例。

表4 人工驗證故障的召回率
可以看到,本文方案這批故障有著非常高的召回率(>90%),并且僅有非常少的故障被遺漏。這體現了該方案對于故障良好的覆蓋面,具有良好的召回表現。更進一步地,隨著數據的積累,我們事后可以使用更多的標注數據進一步訓練異常檢測模型,使得模型的檢測能力更強。被遺漏的故障也都在模型進一步訓練后可以被檢測出。因此,本文提出的基于用戶反饋的故障檢測方案可以實現全面、高覆蓋的前臺故障檢測。
為了更好地體現本文提出檢測方案的效益,我們進一步將對比了本文提出的檢測方案與前文提到的人力測試檢測發現前臺故障的能力。由于前臺故障種類繁多且不可預知,在以往的運維方式中人力檢測是一個尚能奏效的傳統方法。而由于本文提出的方案具有不同的檢測方式,使得它具有更全面的對故障的覆蓋能力,同時它可以自動化執行檢測流程,也比人力檢測更為高效。因此,該方案可以發現很多傳統人力前臺故障檢測中難以發現的故障。圖5展示了一組數據,展示了在該方案一個月檢測出的故障中,未被傳統人力方法檢測出,以及比傳統人力方法更快檢測出的占比。

圖5 基于用戶反饋檢測故障與傳統人力檢測對比情況
從這組數據中可以發現,在所有被本文提出方案檢測到的故障中,有超過四分之一是沒有被傳統人力檢測發現的故障,這體現了該方案發現并覆蓋多種類型前臺故障顯著的效果,對于更全面的故障檢測具有明顯價值。更進一步地,在其他可以同時由本文提出方案與傳統人力檢測到的故障中,有接近一半的故障是由該方案更快檢測出的,說明該方案檢測前臺故障方面具有良好的實時性與時效性,可以獲得更好檢測效果。
大型線上服務系統中頻繁出現前臺故障問題。此類故障區別于后臺故障,其種類繁多、癥狀復雜且不可預知,因此無法通過傳統的預設后臺指標監控來檢測出。本文提出了基于用戶反饋文本動態構建指標的方式,巧妙地將無法有效檢測前臺故障從用戶體驗反饋中挖掘出來。本文提出了利用抽取反饋文本中詞語組合構建動態指標的設計,這種動態指標實現了對各種故障類型的描述和覆蓋。進一步地,本文針對于構建的海量指標設計了特制的兩階段檢測算法,實現對指標中存在的異常進行快速的檢測,并通過異常指標表征了存在的前臺故障。這一整體方案可以良好地檢測多種類型的前臺故障,其被實際應用于多個真實的在線服務系統中,并獲得了實時、有效的故障檢測效果。該方法為實際系統中的故障檢測提供了新的思路和方案,作出了創新性貢獻。