孫 斌,呂依蓉,王 晶,喻之斌,張偉功
1(首都師范大學 信息工程學院, 北京 100048)2(中科院深圳先進技術研究院 云計算中心, 深圳 518055)
隨著云計算技術的發展,越來越多的應用服務運行在云平臺上.因此,數據中心的規模和數量正以前所未有的速度增長.例如,倉庫級計算機(Warehouse Scale Computer)越來越普遍.然而,大規模的云計算基礎設施對運維造成了嚴峻挑戰,需要新的監控與運維技術[1].當前數據中心所呈現出應用多樣化和硬件平臺異構[2]兩個特點加大了性能監控和優化的難度,使得云環境下的性能監控變得尤為重要.和系統層的性能監控相比[3,4],如利用CPU利用率、內存利用率、以及磁盤利用率等,PMU(Performance Monitoring Unit)下硬件性能事件的計數結果能夠更細粒度、更直接地反映機器的實際運行狀況[2,5].
現代處理器中一般有2~8個性能計數器(寄存器),用來記錄處理器在運行時發生的硬件事件,如內存訪問次數、高速緩存的缺失次數等[6,7].為了節約芯片面積乃至成本,處理器中不能設計更多的性能計數器.為了深入理解程序的運行行為和優化性能,需要監測的事件數目卻遠遠大于性能計數器的數目,而且仍在呈增長趨勢[6,7].
由于數據中心中微量的性能提升都可以轉化成巨大的成本節約,許多研究人員在研究如何利用PMU的監測結果來優化性能[2,5,8,9].從需要監測的性能事件到性能計數器之間的映射有兩種方式:
1) 監測的性能事件數目小于或等于計數器個數;
2) 監測的性能事件數目多于計數器個數.
第一種方式可獲得準確的監測結果[10],但受限于性能技術器的個數以及實際需求,需要進行多次重復實驗才能得到所需全部事件的結果,因此,這種方式效率很低.此外,如圖1所示,在云環境下同一程序多次運行的執行時間會有較大波動,得到不等長的時間序列結果,大大提高了后續分析難度.第二

圖1 相同程序多次采集結果時間序列比較Fig.1 Compare the multi-result of sampling
種方式可以極大地提升監測效率,在一般需求下[2,5]可避免重復監測工作.然而,此方法會降低監測數據的測數據質量,如數據缺失,表現為未能有效監測到已發生事件而產生的零值,再如數據異常,表現為時序中存在突然數據增大的時刻,與同組中其他數據的偏差超過多倍標準差.而且監測事件數目越多數據質量越低[10,11-13].為了既能提高監測效率,又能提高監測數據的質量,對第二種方式中所存在的問題進行改進刻不容緩.考慮到服務器中處理器架構的不同,軟件計算框架的差異以及應用本身的不同,本文提出基于知識庫的數據預處理方法,來應對不同情況下的缺失值和異常值.

圖2 Perf_events 子系統架構圖Fig.2 Perf_events architecture
對于缺失值,根據知識庫內相似監測任務下的數據,即對相同的運行環境,相同計算框架下應用的監測任務,監測事件可以不同但要包含缺失值所對應的事件,并結合當前監測數據中的未缺失項,構建回歸模型,補全缺失數據.
對于異常值,根據知識庫內的相似監測任務的監測數據,配置局部濾波器參數,使得濾波器可以自適應的檢測不同事件結果中的異常值,并對其處理.
本文所提出的數據預處理方法,可以在提升2-5倍監測效率的同時極大地提升數據質量.
現代處理器中一般都配有性能監測單元(PMU),它由兩部分組成:硬件性能事件和性能計數器.性能計數器用來測量微體系結構中如程序執行所消耗的時鐘周期數,指令數和高速緩存缺失數等硬件性能事件[6,7],其結果可直接反應程序執行過程中硬件的執行情況,從而可分析程序對硬件資源的使用情況.PMU的監測結果具有廣泛的應用場景,如科學應用程序的性能建模[14,15]、生產環境中程序行為的異常檢測以及診斷[9,16,17]、安全漏洞監測、編譯過程中的配置優化、以及功耗優化模型.此外,它對未來的硬件設計工作也有極大的幫助,比如在監測Google數據中心應用過程中發現指令地址轉換檢測緩沖缺失(iTLB MISS)比較大[2],則未來可以考慮為云環境下的硬件設計增加iTLB的大小.
2.1.1 PMU的硬件結構
現代處理器中一般有2~8個性能計數器(寄存器).如Intel Xeon E5 v3系列處理器是基于Haswell-E的微體系結構生產的,它配備2個專用的性能計數器和4個通用的性能計數器,可監測事件超過200個[6].其中專用的性能計數器只能分別監測未被停頓的時鐘周期數(Unhalted Cycles)和成功被執行的指令數(Instruction Retired)這兩個事件,通用計數器可配置監測其余所有事件.性能計 數器本質上是一個特殊寄存器(MSR),用來記錄某事件的發生次數.不同系列的處理器所擁有的性能計數器個數是不同的,而且所能支持監測的硬件事件種類也不盡相同,但共同點在于所有的處理器結構中性能計數器個數要遠小于可監測的事件數.

圖3 結果中缺失值(a)和異常值(b)的示意圖
Fig.3 Pattern of missing values(a) and outliers (b)

圖4 監測ICACHE.MISSES缺失部分與參考值的比較
Fig.4 Compare the missing part and reference data of the sampling data of the ICACHE.MISSES
2.1.2 應用PMU
在Linux操作系統中,Perf_events1內核接口作為一個通用、高層級的接口來驅使性能計數器完成監測任務,而且在Linux 2.6.31之后便被添加到了官方的內核之中.監測系統架構如圖2所示,Perf_event_open( )是一個系統調用,sysfs是一個文件系統,用來簡化事件命名以及工具配置,中間層則包括通用的核心計算邏輯設計以及應對不同處理器架構的通用接口層設計.
目前,Perf1和Oprofile2是較為流行的性能監測工具,都調用了Perf_events (接口).在應用中只需提前傳遞待測事件即可.事件的調度貫穿整個監測過程,包括綁定計數器和通過觸發機制輸出記錄結果,當待測事件數量多于實際計數器數量時,內核通過時分復用計數器來保證每一個待測事件都有機會被監測到.在復用過程中會采取輪詢的方式并假設事件的發生速率是相同的.事件結果的計算方式如公式(1),按照事件被分配到的比例以及計數值推測整個時間段內的計數結果.

(1)
事件調度能保證最大限度地利用計數器,盡量減少復用帶來的開銷,但不能保證監測結果的準確性.而且部分事件有特定的計數器限制,容易造成事件調度過程中的事件沖突[6],加劇了監測結果種的不準確性.

表1 參考記錄和復用PMU時記錄的數據比較Table 1 comparing reference data and the data sampling with multiplex PMU
如在2.1中所提到的,性能監測單元為程序特征描述所帶來的作用無可替代.許多性能優化工作以此為根據,在云環境下的程序特征描述和性能優化工作中都取得了明顯的效果[2,5,8,17].然而這些工作在應用基于PMU的監測工具時,受到性能計數器個數的限制,為保證監測結果的準確率都采用了相對保守的監測手段,即每一次監測事件時保證所監測的事件數不大于性能計數器個數.這種方式雖然能保證監測結果的準確性[10],但需要通過重復運行的方式來獲得更多的監測結果,大大降低了監測效率.
硬件性能事件結果與性能之間的語義鴻溝一直是研究的難點,尤其要在繁多的事件中有針對地選擇出一部分參與監測更是極具挑戰[16],極端情況下需要所有事件的監測結果,這只能通過重復運行的方式遍歷監測所有事件.如果實驗環境中的處理器是上述的Intel Xeon E5 v3系列,需要以4個性能計數器、2個專用計數器來應對超過200個事件,則重復運行次數超過50次.而且在重復運行監測的結果中還會遇到相同程序不同次運行執行時間不等長的問題.例如,在云環境下同時分發多個任務,執行時間取決于最后一個執行完的任務.圖1是對相同程序重復監測下多個不等長的時間序列的示意圖,而且本文實驗的基準測試程序HiBench[18]中的同一應用程序的執行時間表現出了3.3%-16.4%的波動.
一些學者的工作聚焦于提升復用性能計數器復用(multiplexing)情況下的監測準確率.比如通過量化錯誤來改進公式1,以獲得較高的準確率[12].也有學者通過事件的變化率來改進公式1[13]以及通過改進調度方式來提高準確率[11]等.這些研究確實緩解了PMU在應用中的問題,然而在實際應用中仍有監測結果過調節(異常值)以及缺失監測結果的現象存在,圖3(a)和圖3(b)分別是時間序列中異常值和缺失值得示意圖.實驗結果表明,雖然異常值與缺失值的數量在全部數據中不超過1%,但它們對時間序列的特征描述造成了很大影響.例如,對時間序列正則化和方差計算帶來巨大的偏差,而且由于硬件事件的計數結果一般沒有嚴格的值域范圍,難以界定缺失異常的閾值.通過反復監測Wordcount運行時ICACHE.MISSES事件的表現,在復用和不要復用硬件計數器的情況下,監測結果得出了不同的數據描述,如表1中Reference(1-4)是在不復用性能計數器時的數據描述,Test則是在復用性能計數器是而得到的數據描述,圖4是對ICACHE.MISSES這個事件在復用性能計數器和不復用性能計數器下的時間序列(這里只比較了缺失部分的數據)比較.而且根據表1可知,借助參考記錄可判別0值數據即為缺失記錄.
為了提高PMU的監測效率,并保證監測數據的質量,提出一種基于知識庫的預處理方法,如圖5所示.每一次的監測結果都會結合歷史監測數據來完成異常值和缺失值檢測,并以他們為參考來替換異常值以及補充缺失值.這里所提到的歷史監測數據主要指利用相同事件監測同一應用所產生的監測數據.對于異常值:本文設計了一個自適應的局部濾波器,自動判斷異常值并對其進行處理.對于缺失值:將結合歷史數據以及當前數據中未缺失部分構建回歸模型,并利用該模型補充缺失值.

圖5 預處理方法示意圖Fig.5 Schematic of preprocessing method
如上文所述,由于硬件事件的監測結果一般沒有確定的值域,使得對異常值和缺失值的判斷極其困難.而且監測數據表明異常值和缺失的出現并沒有確定的模式,相同事件在不同應用下的監測結果也有區別,這與程序表現密切相關.本文通過比較不等長序列間的相似性,計算經過動態時間歸準(DTW)之后的曲線間的距離來判斷事件監測結果的相似性.DTW是一種通過彎曲時間軸來更好地對時間序列形態進行匹配的相似性度量方法,被Bernd和Clliford用于度量時間序列的相似性[19].本文以歷史數據的結果作為參考來判斷異常和缺失現象.對比相同程序在不同輸入數據下的監測結果,得到監測結果具有較高的相似性.
如圖6所示,HiBench中的大數據應用程序在不同的輸入數據集下,執行時間和平均水平相比有50%到350%的變化.然而在遍歷所有服務器所支持的硬件事件之后,相同事件在不同輸入數據集下,多次監測結果與參考結果之間的平均DTW距離不超過0.07,說明事件監測結果的趨勢、幅度沒有受輸入數據集的變化而產生巨大變化,應用歷史數據是可以信賴的.
下面分別介紹知識庫的構建方法,局部濾波器設計以及回歸模型的建立方法.

圖6 不同應用在不同輸入下監測事件結果的相似性變化Fig.6 Similarity of results in different input data size among different applications
據記錄表的描述,包含事件名,應用名,記錄時長,記錄最大值,最小值以及平均值,同時記錄其他事件以及記錄所有二級數據記錄表的名字.

圖7 兩級表設計Fig.7 2 level sheet in the design of knowledge base
知識庫將隨著監測任務的進行不斷更新,包括對有完全相同監測事件的監測結果進行替換,以及對新監測事件的監測結果進行添加.
對歷史記錄的查詢,以被監測程序和問題事件為查詢條件,返回具有相似監測任務的記錄.從一級主表中查找事件的描述信息,再根據具體需要二次查找特定記錄和當前記錄中的歷史數據,用于下一步的模型訓練.
局部濾波器設計包括針對兩種情形的設計:
1) 歷史記錄事件:指相同監測應用下事件已被記錄.此時利用一級主表中的數據描述信息,以其記錄最大值的2倍,作為本地閾值作為判斷異常值的依據,其數值源自于實驗過程中的經驗數值.
2) 初始記錄事件:從觀察監測數據的分布可知,數據分布曲線類似高斯分布,但不是嚴格的高斯分布.借用高 斯分布的特性,根據對數據的觀察以公式2作為閾值的計算方法,
以均值和n倍標準差的和作為閾值.
List.threshold=List.mean+n*List.std
(2)
表2統計了n取不同值時的所有數據,n取5時可保證99%以上的數據都在閾值范圍內.將檢測到的異常值利用局部中位值替換的方式進行替換.
2.2 危險因素分析 單因素分析顯示:3~6周歲幼兒近視與平均1天看電視時間有關聯;遠視與母親視力、父親視力、幼兒營養狀況有關聯;散光與父親視力、幼兒營養狀況有關聯;多因素Logistic逐步回歸分析:父親視力是3~6周歲幼兒近視與散光的獨立影響因素,是3~6周歲幼兒遠視的危險因素。父親視力異常則3~6周歲幼兒近視、散光的概率小。幼兒營養狀態、母親視力是3~6周歲幼兒遠視的保護因素。3~6周歲幼兒營養狀態越好則遠視的概率越小,父親遠視、散光,增加3~6周歲幼兒遠視的危險。見表2。

表2 n的不同取值所能涵蓋的數據范圍Table 2 Compare the scale of threshold with different n
對于缺失值的判斷極具挑戰,如圖6所示,監測結果的差異度并沒有隨著輸入數據集的變化而發生巨大變化,同時結合圖4和表1的結果表明歷史數據可作為缺失值補充的依據.然而歷史記錄中的序列長度與當前缺失項的記錄時長未必相同,難以通過位置信息來補全缺失值,如圖4中的參考數據所示.然而利用事件之間的關聯可快速構造出回歸模型,利用回歸模型對數據進行補充則不存在錯位的問題.本文利用知識庫內相似監測事件的數據,即對相同的運行環境,相同計算框架下應用程序的監測任務,監測事件可以不完全相同,但必須包含缺失值的事件.以當前結果中的監測數據事件集的交集得出公共事件集作為訓練數據,構建回歸模型,回歸模型采用KNN回歸3的方式實現:
假設對含有缺失項的監測事件(a,b,c,d)的結果R1,只有事件a有缺失項 ,查找含有事件a,而且監測相同程序的記錄結果R2.R2之中含有(a,b,c,e,f)的監測記錄.
1.相同監測事件:
R1∩R2 = (a,b,c)
選取缺失項a為目標結果,b, c為特征事件.
2.整合數據:
結合R2之中事件a,b,c的監測結果和R1之中未缺失部分為模型訓練集Ts1,缺失部分為Ls1.
3.應用KNN算法,以K個距離最相近數據的為一類,建立分類模型.
4.根據(b,c)預測a的從屬分類,以類內所有a的平均值為缺失部分的最終預測值.
實驗集群由4臺Dell服務器組成,其中一臺作為主節點,其他三臺作為計算子節點.每臺服務器配備有16核Intel至強E5-2630 v3 @2.4GHz處理器,服務器內存大小為64GB,操作系統為Ubuntu 14.04.
集群管理系統為Mesos 1.0并應用Hadoop 2.7為計算框架,同時挑選了4類8個來自于Hibench中的典型云應用程序作為被監測程序,分別是:網絡分析算法(Pagerank),分布式數據庫應用(Aggregation,Scan),機器學習算法(Bayes,Kmeans)以及微基準程序(Sort,Wordcount).
由實驗觀察可知,即使是在相同的系統環境中,反復監測同一程序只能得到具有極高相似度的實驗結果,而不可能得到完全相同的實驗結果,如表1之中Reference1到Refernce4的數據描述,以及圖4之中對應的部分比較也可以證實這一點.所以本文對數據質量的評價是以數據結果與參考值的相似度作為數據清理效果的評價標準.并通過計算監測數據與參考值的DTW,評估結果的相似性,并以此比較數據清理前后的差異度Diff(%)來表現處理的效果,如公式(3).
Distancetest=DTW(datatest,dataref1)
Distanceref=DTW(dataref1,dataref2)

(3)
由第一章可知,采用復用時系統會通過時分復用PMU實現多個事件的同時監測.以監測HiBench中的WordCount程序為例, 觀察同時監測事件數量變化時的精度變化,結果如圖8所示.縱坐標為不同監測結果與參考數據的差異度,橫坐標為同時監測的事件數目.比較相同事件在不同的PMU配置下處理前后監測數據與參考數據之件的差異度,在同時監測的事件數量增多時差異度逐漸增加.預處理之后差異度明顯減少,預處理之后差異度不超過參考值的42%,較處理前最低都在50%以上的偏差來比較極大地提升了監測結果的質量,而且在同時監測的事件數量上少于24個時,DTW距離的差異度不超過20%,而這20%中還包括監測程序因頻繁的調度事件對程序所產生的影響.可監測的事件數量最大可提升到方式一的5倍,監測效率最大可提升5倍,確保數據依舊可保持較高的質量.

圖8 同時監測多個事件,數據質量比較Fig.8 Compare of data quality when sampling with more events

注:KBDP,基于知識庫的數據與處理方法;GDP,對當前缺失異常情況采取以當前均值直接替換的方法.三條直線(從上到下)分別代表經過預處理之前,GDP處理之后,KBDP處理之后的平均情況.
圖9 針對多種應用采取不同預處理方法比較.
Fig.9 Data quality promotion when it applied to different application
同時對Hibench之中的其他應用進行了驗證,并與針對缺失值和異常值直接以當前均值替換的方法[20](在本文中把這種方法定義成一般性的預處理方法方法-General Data Preprocessing approach,GDP)進行了比較,如圖9所示.在監測10個硬件事件時,基于數據庫的預處理方法(KBDP)與GDP相比極大的提高了與參考結果的相似性,總體的平均差異度由處理前的52.7%減低到8.7%,也就意味著平均91.3%的相似度.
本文提出的基于知識庫的預處理方法有效解決了在云環境下應用PMU時的問題,即通過配置的事件數少于性能計數器個數來完成數據收集的工作才能獲得可靠數據的限制.通過對復用PMU后監測結果的預處理工作處理了異常值,補全了缺失值,提高數據質量,使得監測數據可直接應用到后續的分析工作中,大大提升了工作效率.