歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
作者:邢家樹,高階工程師,目前就職於騰訊TEG基礎架構部資料庫團隊。騰訊資料庫技術團隊維護MySQL核心分支TXSQL,100%相容原生MySQL版本,對內支援微信紅包,彩票等集團內部業務,對外為騰訊雲CDB for MySQL提供核心版本。
導語:CDBTune是騰訊雲自主研發的資料庫智慧效能調優工具。相比於現有業界通用方法,CDBTune無需細分負載型別和積累大量樣本,通過智慧學習參與引數調優,獲得較好的引數調優效果。
資料庫系統複雜,且負載多變,調優對DBA非常困難:
- 引數多,達到幾百個
- 不同資料庫沒有統一標準,名字、作用和相互影響等差別較大
- 依靠人的經驗調優,人力成本高,效率低下
- 工具調優,不具有普適性
總結起來就是三大問題:複雜,效率低,成本高。騰訊雲的智慧效能調優工具如何在不斷實踐中破解這些問題呢?
實踐一:啟發式搜尋方法/Search-Based Algorithm
輸入包括兩部分:
- 引數約束:包括要調優的引數集合和引數的上下界;
- 資源的限制:調優過程在多少輪以後停止。
**Configuration Sampler:**會對輸入引數進行取樣,生成配置;配置會被設定到SUT(也就是待調優環境)。System **Manipulator:**它和SUT進行互動,設定引數,並且會獲得SUT的效能資料。
Performance **Optimizer:**根據配置和效能資料找到最優的配置。PO演算法主要包括兩個方法:DDS和RBS。
lDivide-and-Diverge Sampling (DDS)
這裡通過DDS來劃分引數的子空間,降低問題的複雜度。首先把每個引數劃分成k個區域,那麼n個引數就有k^n個組合,從而降低複雜度。假設k和n如果比較大的話,空間可能還是很大。如何處理?此時可用超抽樣的方法,只抽出k個樣本解決。
lRecursive Bound-and-Search (RBS)
在一個效能平面上的某個點附近,總是能找到效能相近或者更好效能的點,也就是說可能找到更好的配置。在已有的樣本里,找到效能最好的那個配置。然後在這個配置周圍,執行多輪,遞迴尋找可能更好的配置。
基於搜尋的方法可能的問題是,抽樣和測試可能耗時很長,而且可能陷入區域性最優。
實踐二:機器學習方法/Machine Learning
主要包括三個步驟:
l識別負載特徵
對metric進行了降維,metric是指系統的內部狀態指標,比如MySQL的innodb_metric。這裡用了兩個方法,一個是FA,一個是K均值聚類。
- 識別配置引數和效能的相關性
配置引數有幾百個,先通過Lasso線性迴歸引數和效能的關係進行排序。優先考慮對效能影響較大的引數。
- 自動調優
匹配目標workload,也就是根據負載在不同配置下面執行,表現出來的metric特性,匹配到最相似的負載。然後,根據匹配到的負載,推薦最優的配置。這裡用到高斯過程,同時加入exploration/ exploitation,即探索、利用的過程。
這種方法的問題是,調優過程非常依賴歷史資料,要匹配到相似的workload才可以,對訓練資料要求比較高。如果匹配不到,則找不到很好的配置。
實踐三:深度學習方法/Deep Learning
通過深度學習網路,推薦需要最終調節的引數:
- 獲得Workload對應的內部metric
- 學習調參過程中內部metric的變化規律
- 學習最終需要調節的引數
這個模型高度依賴訓練資料,需要獲得各種負載在各種配置下的效能資料。而資料庫的負載和配置的組合實在太多了,基本不可能覆蓋到。假設匹配不到類似場景,調優結果可能不理想。
實踐四:深度強化學習方法/Reinforcement Learning
在強化學習中,模擬人與環境互動的過程。Agent會根據觀察到的狀態state,做出相應的反應action。同時,Environment接受action,改變自己的狀態。這個過程會根據一定規則,產生相應的reward,也就是對於action的評價。
最終通過實踐比較,我們選取使用強化學習的模型,開發資料庫引數調優工具CDBTune。它強調調參的動作,擺脫以資料為中心的做法。
強化學習與引數調優,我們定義如下規則:
- 規則:每間隔一定時間調參,獲得效能資料
- 獎勵:效能提高獲得正獎勵值,下降獲得負獎勵值
- 目標:調參時間/次數儘可能少,獲得較高的期望獎勵值
- 狀態:系統內部metric指標
我們把系統的內部metric叫做內部指標;外部的效能資料,比如TPS/QPS/Latency叫做外部指標。在資料庫引數調優場景中,具體做法是:Agent選擇一個引數調整的action(也可能是多個引數)作用於資料庫,根據執行action後的外部指標,計算應該獲得的即時獎勵。
在強化學習對應到引數調優這個場景。此場景的問題是:強化學習需要構造一張表,表明在某種狀態下,執行某個操作,獲得的收益後,我們才知道執行什麼操作獲得的收益是最大的。但是資料庫的狀態空間(效能指標)和動作空間(配置組合)特別大,組合這樣一張表出來是不可能的任務。此時深度強化學習就派上用場了,我們要通過一個深度網路逼近這個Q-table的效果,也就是CDBTune的實現方法。
CDBTune實現
- S為當前資料庫效能狀態(內部指標),S'為下一狀態資料庫效能狀態
- r為即時獎勵,w為神經網路引數,a為採取的動作(配置引數的執行)
- Q為狀態行為價值函式
此模型主要分成兩部分。
l資料庫環境:如圖左邊,引數會被設定到這個環境裡,然後環境的內部指標和外部指標會被採集,反饋給右邊的模型。
l深度強化學習網路:如圖右邊,實現演算法類似DeepMind釋出的Nature DQN,採用兩個Q-Network。
另外,Replay Memory是我們的記憶池,歷史資料會被記錄下來。然後訓練會不斷進行,不斷加入記憶池。深度學習網路會從記憶池中隨機選取樣本機型訓練。
在估計一個action的reward的時候,基於一個假設:我們的回報取決於對未來每一步的結果影響;而影響最大的,是最近的回報。通過
近似獲得這個Q值。對於一個樣本(s, a)而言,我們可以得到真正的回報r。這時候我們可以獲得他們之前的Loss,調整左邊的網路,使兩邊的Loss越來越小。這樣我們的網路就會逐漸收斂,獲得更好的推薦。
資料形式和相關策略
效果評估
通過測試可以看到,在不需要任何前期資料收集的情況下,CDBTune通過自我學習引數調優過程,達到較優的引數調優效果,CDBTune調優獲得的吞吐和延時效能均達到較為理解的水平。這也是深度強化學習方法相對於其他幾種方法的優勢所在。
總結:
基於DQN智慧調參的優勢
- 化繁為簡,無需對負載進行精確分類
- 調參動作更符合實際調參時的情況
- 無需獲取足夠多的樣本來,減少前期資料採集的工作量
- 利用探索-開發(Exploration & Exploitation)特點,降低對訓練資料的依賴,減小陷入區域性最優的可能性
在實踐過程中,我們也遇到一些問題:
- 選擇動作實際執行,訓練效率不高,訓練週期長
- 對連續配置離散化處理,可能導致推薦配置的精度不高,收斂較慢
- 使用動作的最大Q值,導致Q值的過高估計問題
針對這些問題,我們也在不斷優化和改進我們的模型,優化引數。相信CDBTune可以在未來取得更好的效果。
此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1140693?fromSource=waitui
歡迎大家前往騰訊雲+社群或關注雲加社群微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~