(武漢大學計算機學院,武漢 430072)
數據庫參數調優是一項維持或提升數據庫性能的重要工作。由于數據庫的性能受到多個參數共同影響,再加上可調參數數量、數據庫體量和業務量的劇增,導致傳統基于人力的參數調優越來越困難。隨著自治數據庫[1]技術的發展,數據庫自動參數調優技術成為了解決這一難題的主要選擇之一。
得益于機器學習技術的發展,現在已經出現了一些數據庫自動參數調優方法[2-3]和系統[4-5],例如OtterTune[2]。在這些方法中,對調優目標系統的工作負載的了解是進行調優的基礎。只有準確地描述負載,才能找到與目標負載最相似的歷史負載,從其對應的參數配置尋找目標負載的最優配置方案。
對負載的了解依賴于負載的描述、匹配以及預測方法。數據庫負載的描述主要有兩種方式:1)用負載所含的操作描述,例如SQL(Structured Query Language)語句的到達率[6-9]、SQL 到達率與數據庫信息的結合體[10]、每秒事務總數與事務類型的混合率[11];2)使用運行時數據庫中各項資源利用率或性能指標描述,例如系統資源(內存、中央處理器(Central Processing Unit,CPU)和磁盤等)的利用率、數據庫資源(緩沖區、鎖等)的利用率[12-15]、并發用戶數和響應速度[16]。
雖然這些描述方式各有優勢,但都是以點概面地以負載在某個時間點的表現來概括其整體特征,而忽視了負載會隨時間變化的動態特性。這種以偏概全的描述方式實際上制約了調優方法的有效性和準確性。
針對現有自動調優工具中采用的負載描述和匹配方法無法捕捉負載動態特性的問題,本文提出了一種動態負載描述方法以及相應的匹配算法,并將其應用于OtterTune 上,并通過實驗驗證了其有效性。本文的主要工作總結如下:
1)提出了一種可捕捉負載動態特征的描述方法來更準確地刻畫負載;
2)提出了一種基于動態時間規整(Dynamic Time Warping,DTW)[17-18]的動態負載對齊方法,并以其為基礎提出了基于數據對齊的動態負載匹配算法;
3)將上述方法應用于OtterTune 中擴展形成了基于動態負載的自動參數調優工具D-OtterTune(Dynamic workload based OtterTune),并利用實驗驗證了本文方法的有效性。
自動參數調優第一步需要得到目標數據庫當前的負載特征。數據庫的負載變化形態各異,無論是聯機事務處理(OnLine Transaction Processing,OLTP)還是聯機分析處(OnLine Analytical Processing,OLAP)型業務,負載變化是非常頻繁的。圖1 給出了兩種以數據庫內部性能指標描述的負載,從中可以看到,如果以t=6 min 采集的數據來表示負載,則workload1 和workload2 會被視為相同。事實上,workload1表示的負載比較穩定,而workload2 表示的負載波動較大,采用靜態負載描述無法真正區分不同的負載。
圖1 兩類不同特征的負載Fig.1 Two workloads with different characteristics
為了更準確地描述負載,本文針對負載的動態變化特性,基于多次采樣思想,在觀察期內進行多次性能數據采集,用這些連續的性能切片來刻畫負載的動態變化。
首先引入Dialogue的概念來表述觀察期,Dialogue是一次觀察期間多個采樣點的集合,可表示為式(1):
其中Result為采樣點,Result表示為二元組其中Knobs為配置參數值向量,Metrics是目標數據庫的內部性能指標向量,同一觀察期中采樣點的Knobs向量相同。觀察期中的Metrics序列則反映了目標數據庫上負載的變化,其時序特性使得上述動態負載描述方式能夠更準確地描述負載的動態特征和波動情況。
在實際應用中,由于同一Dialogue中的采樣點具有相同的Knobs部分,且Metrics部分中的一些分量值也可能相同,因此可以在動態負載描述數據的傳輸、存儲過程中采用適當的壓縮技巧和算法來減小數據量。如果將Dialogue中的Knobs部分進行壓縮,理論上可以達到將近50%的壓縮率,可以有效緩解由于多點采樣帶來的通信量和存儲的膨脹。
在自動參數調優方法中,取得當前負載的動態描述之后,需要進行負載匹配,從而得到合適的配置參數作為參數優化探索的基礎。負載匹配的準確度密切影響著性能預測、配置推薦等后續操作的精確度。對于帶有時序特征的動態負載數據匹配,直接基于歐氏距離的向量相似度計算方法不再適用。為解決這一問題,本文提出了一種基于DTW 的動態負載數據匹配方法。
在基于單點采樣的負載匹配中,只用單個點的負載數據與歷史負載數據進行相似度的比較,所以兩點之間計算歐氏距離時,并不存在波形的相位偏移問題。在采用了動態負載描述后,則是由多個形式的采樣點來表示負載形態,這些具有時序特征的連續采樣點可視為負載變化的過程。盡管采集的數據是離散點,但這些采樣點序列仍具有波形的部分特征,如周期、峰值和頻率。
對動態負載描述進行相似性匹配,需要比較兩個時間序列之間的相似性。簡單地把歐氏距離用于采樣點序列匹配存在以下局限性:1)兩個序列的長度必須長度相等。由于需要計算兩個序列中每對對應點之間的差值平方和來比較相似性,因此必須保證兩個序列上的點之間一一對應。2)兩個序列在形狀的變化上具有位置一致性,即兩個波形不能存在相位差和峰值的偏移,否則相似性的計算結果會有較大偏差。如圖2 所示,兩個峰值點a、b本應是對應的,但由于峰值偏移導致峰值點a與b'對應,顯然在這種情況下使用歐氏距離計算會使序列匹配的精度下降。
圖2 兩個不同時序長度的峰值點之間的偏移誤差Fig.2 Offset error between peak points of two different time-series lengths
動態時間規整(DTW)算法基于動態規劃的思想,解決了傳統歐氏距離匹配上的限制問題。DTW 算法能通過動態規劃,找到在兩個匹配序列中和位置最相匹配的點。
如圖3 所示的峰值偏移,目標序列中的峰值點通過使用DTW 算法能夠找到匹配序列中對應峰值的位置,并將兩個點作為距離計算的對齊點。這樣便解決了相位、峰值偏移的問題;但單純使用DTW 算法無法過濾噪聲,需要配合使用波形變換來預處理降噪。
圖3 歐氏距離計算和動態時間規整算法Fig.3 Euclidean distance calculation and DTW algorithm
相位和峰值偏移會導致動態負載數據的匹配準確率低下。在進行匹配之前,首先需要對歷史收集的動態負載數據進行對齊,才能保證訓練集的準確性和模型的精確度,從而保證后續匹配操作的準確性。
本文采用了一種基于DTW 思想的動態負載數據對齊方法來處理歷史動態負載數據,其過程如算法1 所示。算法輸入是歷史負載數據集C,輸出是Metrics序列對齊后的數據集SC。算法中先選取一條長序列作為對齊標準,之后主要分為2 個步驟:1)首先基于DTW 算法進行Metrics序列相似度對齊,使用最大前綴匹配策略(循環補齊左平移);2)然后將對齊后的數據集中長度不一的序列進行長度規整。對于長度不夠的序列,可以拷貝其他標準長度序列的尾部來進行長度補齊,這樣可以盡可能保留負載描述的細節。
算法1 基于DTW的動態負載數據對齊。
數據對齊開銷較大,對于數據集中的每個Metrics序列都要進行平移和計算。從算法1中可以看到,假定數據集中有k次觀察的Dialogue數據,最長的序列采樣n次,那么算法時間復雜度如式(2)所示:
其中:n對應于每個序列進行平移的次數,n2為每次平移之后進行DTW 算法匹配的時間復雜度,最后乘以數據集中序列的個數k。理論上,k是遠遠大于n的,所以其復雜度是O(k*n3)。不過,數據對齊是對歷史數據集定期進行的預處理,并不需要太高的實時性,因此這種復雜度仍處于可接受的范圍。
在進行當前負載與歷史負載的匹配工作時,可以直接使用DTW 算法來計算負載中Metrics序列的相似度。雖然DTW能夠解決一定的相位、峰值的偏移問題,但是會導致部分數據無法匹配的問題。
如圖4 所示,X和Y序列之間存在一定的相位和峰值偏移,DTW 是基于時序序列的匹配,強調從前到后的序列化匹配過程。從圖4來看,X序列的前幾個點會直接開始匹配Y序列中間部分點,Y序列完結后會導致X之后的序列都只能在Y序列的最后一點上進行復制匹配,而無法匹配Y序列中的前幾個點。
圖4 DTW算法的部分數據對齊Fig.4 Partial data alignment of DTW algorithm
DTW 方法雖然能夠探索兩個序列之間的相似度,但是需要兩個序列的開始和結束的統一性。因此,方法DTW 算法可以用于不規則序列匹配,但是會因為時序交叉損失部分序列的匹配精度。
本文針對動態負載,提出了一種基于數據對齊的匹配算法,如算法2所示。
算法2 基于數據對齊的動態負載匹配。
算法2 中使用序列循環補齊左平移來減少序列之間的相位差值。如圖5所示,Y曲線尾部虛線位置為左側序列的循環補齊,序列循環補齊之后,時序交差的大部分頭尾部分能夠得到最大限度的匹配。由于采樣粒度的問題,并不能保證兩段序列采樣的開始點和結束點都完美一致,但是這已經盡最大限度擴大了序列中部分匹配的長度,減小了因序列交錯導致不匹配而產生的誤差。
圖5 循環補齊平移后的數據對齊Fig.5 Data alignment after cyclic complementary translation
為了測試基于DTW 的動態負載匹配方法對數據庫自動參數調優問題中的效果,本文以OtterTune 為基礎,將其負載描述和匹配方法替換為本文提出的動態負載描述和匹配方法,形成了一個衍生系統D-OtterTune。OtterTune 和DOtterTune 架構模型相同,使用單獨的外部調優系統,調優系統和目標數據庫系統分離。外部調優系統優點就是在繁重的分析處理中不會干擾到數據庫本身的業務負載。然后部署一個GreenPlum 作為目標數據庫系統,利用OtterTune 和DOtterTune 對其進行參數調優,對比最后的調優性能以及調優過程中負載匹配的準確度。
實驗中采用3 臺服務器構建測試集群,1 臺作為Master 節點,其他2 臺作為Segment 節點,服務器配置均為Intel Xeon E5 2603,16 GB 內存,1 TB 固態硬盤。各節點操作系統采用Ubuntu 16.04,GreenPlum版本為6.0。
實驗中采用TCP-H測試基準產生對測試集群的負載。設置測試數據量為30 SF(Scale Factor)。TCP-H 共有22 條壓力查詢語句,隨機使用這些查詢語句對測試數據庫進行并發訪問,其中隨機選取時間段增加/減少并發度以形成負載測度上的波動。
在實驗中進行了兩個方面的對比:
1)在D-OtterTune 中將本文匹配方法與傳統基于歐氏距離的匹配方法進行比較。進行兩次完整的配置推薦過程,一次是采用傳統的非數據對齊、基于歐氏距離匹配算法來推薦配置;另一次是將數據集數據對齊之后,采用DTW 的動態序列匹配算法進行匹配后推薦的配置。通過推薦的效果來展示本文提出的動態負載匹配方法的效果。
2)分別用OtterTune 和D-OtterTune 對同一個負載進行調優,比較兩者推薦的參數配置產生的性能。在這個實驗中,還增加了一個對照系統N-OtterTune,該系統在OtterTune 中采用動態負載,但不做數據對齊且采用傳統的歐氏距離匹配方法。
在對數據對齊效果的測試中一共采集26 個Dialogue對話,每次采樣的時序深度為20 次,觀察期長度為20 min,即1 min一次性能采樣,一共得到了16組長度為20的時序序列。由于每個時序點是一個Metrics向量,為了觀察數據對齊的效果,使用Metrics中變化明顯的blkshit和blksread元素組成的命中率來表示數據對齊的效果:
圖6 展示了測試中采集到的3 個比較有代表性的命中率折線圖,其中橫坐標為時序點,縱坐標為命中率。由于采樣點的粒度和開始采樣時間的不同,圖6 中命中率變化折線存在明顯的相位和峰值偏移。進行數據對齊之后,這3 個序列的情況如圖7所示。
圖6 數據對齊前3條代表性的命中率曲線Fig.6 Three representative hit ratio curves before data alignment
圖7 數據對齊后的3條代表性命中率曲線Fig.7 Three representative hit ratio curves after data alignment
為了對比采用動態負載前后自動參數優化方法的推薦結果,實驗中采用3.2 節中采集到的數據集,利用OtterTune 和D-OtterTune 完成了3 次完整的配置推薦過程:第1 次采用OtterTune 推薦(origin metrics),第2 次采用N-OtterTune 推薦(normal metrics),第3 次采用D-OtterTune 推薦(align-data metrics)。
在得到推薦配置之后,分別將3 種推薦配置應用于同一個目標集群,并進行TCP-H 壓力測試采集性能表征數據。為了可視化對比結果,同樣采用hit_ratio 來代表推薦配置的性能指標,如圖8所示。
圖8 總體性能比較Fig.8 Comparison of overall performance
從圖8 可以發現,與OtterTune(origin metrics 折線)相比,N-OtterTune(normal metrics 折線)在性能上并沒有明顯提升。而進行了數據集對齊且采用了本文提出的動態負載匹配方法之后,D-OtterTune(align-data metrics 折線)對負載的擬合精度得以提升,以hit_ratio 為代表的性能指標在整個觀察期間幅度都有穩定提升。提升率達到3%,在數據密集型應用中,對整體業務性能可以產生明顯影響。這也進一步證明了本文提出方法的有效性。
針對數據庫的自動參數調優問題,本文分析了工作負載的靜態描述所存在的問題,提出了一種動態負載的描述方式,能更準確描述工作負載變化情況。針對動態工作負載序列匹配存在的序列不規則的問題,本文基于DTW 算法提出了一種使用數據對齊思想的數據聚合方式。然后提出了一種基于數據對齊的動態負載匹配算法,并將其引入自動參數調優系統OtterTune 中形成了D-OtterTune。最后通過實驗驗證了以上方法的有效性。
對于穩定和周期性變化的負載,可以很好地利用歷史數據集進行學習并推薦配置。但當在遞增型負載的模型下,當前性能的采集并不能代表將來的負載形態,所以不能直接使用歷史庫中數據的配置來進行推薦。本文未來的工作將探索一種能夠利用當下采集的負載變化趨勢,來對將來的負載進行預測的學習模型,然后根據預測的負載形態來進行配置推薦。