編者按
本文系北京理工大學科研助理牛頌登所著,本篇也是「 OceanBase 學術加油站」系列稿件第八篇。
「牛頌登:北京理工大學科研助理。 碩士期間在電子科技大學網路空間安全研究院從事聚類和強化學習相關演算法研究,在應用聚類研究個性化線上學習和強化學習的獎勵函式設計方向取得了一定成果,目前研究方向為機器學習和資料庫相結合的領域。」
本文以 VLDB 2021 的三篇 database tuning 論文為例,對機器學習應用在資料庫調優領域的前沿工作做了總結和概述。希望閱讀完本文,你可以對“database tuning”有新的認識,有什麼疑問也可以在底部留言探討。
現代資料庫管理系統(database management systems,下簡稱 DBMS)公開了許多可配置的控制執行時行為的旋鈕。 正確選擇 DBMS 的配置對於提高系統效能和降低成本至關重要。但是由於 DBMS 的複雜性,調優 DBMS 通常需要有經驗的資料庫管理員(database administrators,簡稱 DBAs)付出相當大的努力。 最近關於使用機器學習(Machine Learning,ML)的自動調優方法的研究表明,與專業 DBA 相比,基於 ML 的自動調優方法獲得了更好的效能。
An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems[1]
(一)調優過程
為了更好地理解 DBMS 的配置調優,探究在真實的企業級 DBMS 上 ML 調優方法的效果,論文透過執行在具有非本地儲存的虛擬計算設施上的 Oracle DBMS 例項來比較企業資料庫真實工作負載跟蹤下的三種 ML 演算法(GPR、DNN、DDPG)的調優效果。
論文的主要工作主要是擴充套件了 OtterTune 調優服務來支援三種 ML 調優演算法,並提出了對三種演算法的最佳化,在實驗的過程中發現了一些自動調優技術領域中被忽略的部署和度量問題。
圖 1 OtterTune 架構
OtterTune 是一個調優服務,它用來為 DBMS 的旋鈕配置找到合適的設定,由controller 和 tuning manager 組成。 其中 controller 充當目標 DBMS 和 tuning manager 之間的中介,它在目標 DBMS 上執行目標工作負載,並收集執行時資料(包括旋鈕配置和系統的度量)。Tuning manager 使用 controller 提供的調優會話資訊更新其資料儲存庫,並使用這些資訊建立 DBMS 如何響應不同旋鈕配置的 ML 模型,然後用這些模型來指導實驗並推薦新的配置給 controller,以將配置部署到 DBMS 上。這樣的迭代過程一直持續到使用者對配置的改進滿意為止。
▋ Target Database Application:
因為論文探究的是真實企業 DBMS 的 ML 自動調優對系統效能提升的效果,作者在 Société Générale (SG)多國銀行的實際業務資料下對 OtterTune 框架進行了評估。論文中使用了 TicketTracker 這一資料和工作負載跟蹤的應用程式,對 SG 的工作單據進行 2 小時的跟蹤,收到包含超過 360 萬個查詢呼叫。
作者使用 Oracle Recovery Manager 工具從 TicketTracker 資料庫的生產伺服器上建立了快照,複製了磁碟上未壓縮的 1.1 TB 大小的資料庫,並做了分析,其中 27%為表資料,19% 為表索引,54% 為大物件(Large objetcs)。TicketTracker 資料庫包含 1226 個表,其中只有 453 個有資料的表,資料庫基於它們包含 1647 個索引。
論文中使用 Oracle 的 real application testing(RAT) 工具來捕獲在 DBMS 例項上執行的查詢,RAT 支援在測試資料庫上使用原始工作負載的精確時間、併發性和事務特徵對例項上的查詢進行多次重放;重放的時間被限制在一個 10 分鐘的片段(包含 23 萬條查詢)。
TicketTracker 資料庫相比於之前一些 ML 調優採用的工作負載 benchmark——TPC-C,有數百個表,而 TPC-C 只有 9 個表;TPC-C 查詢的寫的比率佔到46%,而 TicketTracker 裡只佔了 9%。這也表明實際的企業級 DBMS 與已有研究中的 benchmark 有很大不同。
最佳化演算法的目標函式設定為 Oracle 的 DB Time,它用於度量資料庫在處理使用者請求時所花費的總時間,也是 SG 專業 DBA 首選的指標。論文在 SG 私有云的單獨 Oracle v12.2 安裝上部署了 TicketTracker 資料庫和工作負載的五個副本。
(二)調優演算法
圖2 GPR/DNN調優管道
論文中的 GPR 實現基於 OtterTune 支援的原始演算法,採用高斯過程作為先驗函式,計算測試點與所有訓練點之間的距離,該演算法利用核函式來預測測試點的值和不確定度。由兩階段組成,第一個是資料預處理階段,它在 Otter Tune 的資料儲存庫中準備旋鈕配置和系統的度量資料。第二個是旋鈕推薦階段,為旋鈕選擇合適的值。
資料預處理: 目的是為了降低度量的維度,並選出最重要的一些的 knobs。在這一階段首先確定 DBMS 度量的子集,演算法使用因子分析(factor analysis)的降維技術,能夠將度量減少到更小的因子集合。將度量降維後,繼續計算對目標函式影響最大的旋鈕的排序列表。論文使用了 Lasso 的特徵選擇方法,其中旋鈕資料作為輸入 X,輸出的是結合已經修剪過的度量的目標資料。Lasso 在 X 和 y 之間的迴歸過程中確定了重要的旋鈕順序。
旋鈕推薦: 負責在調優會話的每次迭代結束時生成一個新的旋鈕配置建議。該演算法使用上一階段的輸出資料在給定旋鈕排序列表的情況下預測目標 DBMS 工作負載的度量值。然後,演算法使用目標工作負載和當前最相似工作負載的資料構建一個GPR 模型。將給定的旋鈕陣列(x)作為輸入,模型輸出目標值(y)和不確定性值(u)的對(y, u)。演算法計算 y 和 u 之和的置信上限(UCB)。然後在 UCB 上進行梯度上升,以找到能導致良好目標值的旋鈕配置。
因為高斯過程模型在較大的資料集和高維特徵向量上表現不佳[2],所以,論文修改了 OtterTune 最初的基於 GPR 的演算法,使用深度神經網路(DNN)代替高斯模型。二者遵循相同的 ML 管道,都是先進行資料預處理,然後進行旋鈕推薦。
DNN 依賴於對輸入應用線性組合和非線性啟用的深度學習演算法,模型的網路結構有兩個隱含層,每層有 64 個神經元。所有各層均以整流線性單元(ReLU)作為啟用函式完全連線。模型實現了一種稱為 dropout 正則化的流行技術,以避免模型過擬合併提高其泛化。DNN 還在旋鈕推薦步驟期間將高斯噪聲新增到神經網路的引數中,以控制探索和利用。
圖 3 DDPG調優管道
DDPG 方法首先由 CDBTune[3]提出,它是在連續動作空間環境中搜尋最優策略的一種深度強化學習演算法。DDPG 由三個元件組成:(1)actor (2)critic 和(3)replay memory。actor 根據給定的狀態選擇一個動作(例如,對一個 knob 使用什麼值)。critic 根據狀態對選定的動作(即旋鈕值)進行評估,並且提供反饋來指導 actor。actor 的輸入是 DBMS 的度量,輸出推薦的旋鈕值。critic 將之前的度量和推薦的旋鈕作為輸入,輸出一個 Q 值,DDPG 神經網路的 Q 值計算的是對未來所有預期獎勵的疊加。replay memory 儲存按預測誤差降序排列的訓練資料。
對於每個旋鈕 k, DDPG 構造一個元組,其中包含 (1) 先前的度量 m_pre,(2) 當前的度量 m,以及(3)當前的獎勵值 r。在接收到一個新的資料時,CDBTune 首先透過比較當前、之前的和初始目標值來計算獎勵。訓練時從 memory 中獲取一個小批次排名靠前的 tuple,並透過反向傳播更新 actor 和 critic 的權重。最後,CDBTune 將當前度量 m 輸入 actor 以獲得下一旋鈕 k_next 的推薦。
論文對 CDBTune 的 DDPG 演算法進行了一些最佳化,以提高 DDPG 的收斂速度(新方法被叫做 DDPG++)。首先,DDPG++ 使用即時獎勵而不是累積的未來獎勵作為 Q 值。第二點,DDPG++ 使用了一個更簡單的獎勵函式,不考慮之前的或基礎目標值。第三點,DDPG++ 在得到一個新的結果時,從 replay memory 中獲取多個小批次,以訓練網路更快地收斂。
(三)實驗結果
第一個實驗評估了由 DBA 選出旋鈕後再由 ML 調優演算法在增加調優的旋鈕數量時生成的配置的質量。圖 4 顯示了演算法生成的最佳化配置在三個 vm 上的平均效能改進。(每個條的暗和亮部分分別代表每個演算法的最小和最大效能)。
圖4 DBA選出的調優旋鈕
為了理解為什麼配置執行起來效果不同,作者手動檢查了每個旋鈕配置,並確定了三個最重要的 Oracle 旋鈕,當演算法沒有正確設定它們時,會對 DB Time 產生最大的影響。其中前兩個引數控制 DBMS 的主緩衝區快取的大小,第三個旋鈕啟用基於 Oracle 版本的最佳化器特性。
作者發現,GPR 在四個演算法中總是快速收斂,但是 GPR 很容易陷入區域性極小值。DNN 的效能是整體最好的,而 DDPG 和 DDPG++需要更多的迭代次數才能達到好的最佳化效能。
第二個實驗是將人工完全排除在調優過程中。首先為了生成旋鈕列表排序,使用Lasso 演算法,根據旋鈕對目標函式的估計影響程度對其進行排序,並將排序列表分為 10knobs 和 20knobs,以供 ML 演算法進行調優。圖 5 顯示了 10 和 20 個knobs 配置的平均效能改進。
圖5 OtterTune選出的調優旋鈕
論文中認為,20knobs 配置的 DBMS 整體效能較差,部分原因是在 2020 年 8 月初作者進行這些實驗時,私有云儲存上存在更多的共享噪聲,論文中對效能測量的可變性支援了這一解釋。
第三個實驗,作者先在一個工作負載上訓練 ML 生成的模型,然後使用模型去調優另一個工作負載的 DBMS,分析另一工作負載上由 ML 生成的配置的質量。首先使用 OLTP-Bench 執行的 TPC-C 工作負載為每個演算法訓練模型。然後使用 TPC-C 訓練的模型對 TicketTracker 工作負載上的 DBMS 進行迭代調優。圖 6 是演算法在每個虛擬機器上對 SG 預設配置的效能改進。
圖6 對不同工作負載的適應性
CGPTuner: a Contextual Gaussian Process Bandit Approach for the Automatic Tuning of IT Configurations Under Varying Workload Conditions[4]
(一)背景知識
這篇論文做的主要工作跟上一篇有些類似,都是為了找到 DBMS 中能夠提升系統效能的配置,不同的是這篇論文首先認為 DBMS 處於整個 IT 棧的最頂端,下面的 JVM、作業系統的配置調優也都會影響 DBMS 的效能;第二點,DBMS 的效能還跟它所處的工作負載有關,即這篇論文分析的是實時的、線上的自動調優;論文的第三個亮點是它認為目前軟體版本更新的比較快,而且版本更新會修改其可用的引數,那麼從以前的知識庫中重用資訊就讓調優的問題變得比較複雜,因此它提出的方法是不需要利用以前的知識庫的。
圖7 改變MongoDB快取大小和虛擬機器dirty_ratio Linux引數對DBMS效能的影響
圖8 改變JVM併發垃圾收集器的執行緒和Linux核心的read_ahead_kb引數對Cassandra效能的影響
從圖 7 和圖 8 中可以看到,DBMS、JVM 和 OS 的配置都會影響 DBMS 的效能。
(二)所提模型
圖 9 調優過程和架構
論文所提模型的最佳化目標就是在給定的工作負載 w 下,找到一個配置向量 x,將其應用在 IT 棧上面來最佳化系統的效能指標 y。需要注意的是,調優器能夠利用先前所有迭代的 x,w 和 y,但是不需要其他額外的知識,這點是跟比如 OtterTune 這些需要利用其他知識的自動調優不同的地方。
機率模型:貝葉斯最佳化
替代模型: 高斯過程
採集函式: GP-Hedge。GP-Hedge 採用了多種獲取函式的組合,即EI(預期的改進)、PI(改進機率)、LCB(低置信區間)等。
之所以叫基於上下文的高斯過程最佳化,是因為作者認為某些工作負載下的最佳化是相關的,比如工作負載 w 下得到的資料,可能為另一工作負載 w’ 提供一些有用的資訊。基於此作者為高斯過程定義了新的正定核和新的協方差函式,作者認為如果兩個(x,w)組成的點是相似的只要它們的x是相似的或者 w 是相似。但是在最佳化的時候,作者只最佳化了配置空間這一子空間,在每次最佳化的時候是固定了另一維度進行探索和利用。採用基於上下文的高斯過程最佳化的好處是在迭代過程中,所有工作負載的資訊是共享的。
論文是用 MongoDB 和 Cassandra DBMS 來評估 CGPTuner,用了 YCSB 來模擬了三種不同的工作負載模式。實驗時的最佳化目標是在不增加響應時間的前提下最小化記憶體消耗,來提升部署的效益。作者手動選出了調優的引數, 包含 IT 棧不同的元件(DBMS、JVM 和 OS)的引數。為了驗證調優器對於工作負載變化的適應能力,論文中設計了兩種工作負載模式,分別是對三種不同讀寫比例工作負載在一天中(也就是 1 次重複)中持續不同的迭代次數。執行的執行緒數也是變化的,以此來模擬一天中不同的工作負載密度。
(三)實驗結果
在實驗時,作者透過兩種方式來比較不同調優器的度量,一種是以線上的,也就是讓調優器直接在生產系統上執行,另一種是離線的,在測試環境上覆制生產系統。
作者用了兩個指標來衡量這兩種方式下的調優器的質量,分別是線上調優的累計獎勵 Calculative Reward(CR)和離線調優的迭代最佳值 Iterative Best(IB)。如果保持跟預設配置相同的配置,CR 將始終是 0,如果找到的配置比預設配置還差,將會導致負的 CR。也就是說,CR 反映了調優器理解問題和適應工作負載變化的能力。IB 值記錄了當前迭代下記錄的最高的標準效能改進,它反映了調優器快速探索並且找到良好配置的能力。
圖10 在Cassandra DBMS上執行單峰workload模式
圖 10 是載入單峰的工作負載的結果,從 IB 值得變化可以看到 CGP 相較於另外兩種線上調優演算法,能更快找到良好的配置,並且找到的配置質量高於另外兩種演算法;從 CR 值的變化情況可以看到,OpenTuner 和 BestConfig 的累計獎勵值在持續地負向增加,也就是說這兩種演算法找的配置始終比預設的設定更差,而 CGPTuner 在第 3 天開始 CR 值開始正向增加,並且在第六天累計獎勵的值開始為正值並不斷增加;在另一種工作負載模式上的結果類似。
圖 11 Cassandra 單峰調優的非標準化記憶體和吞吐量
除了從最佳化的角度比較了各種演算法外,作者還從吞吐量和記憶體消耗的角度來比較了三種演算法。圖 11 中的點是 Cassandra DBMS 在單峰工作負載模式上每個調優器獲得的中值。可以看到,在調優的第二天,CGP 已經基本上收斂,它為 Cassandra 快取設定了一個較低的值,並根據傳入的工作負載改變了 JVM 堆的大小,而且這兩個引數都非常接近於最佳配置。而 OpenTuner 和 BestConfig 都沒有達到收斂,始終為這兩個記憶體引數尋找更高的值。至於吞吐量方面,CGP 在大多數工作負載上都能獲得更好的結果。
綜上,基於上下文的調優器能實現更高吞吐量的同時分配更少的記憶體,同時能根據到來的工作負載變化 JVM 堆的尺寸。
The Case for NLP-Enhanced Database Tuning: Towards Tuning Tools that “Read the Manual”[5]
(一)背景知識
本篇論文認為從文字文件中挖掘提示可以為現在的自動調優方法如主動學習、DRL 等加速收斂,以及減少訓練所需的資料量,作為這些方法的補充。資料庫調優知識是以自然語言文字的形式提供的。例如,資料庫管理員在最大限度地提高不熟悉的系統的效能時,都會首先查閱資料庫系統手冊。除了手冊之外,在網路上的部落格、線上論壇或科學論文中還發布了無數的調優提示。相關知識不僅隱藏在文字文件中。甚至配置檔案中調優引數的名稱以及相關的註釋,可能也提供了一些直觀的語義和值得嘗試的值。
(二)所提模型
圖12 NLP增強的資料庫調優器
圖 12 顯示了 NLP 增強型資料庫調優工具的模板,系統、資料和查詢相關的文字用於形成最佳化的先驗。首先,從系統手冊、網上部落格、論壇、關聯的註釋以及科學論文裡抽取出相關知識作為先驗文字。然後論文所提的原型系統可以從輸入的先驗文字中挖掘資料庫系統的調優提示。
圖13 論文所提原型概述
管道的第一階段首先用基於 Robert-a 語言預處理模型提取出含有建議特定引數的值或者範圍的關鍵語句,以及上下文。
圖14 透過谷歌查詢“Postgres資料庫調優”和MySQL資料庫調優
得到的前十個調優提示網頁文件的子集
以 Postgres 和 MySQL 的手冊為例,可以提取出這些關鍵語句和上下文。例如第一條語句,(滿足條件 RAM 的記憶體大於 1GB 時)可以將其轉換為等式 shared_buffers = ¼ memory。
接下來,使用 Robert-a 的分類器根據關鍵語句的型別對其進行分類,這裡假設的是每個提示都可以被轉換成一個涉及所引用引數的等式。語句按型別分為建議引數為特定值的提示、定義下限、上限或推薦值集合的提示。然後根據分類後的關鍵語句,提取引數名稱和提示的值。最後對不同文件提取出的提示進行彙總,為了減少噪聲和剔除相矛盾的屬性,論文最終用到的提示是過濾後的,至少在獨立的文件中出現兩次的調優提示。
這篇論文相比前兩篇配置調優的論文,有一些缺點,就是所提原型的文字分析不支援不同工作負載下的調優;另外,僅支援提取特定的引數值以及主記憶體的百分比,對於引數值範圍的提取不適用。
(三)實驗結果
為了使任務更具挑戰性,論文使用提示為一個資料庫系統訓練兩個分類器,用來自一個分類器的文件訓練分類器,並處理為另一個系統檢索的所有文件,即在以另一個系統為目標的文件上測試用第一個系統的資料訓練的分類器。
圖15 Postgres訓練產生提示後處理MySQL提示時的質量度量
圖16 MySQL訓練產生提示後處理Postgres提示時的質量度量
綜上,該論文建議使用文字文件和片段作為資料庫調優中的一個額外的資訊源,提出並評估了一個 NLP 增強型資料庫調優器的簡單原型來利用這些資訊作為補充或證實其他資訊源,並演示了與預設配置相比,自動解析來自Web的資訊可以產生顯著的加速。
本文透過三篇資料庫調優相關論文對其各自工作進行概述,希望能在帶給讀者相關概念的同時,啟發創新靈感。由於篇幅所限,本文並未列出所有資料庫調優相關論文,而只是以近年論文為起點,給出些大致的研究方向,感興趣的讀者還需要在此基礎上繼續探索。
*參考文獻:
[1] An Inquiry into Machine Learning-based Automatic Configuration Tuning Services on Real-World Database Management Systems. PVLDB, 2021.
[2] Black or White? How to Develop an AutoTuner for Memory-based Analytics. SIGMOD, 2020.
[3] An End-to-End Automatic Cloud Database Tuning System Using Deep Reinforcement Learning. ICMD, 2019.[4] CGPTuner: a Contextual Gaussian Process Bandit Approach for the Automatic Tuning of IT Configurations Under Varying Workload Conditions. PVLDB, 2021.
[5] The Case for NLP-Enhanced Database Tuning: Towards Tuning Tools that “Read the Manual”. PVLDB, 2021.