譚宇寧,黨偉超,白尚旺,潘理虎
(太原科技大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,太原 030024)
軟件老化是指軟件(特別是大訪問量、大數(shù)據(jù)量的服務(wù)器軟件)在長期不間斷地運行一段時間后系統(tǒng)的性能持續(xù)下降、占用的資源不斷增加、錯誤不斷累積,最終導(dǎo)致軟件失效或系統(tǒng)宕機的現(xiàn)象[1].為盡可能地減少甚至避免損失,提高軟件的可靠性和可用性,Huang 等人提出一種主動性的容錯策略—軟件再生技術(shù)[2](Software Rejuvenation,SR),通過周期性地清除老化狀態(tài),使得運行環(huán)境恢復(fù)正常,從而避免因軟件老化引起突發(fā)性失效.盡管通過抗衰操作可以消除軟件老化帶來的影響,然而對一個正常運行的系統(tǒng)執(zhí)行抗衰操作勢必會帶來直接或間接的損失[3],因此如何能夠準確地對軟件老化趨勢進行預(yù)測,并及時采取相應(yīng)恢復(fù)策略是當(dāng)前預(yù)防軟件老化的研究重點.
目前對于軟件老化趨勢的預(yù)測主要是對影響軟件系統(tǒng)相關(guān)參數(shù)的資源損耗進行分析.梁佩[4]使用時間序列分析法以及馬爾可夫模型對軟件老化的資源消耗進行預(yù)測;蘇莉[5]等人使用非線性有源自回歸網(wǎng)絡(luò)模型來檢測軟件系統(tǒng)的老化現(xiàn)象;Jia[6]等人則使用多元線性回歸算法來分析和預(yù)測軟件老化問題;淵嵐[7]則建立了一個基于AdaBoost 算法的BP 神經(jīng)網(wǎng)絡(luò)模型來預(yù)測資源的消耗.盡管很多學(xué)者使用回歸分析法、時間序列法以及BP 神經(jīng)網(wǎng)絡(luò)算法等方法來預(yù)測遭受軟件老化影響的系統(tǒng)資源消耗情況,然而已有的單一模型很難達到理想的預(yù)測效果[8],因此文獻[8]提出使用混合模型,即將自回歸累積移動平均模型(Autoregressive Integrated Moving Average Model,ARIMA)和人工神經(jīng)網(wǎng)絡(luò)結(jié)合來預(yù)測Web 服務(wù)器中的資源消耗.然而混合方法的構(gòu)建過程復(fù)雜、人工依賴性強,不利于在實際中推廣和使用.
近年來,隨著深度學(xué)習(xí)技術(shù)的不斷發(fā)展,越來越多的深度學(xué)習(xí)模型逐漸被應(yīng)用到各個領(lǐng)域.深度學(xué)習(xí)模型是一種擁有多個非線性映射層級的深度神經(jīng)網(wǎng)絡(luò)模型,能夠?qū)斎胄盘栔饘映橄蟛⑻崛√卣?挖掘出更深層次的潛在規(guī)律[9].其中循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)模型在結(jié)構(gòu)設(shè)計中引入了時序概念,在學(xué)習(xí)具有內(nèi)在依賴性的時序數(shù)據(jù)時能夠產(chǎn)生對過去數(shù)據(jù)的記憶狀態(tài),能從原始數(shù)據(jù)中獲取更多的數(shù)據(jù)波動以及規(guī)律性特征,它的誕生解決了傳統(tǒng)神經(jīng)網(wǎng)絡(luò)在處理序列信息方面的局限性.作為近年來深度學(xué)習(xí)領(lǐng)域熱點技術(shù)之一,在機器翻譯、語音識別及圖像識別領(lǐng)域都取得了巨大成功[10],然而在軟件可靠性領(lǐng)域?qū)τ谫Y源消耗的預(yù)測目前還未發(fā)現(xiàn)展開過相關(guān)研究.
基于上述分析,本文提出了一種基于LSTM 的Web 資源消耗預(yù)測模型,該模型充分考慮了Web 資源損耗的時間特性,將當(dāng)前的資源損耗情況動態(tài)的與歷史數(shù)據(jù)相關(guān)聯(lián)并將其與傳統(tǒng)模型進行實驗對比.結(jié)果表明該資源消耗預(yù)測模型在處理老化數(shù)據(jù)的時間序列建模問題上預(yù)測精度更高,能夠有效地應(yīng)用于軟件老化趨勢的預(yù)測.
RNN 是一類由各神經(jīng)元相互連接形成的有向循環(huán)人工神經(jīng)網(wǎng)絡(luò),其基于時序展開后的結(jié)構(gòu)如下圖1所示.與傳統(tǒng)的前饋神經(jīng)網(wǎng)絡(luò)(Feedforward Neural Network,FNN)不同,RNN 不僅通過層與層間的連接進行信息的傳遞,而且通過在網(wǎng)絡(luò)中引入環(huán)狀結(jié)構(gòu),建立了神經(jīng)元到自身的連接.每一步的輸出不僅包括當(dāng)前所見的輸入樣例,還包括網(wǎng)絡(luò)在上一個時刻所感知到的信息即當(dāng)前時刻的ht不僅僅取決于當(dāng)前時刻的輸入xt,而且與上一時刻的ht-1也相關(guān).
圖1 按照時序展開的RNN 結(jié)構(gòu)圖
簡單的循環(huán)神經(jīng)網(wǎng)絡(luò)由1 個輸入層、1 個隱含層以及1 個輸出層組成.給定輸入向量序列x=[x1,x2,…,xT],通過迭代下列公式(1)首先計算出t=1 至t=T的隱含層狀態(tài)序列h=[h1,h2,…,hT],然后根據(jù)公式(2)計算出輸出序列o=[o1,o2,…,oT].
式中,U為輸出層到隱含層的權(quán)重矩陣;W為隱含層到隱含層的權(quán)重矩陣;V為隱含層到輸出層的權(quán)重矩陣,f和b分別表示輸入層到隱含層的激活函數(shù)以及偏置,g和b分別表示隱含層到輸出層的激活函數(shù)以及偏置.相比于FNN 需要n個時刻來幫助學(xué)習(xí)一次權(quán)重,RNN 可以用n個時刻學(xué)習(xí)n次W和U,實現(xiàn)了在時間結(jié)構(gòu)上的共享特性.
將式(1)帶入式(3)可得:
由式(3)可知循環(huán)神經(jīng)網(wǎng)絡(luò)在計算過程中雖然加入了上一時刻的輸入,但隨著時間的推移,后面節(jié)點對前面節(jié)點的感知能力下降,即RNN 存在梯度消失問題.
與傳統(tǒng)RNN 結(jié)構(gòu)相比,LSTM 在其基礎(chǔ)上增加了一個細胞狀態(tài)(cell state).在傳遞過程中,通過當(dāng)前輸入、上一時刻隱藏層狀態(tài)、上一時刻細胞狀態(tài)以及三個基于Sigmod 函數(shù)的門結(jié)構(gòu)來增加或刪除細胞狀態(tài)中的信息,其具體單元結(jié)構(gòu)如下圖2所示.其中門結(jié)構(gòu)用來控制即時信息對歷史信息的影響程度,通過線性積累,使得網(wǎng)絡(luò)模型能夠較長時間保存并傳遞信息[11].
圖2 LSTM 單元結(jié)構(gòu)圖
一個典型的LSTM 單元共有三個門:遺忘門、輸入門以及輸出門[12].其中遺忘門和輸入門主要用來控制上一時刻細胞狀態(tài)Ct-1以及當(dāng)前輸入新生成的中有多少信息可以加入到當(dāng)前的細胞狀態(tài)Ct中來,通過遺忘門和輸入門的輸出,更新細胞狀態(tài),輸出門基于更新后的細胞狀態(tài)輸出隱藏狀態(tài)ht,各門計算公式如式(4).
其中:ft、it、ot分別表示遺忘門、輸入門、輸出門的結(jié)算結(jié)果;Wf、Wi、Wo分別為遺忘門、輸入門、輸出門的權(quán)重矩陣;bf、bi、bo分別為遺忘門、輸入門、輸出門的偏置項.最終的輸出由輸出門和單元狀態(tài)共同確定,具體計算公式如式(5)所示.
式中,xt為t時刻輸入的單元狀態(tài);Wc為輸入單元狀態(tài)權(quán)重矩陣;bc為輸入單元狀態(tài)偏置項;tanh()為激活函數(shù),⊙表示hadamard 乘積.
Web 服務(wù)器資源消耗預(yù)測就是根據(jù)前t時刻老化指標(biāo)的資源使用特征來預(yù)測t+1 或者t+x時間內(nèi)的資源損耗,以此判斷Web 服務(wù)器的老化狀況.因此通過使用老化數(shù)據(jù)對LSTM 神經(jīng)網(wǎng)絡(luò)進行訓(xùn)練,構(gòu)建基于LSTM 網(wǎng)絡(luò)的軟件老化資源預(yù)測模型,其具體構(gòu)建步驟如下所示:
(1)首先將原始老化數(shù)據(jù)清洗后進行特征表示和特征提取:定義老化資源損耗時間序列F={f1,f2,…,f},將其劃分為測試集Ftrain={f1,f2,…,fm}和訓(xùn)練集Ftest={fm+1,fm+2,…,fn},其中m<n且m,n∈N,對Ftrain集合中的元素max-min 標(biāo)準化,處理后的訓(xùn)練集表示為式(6).
(2)構(gòu)建訓(xùn)練輸入以及對應(yīng)的訓(xùn)練輸出:對數(shù)據(jù)集進行時間融合,按照滑動窗口的大小s 進行分割,則模型輸入、輸出分別變?yōu)槭?7)、式(8).通過設(shè)置s 的值,旨在訓(xùn)練LSTM 網(wǎng)絡(luò)學(xué)習(xí)樣本數(shù)據(jù)前后的關(guān)聯(lián)及規(guī)律.
(3)確定網(wǎng)絡(luò)結(jié)構(gòu)并初始化LSTM 網(wǎng)絡(luò):確定每層激活函數(shù)的選擇、每層網(wǎng)絡(luò)節(jié)點的舍棄率以及誤差計算方式、權(quán)重參數(shù)迭代的更新方式.給定初始權(quán)值矩陣,設(shè)置最大迭代訓(xùn)練次數(shù)和最小誤差值,通過改變網(wǎng)絡(luò)的各項參數(shù)來訓(xùn)練網(wǎng)絡(luò).
(4)前向計算:將X輸入網(wǎng)絡(luò),根據(jù)前向計算公式(4)-(5)計算遺忘門、輸入門以及輸出門的值,經(jīng)過隱藏層后的輸出結(jié)果可表示為:其中CP-1和HP-1分別表示上一個LSTM 細胞的狀態(tài)以及隱含層的輸出.
(5)誤差反向傳播:采用批量梯度下降算法對訓(xùn)練數(shù)據(jù)進行批次(batch)劃分,通過對當(dāng)前批次的損失函數(shù)進行優(yōu)化,實時調(diào)整LSTM 網(wǎng)絡(luò)的權(quán)值和偏置,使網(wǎng)絡(luò)誤差不斷減小,既保證了參數(shù)的更新又減少了模型收斂所需要的迭代次數(shù).
(6)將訓(xùn)練好的模型用于預(yù)測:當(dāng)?shù)螖?shù)和最小誤差值滿足要求時停止訓(xùn)練模型,并將未知的樣本數(shù)據(jù)通過迭代輸入模型得到預(yù)測序列Pte={pm+1,pm+2,…,pn},并對其進行反標(biāo)準化處理得到最終預(yù)測序如式11.
為評估基于LSTM 的Web 資源消耗預(yù)測模型的性能,運用平均絕對誤差(Mean Absolute Error,MAE) 和均方根誤差(Root Mean Squared Error,RMSE)作為評價指標(biāo)來衡量模型的預(yù)測精度,其計算公式分別如式(12)和式(13)所示.
其中,n為Web 老化資源參數(shù)的樣本數(shù)目,pt為老化資源參數(shù)的預(yù)測值,yt為老化資源參數(shù)的真實值或觀測值,MAE 和RMSE 越小,模型預(yù)測能力越好.
由于軟件老化是一個錯誤不斷累積的過程,一個Web 系統(tǒng)出現(xiàn)老化現(xiàn)象時并不會立刻失效,需要耗費很長時間才能觀察到系統(tǒng)故障.當(dāng)前絕大多數(shù)的老化實驗只是簡單識別老化效應(yīng),很難準確把握軟件老化的整體趨勢[13].因此針對軟件老化的特性,本文根據(jù)R.Matias 等人提出的系統(tǒng)化方法,將工業(yè)領(lǐng)域已成熟應(yīng)用的加速測試理論[14]引入到軟件領(lǐng)域,通過監(jiān)測軟件系統(tǒng)的運行狀況,根據(jù)采集到的老化數(shù)據(jù),建立一個基于LSTM 的Web 資源消耗預(yù)測模型.
為研究因內(nèi)存泄漏而導(dǎo)致應(yīng)用程序故障的老化效應(yīng),本文以一個典型的Web 應(yīng)用服務(wù)器為研究對象,搭建了一個引入內(nèi)存泄漏的軟件老化測試實驗平臺.該平臺由一個Web 服務(wù)器,一個數(shù)據(jù)庫服務(wù)器以及一組模擬的客戶端組成,具體配置如表1所示.
服務(wù)器端實現(xiàn)了一個符合TPC-W 基準測試規(guī)范的多層電子商務(wù)網(wǎng)站系統(tǒng).該系統(tǒng)模擬了一個在線售書網(wǎng)站,包括主頁、暢銷頁面、新書頁面、搜索頁面、購物車和訂單狀態(tài)頁面等14 種不同類型的網(wǎng)頁,并規(guī)定了一系列模擬真實環(huán)境下顧客的訪問規(guī)則.客戶端則是一系列模擬瀏覽器(Emulated Browser,EB),以會話(Session)為單位與服務(wù)器端建立邏輯請求,按照上述規(guī)則訪問服務(wù)器.模擬瀏覽器可以產(chǎn)生三種不同類型的工作負載,分別是Browsing 類型、Shopping類型以及Ordering 類型[15].因Shopping 類型的工作負載處于Browsing 和Ordering 之間,因此本實驗客戶端主要模擬Shopping 這種類型的工作負載,以隨機生成的概率對不同頁面進行訪問.
表1 實驗環(huán)境配置描述
內(nèi)存泄漏是造成軟件老化的一個重要原因,因此內(nèi)存使用情況是衡量軟件老化的一個重要指標(biāo),通過使用采集到的Java 虛擬機(Java Virtual Machine,JVM) 可用內(nèi)存對Web 資源消耗進行預(yù)測來驗證LSTM 預(yù)測模型的準確性.為產(chǎn)生軟件老化現(xiàn)象,修改了服務(wù)器端商品查詢請求的TPC-W_search_request_servlet 類,為其注入內(nèi)存泄漏代碼.由于JVM 有垃圾回收(Garbage Collection,GC)機制,任何不再被引用的對象都會被垃圾回收器回收,其占用的內(nèi)存也會被釋放以便新對象使用.為模擬內(nèi)存泄漏現(xiàn)象,增加了一個HeapLeak 類,使得Tomcat 的整個生命周期保持對該類HeapLeak 對象的引用,HeapLeak 對象在程序運行期間不會被垃圾回收器回收.修改JVM 堆內(nèi)存的配置(表2),使實驗在受控環(huán)境下進行操作.由于Java 堆存的是對象實例,所以當(dāng)創(chuàng)建的對象實例數(shù)量達到最大堆容量限制后會造成堆溢出.
運行客戶端,每隔1 秒采集一次JVM 內(nèi)存使用量,實驗持續(xù)14 400 s,共4 個小時,采集到樣本14 400 個.每30 s 取一次均值,得到實驗數(shù)據(jù)(圖3).
本文使用Keras 框架搭建并訓(xùn)練LSTM 預(yù)測模型,所使用的網(wǎng)絡(luò)主要由循環(huán)層(Recurrent)中的LSTM 層和全連接層(Dense)組成.取前9650 個點(真實時間近似2.6 個小時)對未來4750 個點(真實時間近似1.4 小時) 進行建模預(yù)測,即使用67% 的數(shù)據(jù)作為訓(xùn)練集,33%的數(shù)據(jù)作為測試集.根據(jù)2.3 節(jié)提出的模型具體構(gòu)建過程對標(biāo)準化后的JVM 內(nèi)存序列建立一個含30 個隱藏神經(jīng)元的單層LSTM 老化資源消耗預(yù)測模型,根據(jù)網(wǎng)格搜索參數(shù)尋優(yōu)法確定模型參數(shù),設(shè)置迭代次數(shù)epoch=20,batch=10,time steps=10,lr=0.001,損失函數(shù)為MSE.采用Adam(Adaptive Moment Estimation)算法對lr 進行優(yōu)化,利用梯度的一階矩和二階矩估計動態(tài)調(diào)整每個參數(shù)的學(xué)習(xí)率,使得lr 平穩(wěn)迭代,模型參數(shù)有效更新.由于深度神經(jīng)網(wǎng)絡(luò)含有多個網(wǎng)絡(luò)層以及大量參數(shù),為防止模型發(fā)生過擬合現(xiàn)象,采用Dropout對數(shù)據(jù)進行正則化處理即在每輪權(quán)重更新時隨機選擇隱去一些節(jié)點,從而限制模型單元之間的協(xié)同更新[16].該模型使用的Dropout 為0.5,即含有Dropout 的網(wǎng)絡(luò)層在訓(xùn)練過程中,會有50%的節(jié)點被拋棄.
表2 JVM 堆內(nèi)存配置描述
為驗證LSTM 模型在循環(huán)神經(jīng)網(wǎng)絡(luò)中的優(yōu)勢,將LSTM 中的隱含層單元替換為RNN 結(jié)構(gòu),按照上述相同參數(shù)進行實驗,結(jié)果如圖4所示.該圖從整體上反映出了RNN 以及LSTM 資源消耗預(yù)測模型的預(yù)測能力,其中實線表示真實值,虛線表示測試值.由圖4可知兩種預(yù)測模型測試值與真實值接近,預(yù)測趨勢與實際資源消耗趨勢基本一致,對于出現(xiàn)較大波動處的點也有較好的擬合,說明RNN 以及LSTM 模型能有效地對軟件老化趨勢進行預(yù)測.
圖3 實驗數(shù)據(jù)
圖4 實驗預(yù)測結(jié)果圖
由2 種模型對應(yīng)的損失函數(shù)圖5(a)、5(b)可知:在老化資源時序預(yù)測問題上,相比于RNN,LSTM 算法訓(xùn)練過程相對穩(wěn)定,測試集上的誤差波動較小.
為進一步驗證LSTM 的預(yù)測能力,將其與傳統(tǒng)預(yù)測方法:ARIMA 以及BP 神經(jīng)網(wǎng)絡(luò)做對比,實驗結(jié)果如下圖6所示,由圖可知LSTM 模型的擬合程度更好.通過對3 種不同預(yù)測模型的評價指標(biāo)進行對比,由表3可知,采用LSTM 網(wǎng)絡(luò)預(yù)測算法在預(yù)測Web 老化資源時,預(yù)測精度明顯高于其他兩種算法.
圖5 實驗損失函數(shù)圖
圖6 實驗對比結(jié)果預(yù)測圖
表3 預(yù)測精度對比
軟件老化是影響軟件系統(tǒng)可靠性的重要潛在因素,本文以一個典型的Web 應(yīng)用服務(wù)器為實例,通過隨機注入內(nèi)存泄漏的方式設(shè)計加速壽命測試實驗來加速系統(tǒng)老化過程,根據(jù)獲取的老化數(shù)據(jù)構(gòu)建了基于LSTM 的Web 服務(wù)器資源消耗預(yù)測模型.結(jié)果證明該預(yù)測模型與Web 服務(wù)器資源老化趨勢一致,擬合度很高,能準確地描述軟件老化現(xiàn)象.與ARIMA 以及BP神經(jīng)網(wǎng)絡(luò)相比預(yù)測度高、泛化能力好、誤差較小,說明LSTM 網(wǎng)絡(luò)模型能夠很好地描述Web 服務(wù)器資源的動態(tài)、非線性變化規(guī)律,適用于老化參數(shù)的時間序列建模.