朱文俊,徐 壯,秦家佳,李 鵬,2
(1.南京郵電大學計算機學院,南京210023;2.江蘇省高性能計算與智能處理工程研究中心,南京210023)
內存數據庫因具有低延時的數據訪問特點,已成為當前互聯網服務重要的加速引擎。然而,DPDK[1]技術的出現以及批次處理[2]技術的廣泛應用,給內存數據存儲帶來了新的要求。目前主流的內存數據庫有Amazon 提出的Dynamo[3]、Facebook提出的Memcached[4]、Facebook 與Yahoo!共同完善的HBase[5]。在上述系統中,雖然為數據存儲提供了極高的讀/寫操作性能和高效的數據管理服務,但是面對高吞吐、高并發、高負載的復雜網路存儲環境,如何配置運行參數來調優內存數據庫的性能,成為網絡數據存儲的一項重要挑戰。由于DPDK 與Redis[6]在協同存儲過程中依賴于程序人員的經驗配置來滿足不同場景下的網絡存儲要求,因此會出現資源參數配置不足和資源參數配置過剩的問題。雖然Redis 提供了幾種不同的數據分發策略,例如數據分片[7]、Hash slots[8]等方式來優化存儲的性能,但是數據分發的策略受到系統參數的直接影響,而采用默認參數配置無法適應多變的應用環境,尤其在DPDK 的高速網絡數據存儲情況下更為明顯。在高達10 Mpacket/s[9]以上的速率時,如何配置合理的存儲參數,從而滿足系統需求是解決該問題的重要方向。在存儲過程中吞吐量和時延是表現數據存儲效率的重要特征,而采用默認參數配置無法正常發揮數據庫的存儲性能,使得存儲吞吐與時延無法符合實際應用場景的需求。
而解決此類性能優化問題的最主要途徑是通過對Redis 系統參數的分析,來尋找到最優的資源配置,從而使得DPDK 下不同網絡數據存儲都能達到最優的性能。
本文通過形式化分析DPDK 下的Redis 存儲I/O優化模型,根據批次大小等存儲參數對性能的影響層度,分層建立性能感知模型。在此基礎上,通過遺傳算法[10]迭代尋找出最優的參數方案,從而根據環境變化調整參數配置,提升存儲I/O 吞吐量,降低操作過程的時延,達到優化整體性能的目的。
隨著DPDK 技術的出現,網絡數據呈現多樣化發展。與傳統技術相比,所需存儲的數據規模、數據復雜度、數據完整性對網絡數據存儲系統的讀寫性、可用性、有效性都提出極高的性能需求。而參數自動調優技術是高速存儲I/O 優化的重要研究方向,參數調優技術是指在一系列參數特征中,通過某種性能度量或者反饋機制,尋找出當前環境下最優的配置項組合。
目前常用的存儲統參數調優方法包括3 個方面:控制反饋方法,參數搜索方法和統計學習[11]方法。控制反饋方法[12]是基于參數配置規則的動態反饋來控制參數配置,主要方式是通過性能監控套件[13-14]或者建立相應規則來根據運行情況做出調整,如文獻[15]提出一種名為PCM 的基于策略驅動的存儲系統配置系統,該系統可以捕獲不同工作負載的調整參數作為配置策略。在多種工作負載下,PCM 配置下的工作性能優于默認配置,使得吞吐量顯著提高。但是這種基于策略驅動的優化方法在運行中需要頻繁進行策略更替,提高了時間成本。參數搜索法[16]則是將參數配置作為黑盒處理,使用搜索算法針對特定系統的特定性能情況進行搜索,當搜索環境發生變化時該方法不適用,并且在優化參數配置時每次都需要運行具有大量輸入數據集的應用程序,會耗費大量時間和系統資源。另一種方法是基于統計學習的優化方法,其通過已有的配置項和性能組成的數據集樣本進行學習并訓練性能模型。該方法能夠有效實現對性能預測,但是性能模型建立的準確性會直接影響到優化效果,并且特征過多導致樣本數據過大也是該方法的弊端。文獻[17]將系統參數配置與機器學習進行有效結合,提出一種根據不同的學習體系結構來促進配置調整任務的優化方法,其中參與者和批評者都由多層神經網絡實現,并利用誤差反向傳播算法[18]根據學習中產生的時間差誤差調整網絡權重,但是該方法局限于只能針對單一服務器進行,在面對多個節點服務器情況時會失效。文獻[19]提出了一種給定的工作負載下應用程序自動調整配置參數的新方法,稱為ATH。該方法構建以配置參數為輸入的低成本精確性能模型,有效提升了系統的吞吐量,但是該方法中的模型以時延和吞吐通過線性加權的方式進行構建,缺少對存儲流程以及歷史作業的分析,缺少參數與參數之間關聯性的考慮。文獻[20]提出一種AutoConfig 算法,使用抽樣的方法將大量配置項抽樣出多個參數,提高了建模的性能。短板在于沒有考慮到多個配置項之間的關系,對于2 個具有相關性的參數,其通常會考慮選擇其中1 個。
上述方法能在一定程度上解決存儲系統繁瑣的參數配置調整問題,但未能考慮存儲調優中模型建立的非線性關系以及參數特征數目巨大問題,因此,需要一種更加精確的性能優化算法,使得在DPDK下以Redis 為代表的內存存儲系統利用能夠充分考慮參數之間的相互作用關系,提升調優效率。本文提出一種存儲I/O 調優方法,通過特征篩選以及建立基于作業特性的漸進感知模型,解決默認參數導致的性能瓶頸問題。
解決DPDK 下內存存儲參數配置問題目的是尋找出最優的配置方案,使得存儲的吞吐量與時延達到當下應用環境的近似最優值。對于Redis 本身架構而言,整體性能的衡量是通過應用端和服務端2 個方面來進行評估。在要素特征上分析主要包括寫入比例、請求交方式、存儲數據大小、請求并發量等因素。
假設Redis 集群中主節點有M個,則節點的集合為M=(m1,m2,…,mM),且每個節點中資源受到集群的內存、網絡、存儲等方面影響,即Sio=(Ej,Oj,Sj),Ej表示該集群中第j個工作節點提供的內存資源,Oj為節點j上可以提供的網絡資源,Sj為節點j提供的存儲資源。此外,需要評估數據庫中的負載情況,則具體通過Wj表示第j個節點的工作負載。其中,由于DPDK 利用批次和管道處理來優化數據存儲,因此設定管道一次請求數為BS而總數據接收批次為BT,則整個存儲過程中數據的有效批次比例如下:

本文所考慮的場景是高速網絡環境的數據存儲,所以針對的應用場景為寫密集。因此,設定請求數據為,并且假設Redis 數據庫中各個節點在數據寫入中的分配比為Aj,抽象出的資源需求公式化表達為:

從式(2)可以看出,基于DPDK 的高速網絡存儲機制是依賴于多種因素的影響,且整個資源需求受限于總體資源的限制,而總體資源又受到Redis 與DPDK 的配置參數直接影響。
那么對存儲I/O 性能優化問題,即性能最優值與參數配置關系可以定義為:

其中:X表示DPDK 與Redis 的配置參數組合;SPF 則是需要獲取的性能模型,代表了具體應用下配置參數與應用性能之間的關系。
本文針對DPDK 下Redis 存儲的性能優化問題,設計一種漸進感知模型,其核心在于根據各階段的歷史數據來分層構建性能模型。將底層參數與應用層參數的相互作用考慮到模型構建中,從而改進傳統的加權回歸預測模型,并且將所得模型與遺傳算法相結合形成GTS 配置優化算法。遺傳算法可以在計算預測模型時有效避免局部最優解的產生,相較于粒子群算法以及經典的最小二乘法(Ordinary Least Squares,OLS),更加適合漸進感知模型的特性。
本文提出的GTS 算法主要分為3 個部分:第1 部分是進行特征篩選,該部分在獲取原始特征基礎上使用ANOVA 進行正交實驗,生成一定配置組合參數,運行在Redis 與DPDK 上使其生效,并且通過測試框架模擬高速負載的存儲環境,從而獲取初始的性能數據集;第2 部分是進行性能模型的構建與訓練,在這部分中改進了常用的加權回歸模型,將底層DPDK 參數和應用級Redis 參數與性能建立漸進感知模型,通過多個局部模型的訓練進一步生成系統整體模型,充分考慮參數與參數的關聯性;第3 部是性能優化,將第2 部分所得漸進感知模型與遺傳算法相結合,通過多次迭代尋找出性能最優解以及最優參數配置。整體優化架構如圖1所示。

圖1 整體優化框架Fig.1 Overall optimization framework
本節對本文所提出的存儲I/O 調優方法的具體實現進行敘述,該方法通過使用ANOVA 對存儲中涉及的特征進行篩選,并且改進原有線性回歸的建模思想,考慮模型中各部分參數的相互影響。存儲參數調優算法主要分為特征篩選、漸進感知模型構建及GTS 優化算法。
對DPDK 下內存數據的存儲配置主要分為2 個部分:DPDK 配置和Redis 配置。而對于兩者的特征篩選,主要是對Redis 進行敏感性識別,原因在于底層程序配置參數范圍更加容易確定。Redis 的配置參數主要包含General、Snapshotting、Limits、Lua Scripting、Replication 等[21]。而系統的參數對于系統的性能有著不同層度影響,Redis 系統部分配置描述如表1所示。

表1 Redis 系統部分參數配置Table 1 Partial parameters configuration of Redis system
為能夠有效地獲取Redis 中各項元素對數據存儲能力的敏感性,利用ANOVA 分析法,針對每一個元素,通過多次實驗來獲取性能的感知矩陣:

通過矩陣可以得出,每行元素的平均值和性能總平均值如式(5)和式(6)所示:

根據每行的平均值和性能總平均值,可以通過式(7)、式(8)計算出效應平方和SA以及誤差平方和SE:

根據所得效應平方和與誤差平方和可以通過式(9)計算出總誤差變差為ST:

其中:自由度為fT=N-1,fA=m-1,fE=fT-fA,由此可以進一步計算出,并且可以得出顯著水平α。通過比較判斷各元素的靈敏度,從而生成參數配置集合,并將生成的參數集合運行在相應的存儲環境,收集相應的性能數據。
在高速網絡存儲配置過程中影響網絡I/O 的主要因素包括DPDK 驅動配置和存儲應用配置2 個方面。整體的配置活動圖如圖2所示。

圖2 DPDK 與Redis 參數配置活動圖Fig.2 Activity diagram with parameter configuration of DPDK and Redis
因此,整體程序的性能可以2 個變量進行表示,式(1)可以進一步表示為:

其中:SSPF作為性能指標的計算;CDPDK表示圖2 中網卡以及批次、管道等配置集合[22];CRedis則由運行參數配置、集群參數、限制參數等多個集合的組合。
為能夠實現對系統性能有效感知和評估,需要建立準確的性能模型。而現有的模型構建方法單純地采用多個參數求和的方法,基于DPDK 的高速流量存儲機制并不完全處在同一個水平面上,采用傳統模型構建方法忽略了參數之間的影響關系。底層DPDK 驅動參數的各項配置應該與Redis 性能之間產生關系。因此,本節采用一種漸進模型來實現對系統性能預測,該模型的核心在于采用分層建立的方法,建立局部回歸模型,并根據局部回歸模型得到局部預測值,局部模型測量值作為整體系統回歸模型的參數與整體參數重新訓練,從而逐步得到整體的性能模型。為了降低系統模型訓練的成本,對于局部模型的建立基于階段的執行實現,并建立時間模型。模型可以表示為:

其中:f(C)是基于梯度提升樹的性能模型。該模型將各階段的配置參數作為輸入,性能指標延遲作為輸出。在此說明,式(11)所示為針對局部建立的數字模型,并不包含一個具體準確的表達公式。T的建立通過GBDT算法訓練得到。因此,樣本可以表示為:

其中:Ti是第i個樣本中執行時間的值;Ci是第i個樣本中各工作階段的參數對應的值。在獲取到局部模型后,通過迭代算法進行訓練,根據模型所感知的值重新作為參數進一步訓練出整體性能模型。因此,整體模型的定義如下:

其中:CSVDPDK表示DPDK 運行過程的性能數據文件;TDPDK表示DPDK 階段的性能模型;CSVRedis表示Redis 下運行過程的性能數據文件;TRedis為存儲階段的性能模型;Tsystem表示系統的最終的漸進感知模型。漸進感知模型的構建流程如圖3所示。

圖3 漸進感知模型的構建流程Fig.3 Construction process of progressive perception model
從漸進模型的構造流程可以看出,通過構建DPDK 模型與Redis 模型可以評估出TDPDK、TRedis,并將TRedis、TDPDK與系統所有參數進行訓練得到系統的整體時延模型。DPDK 模型主要是對數據接收到數據分發過程的執行時間模型;Redis 模型則是數據庫連接以及數據存儲整個過程的執行時間模型。
在存儲機制下存儲資源的優化過程中,DPDK驅動參數配置與Redis 存儲應用參數配置之間有著無法直接推斷的關系,在缺乏整體的分析和詳細組合的情況下,很難直接給出精準的數據公式,因此需要通過算法進行訓練,本文采用GBDT 算法對所涉及的模型進行訓練。在GBDT 算法中,需要輸入負載應用程序[23]的產生數據集合D、配置參數集合以及有底層啟動到應用數據庫存儲的各部分時間集合TP。對于樣本N,從j=1 到N計算出殘差如式(14)所示:

對所得殘差rmi進行擬合得到擬合殘差,并根據擬合殘差值,通過式(15)更新模型:

通過該方法可以訓練出DPDK 與Redis 階段的局部模型TDPDK、TRedis,并將所得預測值作為整體模型的輸入參數進行重新訓練。需要注意是,在對整體模型的訓練中,輸入集合需要增加存儲總時間PF,因為此次訓練過程中針對程序運行的整體訓練,與局部模型相比需要將擬合出的決策樹重新加入到模型中去,從而根據式(16)得到整體模型:

上述是模型構建的具體過程,可以看出整體訓練過程分為2 個階段:第1 階段是針對局部的訓練;第2 階段主要是結合局部重新對殘差計算并且擬合得到擬合殘差從而獲得整體的模型。因此,本文提出的漸進性能感知模型是一種考慮到系統局部與整體關系的分層模型,并且通過GBDT 算法能夠在模型參數調整較少時,訓練出精準度更高的模型,所以利用梯度提升回歸樹算法來針對漸進感知模型獲取資源配置調優中的重要參數。
在建立有效的漸進感知模型后,需要基于漸進感知模型對系統性能進行優化。遺傳算法是一種用于求解此類問題的搜索算法,該算法能夠有效地避免陷入局部最優解的問題。因此,本文將提出的漸進感知模型與遺傳算法有效結合,形成GTS(Gradual Tuning Storage)配置優化方法,提高問題求解質量,尋找出最優的資源分配方案。優化算法迭代最優配置的步驟如圖4所示。

圖4 迭代最優配置過程Fig.4 Process of iterating optimal configuration
從圖4 可以看出,將得到局部模型生成的漸進感知模型和參數集合作為輸入,進行資源配置優化,通過多次的迭代訓練搜索出最優的資源配置方案。詳細實現如算法1所示。
算法1GTS 算法

為驗證DPDK 下面向Redis 的存儲資源配置優化的有效性,本文實驗的環境構建在集群之上,使用的Redis 版本為Redis-4.0.9,是目前較為穩定的版本。測試集群建立在2 臺服務器上,服務器的相關信息如表2所示。

表2 測試機器的參數配置Table 2 Parameter configuration of test machine
因為實際物理服務器的個數難以到達實驗所需規模的集群,及采用1 機1 實例,所以需要在已有的2 臺物理服務器中開啟多個Redis 服務節點來模擬出大規模的Redis 集群,對于初步節點的設置數,由于受到CPU 的限制且一般Redis 集群的建立采用奇數,因此2 臺服務器建立的集群規模為2×(16-2)-1=27 個節點的集群。
測試使用關鍵軟件除了Redis 4.0.9 外,為了測試高速網絡下的存儲以及集群存儲下的整體配置優化,還使用測試工具MoonGen 來生成測試數據集,所使用版本是基于DPDK-19.05 的開發版本,軟件搭建在單獨一臺物理服務器之上,防止程序之間的互相干擾。
使用YCSB(Yahoo!Cloud Serving Benchmark)模擬不同負載測試參數優化后的存儲性能。YCSB是一個用來測試在線數據庫性能與擴展性的框架。用戶自主編寫代碼來測試數據庫,也可以通過配置文件來指定需要進行負載類型測試,例如讀寫比例、記錄大小、并發數等。
為驗證配置優化方法對系統整體性能調優的效果。實驗選取存儲吞吐量以及時延作為評估優化效果的標準。在實驗過程中根據YCSB 中每個基準測試程序,初始化DPDK 程序以及Redis 內存數據庫,停止Redis 集群,并且更新Redis 運行配置和集群配置,重啟Redis 集群存儲并啟動Redis 的基準測試,重復此過程并保證所有配置組合均被測試。
為對比各方法對系統存儲時延的影響,采用不同配置優化算法進行重復實驗。在實驗過程中對于相同的算法,調整工作執行量進行多次實驗。通過讀取寫密集下不同工作量的時間進行實驗驗證本文提出算法的有效性。在實驗過程中對數據庫采用Redis 本身的Redis-cli 輔助Redis-live 進行監控,將數據發送的時間作為初始時間,并將讀取數據顯示時間作為完成時間,通過計算兩者之間的差值,得到時間效率的實驗結果。
針對不同負載環境下默認配置導致吞吐性能下降的問題,采用YCSB 進行不同的負載類型的模擬實現,包括RMW、UH、RO、RH、AVG,其分別表示讀寫混合型、寫密集型、只讀型、讀密集型、平均。圖5反映了不同操作數下存儲吞吐差異。

圖5 寫密集下I/O 吞吐的性能對比Fig.5 Performance comparison of I/O throughput under write-intensive
在圖5中分別選取10萬、20萬、40萬、80萬、100萬這5 個層度進行測試,可以看出算法所得最優組合配置穩定適應操作數的變化并且不斷上升在100 萬時可以到10 000 Operations/s,而采用默認配置運行差距較大。
圖6所示主要是時延與不同操作數的關系,通過對比默認配置、ATH 算法和本文的GTS 算法可以看出,默認配置在不同的操作數10~80 萬下相對其他算法都表現出了較高的平均時延,本文的GTS 算法與ATH 算法相比在整體時延上有所降低。除寫密集下不同負載的時延與吞吐測試以外,針對模型構建以及最優配置調整對速率影響進行實驗,并對MoonGen 產生的流量和實際處理速率進行對比。通過圖7 對比可以看出,由于兩者監測有一定的延遲,因此整體波形向右偏移,雖然相對于MoonGen 而言有著一定的成本消耗,但是整體的速率基本于MoonGen 的測試速率保持一致,體現了本文優化方法具有較低的成本消耗。

圖6 寫密集下不同算法的時延對比Fig.6 Comparison of different algorithms in latency under write-intensive

圖7 測試速率與實際存儲對比Fig.7 Comparison of test rate and actual storage
本文針對默認資源配置參數限制高速網絡存儲效率的問題,建立性能模型,綜合考慮資源配置對系統的影響,將漸進感知模型與遺傳算法相結合,形成DPDK 下面向Redis 的資源配置優化方法,將局部模型作為基礎生成系統模型,考慮內核級配置和應用級配置區別,提高模型的準確性,形成系統的最優配置方案。實驗結果表明,該方法能有效優化資源配置參數,從而適應高速網絡下的集群存儲。下一步考慮將抽樣技術與參數配置調優技術相結合,以提高存儲I/O 的效率。