朱文俊,徐 壯,秦家佳,李 鵬,2
(1.南京郵電大學(xué)計(jì)算機(jī)學(xué)院,南京210023;2.江蘇省高性能計(jì)算與智能處理工程研究中心,南京210023)
內(nèi)存數(shù)據(jù)庫(kù)因具有低延時(shí)的數(shù)據(jù)訪問(wèn)特點(diǎn),已成為當(dāng)前互聯(lián)網(wǎng)服務(wù)重要的加速引擎。然而,DPDK[1]技術(shù)的出現(xiàn)以及批次處理[2]技術(shù)的廣泛應(yīng)用,給內(nèi)存數(shù)據(jù)存儲(chǔ)帶來(lái)了新的要求。目前主流的內(nèi)存數(shù)據(jù)庫(kù)有Amazon 提出的Dynamo[3]、Facebook提出的Memcached[4]、Facebook 與Yahoo!共同完善的HBase[5]。在上述系統(tǒng)中,雖然為數(shù)據(jù)存儲(chǔ)提供了極高的讀/寫操作性能和高效的數(shù)據(jù)管理服務(wù),但是面對(duì)高吞吐、高并發(fā)、高負(fù)載的復(fù)雜網(wǎng)路存儲(chǔ)環(huán)境,如何配置運(yùn)行參數(shù)來(lái)調(diào)優(yōu)內(nèi)存數(shù)據(jù)庫(kù)的性能,成為網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)的一項(xiàng)重要挑戰(zhàn)。由于DPDK 與Redis[6]在協(xié)同存儲(chǔ)過(guò)程中依賴于程序人員的經(jīng)驗(yàn)配置來(lái)滿足不同場(chǎng)景下的網(wǎng)絡(luò)存儲(chǔ)要求,因此會(huì)出現(xiàn)資源參數(shù)配置不足和資源參數(shù)配置過(guò)剩的問(wèn)題。雖然Redis 提供了幾種不同的數(shù)據(jù)分發(fā)策略,例如數(shù)據(jù)分片[7]、Hash slots[8]等方式來(lái)優(yōu)化存儲(chǔ)的性能,但是數(shù)據(jù)分發(fā)的策略受到系統(tǒng)參數(shù)的直接影響,而采用默認(rèn)參數(shù)配置無(wú)法適應(yīng)多變的應(yīng)用環(huán)境,尤其在DPDK 的高速網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)情況下更為明顯。在高達(dá)10 Mpacket/s[9]以上的速率時(shí),如何配置合理的存儲(chǔ)參數(shù),從而滿足系統(tǒng)需求是解決該問(wèn)題的重要方向。在存儲(chǔ)過(guò)程中吞吐量和時(shí)延是表現(xiàn)數(shù)據(jù)存儲(chǔ)效率的重要特征,而采用默認(rèn)參數(shù)配置無(wú)法正常發(fā)揮數(shù)據(jù)庫(kù)的存儲(chǔ)性能,使得存儲(chǔ)吞吐與時(shí)延無(wú)法符合實(shí)際應(yīng)用場(chǎng)景的需求。
而解決此類性能優(yōu)化問(wèn)題的最主要途徑是通過(guò)對(duì)Redis 系統(tǒng)參數(shù)的分析,來(lái)尋找到最優(yōu)的資源配置,從而使得DPDK 下不同網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)都能達(dá)到最優(yōu)的性能。
本文通過(guò)形式化分析DPDK 下的Redis 存儲(chǔ)I/O優(yōu)化模型,根據(jù)批次大小等存儲(chǔ)參數(shù)對(duì)性能的影響層度,分層建立性能感知模型。在此基礎(chǔ)上,通過(guò)遺傳算法[10]迭代尋找出最優(yōu)的參數(shù)方案,從而根據(jù)環(huán)境變化調(diào)整參數(shù)配置,提升存儲(chǔ)I/O 吞吐量,降低操作過(guò)程的時(shí)延,達(dá)到優(yōu)化整體性能的目的。
隨著DPDK 技術(shù)的出現(xiàn),網(wǎng)絡(luò)數(shù)據(jù)呈現(xiàn)多樣化發(fā)展。與傳統(tǒng)技術(shù)相比,所需存儲(chǔ)的數(shù)據(jù)規(guī)模、數(shù)據(jù)復(fù)雜度、數(shù)據(jù)完整性對(duì)網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)系統(tǒng)的讀寫性、可用性、有效性都提出極高的性能需求。而參數(shù)自動(dòng)調(diào)優(yōu)技術(shù)是高速存儲(chǔ)I/O 優(yōu)化的重要研究方向,參數(shù)調(diào)優(yōu)技術(shù)是指在一系列參數(shù)特征中,通過(guò)某種性能度量或者反饋機(jī)制,尋找出當(dāng)前環(huán)境下最優(yōu)的配置項(xiàng)組合。
目前常用的存儲(chǔ)統(tǒng)參數(shù)調(diào)優(yōu)方法包括3 個(gè)方面:控制反饋方法,參數(shù)搜索方法和統(tǒng)計(jì)學(xué)習(xí)[11]方法??刂品答伔椒ǎ?2]是基于參數(shù)配置規(guī)則的動(dòng)態(tài)反饋來(lái)控制參數(shù)配置,主要方式是通過(guò)性能監(jiān)控套件[13-14]或者建立相應(yīng)規(guī)則來(lái)根據(jù)運(yùn)行情況做出調(diào)整,如文獻(xiàn)[15]提出一種名為PCM 的基于策略驅(qū)動(dòng)的存儲(chǔ)系統(tǒng)配置系統(tǒng),該系統(tǒng)可以捕獲不同工作負(fù)載的調(diào)整參數(shù)作為配置策略。在多種工作負(fù)載下,PCM 配置下的工作性能優(yōu)于默認(rèn)配置,使得吞吐量顯著提高。但是這種基于策略驅(qū)動(dòng)的優(yōu)化方法在運(yùn)行中需要頻繁進(jìn)行策略更替,提高了時(shí)間成本。參數(shù)搜索法[16]則是將參數(shù)配置作為黑盒處理,使用搜索算法針對(duì)特定系統(tǒng)的特定性能情況進(jìn)行搜索,當(dāng)搜索環(huán)境發(fā)生變化時(shí)該方法不適用,并且在優(yōu)化參數(shù)配置時(shí)每次都需要運(yùn)行具有大量輸入數(shù)據(jù)集的應(yīng)用程序,會(huì)耗費(fèi)大量時(shí)間和系統(tǒng)資源。另一種方法是基于統(tǒng)計(jì)學(xué)習(xí)的優(yōu)化方法,其通過(guò)已有的配置項(xiàng)和性能組成的數(shù)據(jù)集樣本進(jìn)行學(xué)習(xí)并訓(xùn)練性能模型。該方法能夠有效實(shí)現(xiàn)對(duì)性能預(yù)測(cè),但是性能模型建立的準(zhǔn)確性會(huì)直接影響到優(yōu)化效果,并且特征過(guò)多導(dǎo)致樣本數(shù)據(jù)過(guò)大也是該方法的弊端。文獻(xiàn)[17]將系統(tǒng)參數(shù)配置與機(jī)器學(xué)習(xí)進(jìn)行有效結(jié)合,提出一種根據(jù)不同的學(xué)習(xí)體系結(jié)構(gòu)來(lái)促進(jìn)配置調(diào)整任務(wù)的優(yōu)化方法,其中參與者和批評(píng)者都由多層神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn),并利用誤差反向傳播算法[18]根據(jù)學(xué)習(xí)中產(chǎn)生的時(shí)間差誤差調(diào)整網(wǎng)絡(luò)權(quán)重,但是該方法局限于只能針對(duì)單一服務(wù)器進(jìn)行,在面對(duì)多個(gè)節(jié)點(diǎn)服務(wù)器情況時(shí)會(huì)失效。文獻(xiàn)[19]提出了一種給定的工作負(fù)載下應(yīng)用程序自動(dòng)調(diào)整配置參數(shù)的新方法,稱為ATH。該方法構(gòu)建以配置參數(shù)為輸入的低成本精確性能模型,有效提升了系統(tǒng)的吞吐量,但是該方法中的模型以時(shí)延和吞吐通過(guò)線性加權(quán)的方式進(jìn)行構(gòu)建,缺少對(duì)存儲(chǔ)流程以及歷史作業(yè)的分析,缺少參數(shù)與參數(shù)之間關(guān)聯(lián)性的考慮。文獻(xiàn)[20]提出一種AutoConfig 算法,使用抽樣的方法將大量配置項(xiàng)抽樣出多個(gè)參數(shù),提高了建模的性能。短板在于沒(méi)有考慮到多個(gè)配置項(xiàng)之間的關(guān)系,對(duì)于2 個(gè)具有相關(guān)性的參數(shù),其通常會(huì)考慮選擇其中1 個(gè)。
上述方法能在一定程度上解決存儲(chǔ)系統(tǒng)繁瑣的參數(shù)配置調(diào)整問(wèn)題,但未能考慮存儲(chǔ)調(diào)優(yōu)中模型建立的非線性關(guān)系以及參數(shù)特征數(shù)目巨大問(wèn)題,因此,需要一種更加精確的性能優(yōu)化算法,使得在DPDK下以Redis 為代表的內(nèi)存存儲(chǔ)系統(tǒng)利用能夠充分考慮參數(shù)之間的相互作用關(guān)系,提升調(diào)優(yōu)效率。本文提出一種存儲(chǔ)I/O 調(diào)優(yōu)方法,通過(guò)特征篩選以及建立基于作業(yè)特性的漸進(jìn)感知模型,解決默認(rèn)參數(shù)導(dǎo)致的性能瓶頸問(wèn)題。
解決DPDK 下內(nèi)存存儲(chǔ)參數(shù)配置問(wèn)題目的是尋找出最優(yōu)的配置方案,使得存儲(chǔ)的吞吐量與時(shí)延達(dá)到當(dāng)下應(yīng)用環(huán)境的近似最優(yōu)值。對(duì)于Redis 本身架構(gòu)而言,整體性能的衡量是通過(guò)應(yīng)用端和服務(wù)端2 個(gè)方面來(lái)進(jìn)行評(píng)估。在要素特征上分析主要包括寫入比例、請(qǐng)求交方式、存儲(chǔ)數(shù)據(jù)大小、請(qǐng)求并發(fā)量等因素。
假設(shè)Redis 集群中主節(jié)點(diǎn)有M個(gè),則節(jié)點(diǎn)的集合為M=(m1,m2,…,mM),且每個(gè)節(jié)點(diǎn)中資源受到集群的內(nèi)存、網(wǎng)絡(luò)、存儲(chǔ)等方面影響,即Sio=(Ej,Oj,Sj),Ej表示該集群中第j個(gè)工作節(jié)點(diǎn)提供的內(nèi)存資源,Oj為節(jié)點(diǎn)j上可以提供的網(wǎng)絡(luò)資源,Sj為節(jié)點(diǎn)j提供的存儲(chǔ)資源。此外,需要評(píng)估數(shù)據(jù)庫(kù)中的負(fù)載情況,則具體通過(guò)Wj表示第j個(gè)節(jié)點(diǎn)的工作負(fù)載。其中,由于DPDK 利用批次和管道處理來(lái)優(yōu)化數(shù)據(jù)存儲(chǔ),因此設(shè)定管道一次請(qǐng)求數(shù)為BS而總數(shù)據(jù)接收批次為BT,則整個(gè)存儲(chǔ)過(guò)程中數(shù)據(jù)的有效批次比例如下:
本文所考慮的場(chǎng)景是高速網(wǎng)絡(luò)環(huán)境的數(shù)據(jù)存儲(chǔ),所以針對(duì)的應(yīng)用場(chǎng)景為寫密集。因此,設(shè)定請(qǐng)求數(shù)據(jù)為,并且假設(shè)Redis 數(shù)據(jù)庫(kù)中各個(gè)節(jié)點(diǎn)在數(shù)據(jù)寫入中的分配比為Aj,抽象出的資源需求公式化表達(dá)為:
從式(2)可以看出,基于DPDK 的高速網(wǎng)絡(luò)存儲(chǔ)機(jī)制是依賴于多種因素的影響,且整個(gè)資源需求受限于總體資源的限制,而總體資源又受到Redis 與DPDK 的配置參數(shù)直接影響。
那么對(duì)存儲(chǔ)I/O 性能優(yōu)化問(wèn)題,即性能最優(yōu)值與參數(shù)配置關(guān)系可以定義為:
其中:X表示DPDK 與Redis 的配置參數(shù)組合;SPF 則是需要獲取的性能模型,代表了具體應(yīng)用下配置參數(shù)與應(yīng)用性能之間的關(guān)系。
本文針對(duì)DPDK 下Redis 存儲(chǔ)的性能優(yōu)化問(wèn)題,設(shè)計(jì)一種漸進(jìn)感知模型,其核心在于根據(jù)各階段的歷史數(shù)據(jù)來(lái)分層構(gòu)建性能模型。將底層參數(shù)與應(yīng)用層參數(shù)的相互作用考慮到模型構(gòu)建中,從而改進(jìn)傳統(tǒng)的加權(quán)回歸預(yù)測(cè)模型,并且將所得模型與遺傳算法相結(jié)合形成GTS 配置優(yōu)化算法。遺傳算法可以在計(jì)算預(yù)測(cè)模型時(shí)有效避免局部最優(yōu)解的產(chǎn)生,相較于粒子群算法以及經(jīng)典的最小二乘法(Ordinary Least Squares,OLS),更加適合漸進(jìn)感知模型的特性。
本文提出的GTS 算法主要分為3 個(gè)部分:第1 部分是進(jìn)行特征篩選,該部分在獲取原始特征基礎(chǔ)上使用ANOVA 進(jìn)行正交實(shí)驗(yàn),生成一定配置組合參數(shù),運(yùn)行在Redis 與DPDK 上使其生效,并且通過(guò)測(cè)試框架模擬高速負(fù)載的存儲(chǔ)環(huán)境,從而獲取初始的性能數(shù)據(jù)集;第2 部分是進(jìn)行性能模型的構(gòu)建與訓(xùn)練,在這部分中改進(jìn)了常用的加權(quán)回歸模型,將底層DPDK 參數(shù)和應(yīng)用級(jí)Redis 參數(shù)與性能建立漸進(jìn)感知模型,通過(guò)多個(gè)局部模型的訓(xùn)練進(jìn)一步生成系統(tǒng)整體模型,充分考慮參數(shù)與參數(shù)的關(guān)聯(lián)性;第3 部是性能優(yōu)化,將第2 部分所得漸進(jìn)感知模型與遺傳算法相結(jié)合,通過(guò)多次迭代尋找出性能最優(yōu)解以及最優(yōu)參數(shù)配置。整體優(yōu)化架構(gòu)如圖1所示。
圖1 整體優(yōu)化框架Fig.1 Overall optimization framework
本節(jié)對(duì)本文所提出的存儲(chǔ)I/O 調(diào)優(yōu)方法的具體實(shí)現(xiàn)進(jìn)行敘述,該方法通過(guò)使用ANOVA 對(duì)存儲(chǔ)中涉及的特征進(jìn)行篩選,并且改進(jìn)原有線性回歸的建模思想,考慮模型中各部分參數(shù)的相互影響。存儲(chǔ)參數(shù)調(diào)優(yōu)算法主要分為特征篩選、漸進(jìn)感知模型構(gòu)建及GTS 優(yōu)化算法。
對(duì)DPDK 下內(nèi)存數(shù)據(jù)的存儲(chǔ)配置主要分為2 個(gè)部分:DPDK 配置和Redis 配置。而對(duì)于兩者的特征篩選,主要是對(duì)Redis 進(jìn)行敏感性識(shí)別,原因在于底層程序配置參數(shù)范圍更加容易確定。Redis 的配置參數(shù)主要包含General、Snapshotting、Limits、Lua Scripting、Replication 等[21]。而系統(tǒng)的參數(shù)對(duì)于系統(tǒng)的性能有著不同層度影響,Redis 系統(tǒng)部分配置描述如表1所示。
表1 Redis 系統(tǒng)部分參數(shù)配置Table 1 Partial parameters configuration of Redis system
為能夠有效地獲取Redis 中各項(xiàng)元素對(duì)數(shù)據(jù)存儲(chǔ)能力的敏感性,利用ANOVA 分析法,針對(duì)每一個(gè)元素,通過(guò)多次實(shí)驗(yàn)來(lái)獲取性能的感知矩陣:
通過(guò)矩陣可以得出,每行元素的平均值和性能總平均值如式(5)和式(6)所示:
根據(jù)每行的平均值和性能總平均值,可以通過(guò)式(7)、式(8)計(jì)算出效應(yīng)平方和SA以及誤差平方和SE:
根據(jù)所得效應(yīng)平方和與誤差平方和可以通過(guò)式(9)計(jì)算出總誤差變差為ST:
其中:自由度為fT=N-1,fA=m-1,fE=fT-fA,由此可以進(jìn)一步計(jì)算出,并且可以得出顯著水平α。通過(guò)比較判斷各元素的靈敏度,從而生成參數(shù)配置集合,并將生成的參數(shù)集合運(yùn)行在相應(yīng)的存儲(chǔ)環(huán)境,收集相應(yīng)的性能數(shù)據(jù)。
在高速網(wǎng)絡(luò)存儲(chǔ)配置過(guò)程中影響網(wǎng)絡(luò)I/O 的主要因素包括DPDK 驅(qū)動(dòng)配置和存儲(chǔ)應(yīng)用配置2 個(gè)方面。整體的配置活動(dòng)圖如圖2所示。
圖2 DPDK 與Redis 參數(shù)配置活動(dòng)圖Fig.2 Activity diagram with parameter configuration of DPDK and Redis
因此,整體程序的性能可以2 個(gè)變量進(jìn)行表示,式(1)可以進(jìn)一步表示為:
其中:SSPF作為性能指標(biāo)的計(jì)算;CDPDK表示圖2 中網(wǎng)卡以及批次、管道等配置集合[22];CRedis則由運(yùn)行參數(shù)配置、集群參數(shù)、限制參數(shù)等多個(gè)集合的組合。
為能夠?qū)崿F(xiàn)對(duì)系統(tǒng)性能有效感知和評(píng)估,需要建立準(zhǔn)確的性能模型。而現(xiàn)有的模型構(gòu)建方法單純地采用多個(gè)參數(shù)求和的方法,基于DPDK 的高速流量存儲(chǔ)機(jī)制并不完全處在同一個(gè)水平面上,采用傳統(tǒng)模型構(gòu)建方法忽略了參數(shù)之間的影響關(guān)系。底層DPDK 驅(qū)動(dòng)參數(shù)的各項(xiàng)配置應(yīng)該與Redis 性能之間產(chǎn)生關(guān)系。因此,本節(jié)采用一種漸進(jìn)模型來(lái)實(shí)現(xiàn)對(duì)系統(tǒng)性能預(yù)測(cè),該模型的核心在于采用分層建立的方法,建立局部回歸模型,并根據(jù)局部回歸模型得到局部預(yù)測(cè)值,局部模型測(cè)量值作為整體系統(tǒng)回歸模型的參數(shù)與整體參數(shù)重新訓(xùn)練,從而逐步得到整體的性能模型。為了降低系統(tǒng)模型訓(xùn)練的成本,對(duì)于局部模型的建立基于階段的執(zhí)行實(shí)現(xiàn),并建立時(shí)間模型。模型可以表示為:
其中:f(C)是基于梯度提升樹的性能模型。該模型將各階段的配置參數(shù)作為輸入,性能指標(biāo)延遲作為輸出。在此說(shuō)明,式(11)所示為針對(duì)局部建立的數(shù)字模型,并不包含一個(gè)具體準(zhǔn)確的表達(dá)公式。T的建立通過(guò)GBDT算法訓(xùn)練得到。因此,樣本可以表示為:
其中:Ti是第i個(gè)樣本中執(zhí)行時(shí)間的值;Ci是第i個(gè)樣本中各工作階段的參數(shù)對(duì)應(yīng)的值。在獲取到局部模型后,通過(guò)迭代算法進(jìn)行訓(xùn)練,根據(jù)模型所感知的值重新作為參數(shù)進(jìn)一步訓(xùn)練出整體性能模型。因此,整體模型的定義如下:
其中:CSVDPDK表示DPDK 運(yùn)行過(guò)程的性能數(shù)據(jù)文件;TDPDK表示DPDK 階段的性能模型;CSVRedis表示Redis 下運(yùn)行過(guò)程的性能數(shù)據(jù)文件;TRedis為存儲(chǔ)階段的性能模型;Tsystem表示系統(tǒng)的最終的漸進(jìn)感知模型。漸進(jìn)感知模型的構(gòu)建流程如圖3所示。
圖3 漸進(jìn)感知模型的構(gòu)建流程Fig.3 Construction process of progressive perception model
從漸進(jìn)模型的構(gòu)造流程可以看出,通過(guò)構(gòu)建DPDK 模型與Redis 模型可以評(píng)估出TDPDK、TRedis,并將TRedis、TDPDK與系統(tǒng)所有參數(shù)進(jìn)行訓(xùn)練得到系統(tǒng)的整體時(shí)延模型。DPDK 模型主要是對(duì)數(shù)據(jù)接收到數(shù)據(jù)分發(fā)過(guò)程的執(zhí)行時(shí)間模型;Redis 模型則是數(shù)據(jù)庫(kù)連接以及數(shù)據(jù)存儲(chǔ)整個(gè)過(guò)程的執(zhí)行時(shí)間模型。
在存儲(chǔ)機(jī)制下存儲(chǔ)資源的優(yōu)化過(guò)程中,DPDK驅(qū)動(dòng)參數(shù)配置與Redis 存儲(chǔ)應(yīng)用參數(shù)配置之間有著無(wú)法直接推斷的關(guān)系,在缺乏整體的分析和詳細(xì)組合的情況下,很難直接給出精準(zhǔn)的數(shù)據(jù)公式,因此需要通過(guò)算法進(jìn)行訓(xùn)練,本文采用GBDT 算法對(duì)所涉及的模型進(jìn)行訓(xùn)練。在GBDT 算法中,需要輸入負(fù)載應(yīng)用程序[23]的產(chǎn)生數(shù)據(jù)集合D、配置參數(shù)集合以及有底層啟動(dòng)到應(yīng)用數(shù)據(jù)庫(kù)存儲(chǔ)的各部分時(shí)間集合TP。對(duì)于樣本N,從j=1 到N計(jì)算出殘差如式(14)所示:
對(duì)所得殘差rmi進(jìn)行擬合得到擬合殘差,并根據(jù)擬合殘差值,通過(guò)式(15)更新模型:
通過(guò)該方法可以訓(xùn)練出DPDK 與Redis 階段的局部模型TDPDK、TRedis,并將所得預(yù)測(cè)值作為整體模型的輸入?yún)?shù)進(jìn)行重新訓(xùn)練。需要注意是,在對(duì)整體模型的訓(xùn)練中,輸入集合需要增加存儲(chǔ)總時(shí)間PF,因?yàn)榇舜斡?xùn)練過(guò)程中針對(duì)程序運(yùn)行的整體訓(xùn)練,與局部模型相比需要將擬合出的決策樹重新加入到模型中去,從而根據(jù)式(16)得到整體模型:
上述是模型構(gòu)建的具體過(guò)程,可以看出整體訓(xùn)練過(guò)程分為2 個(gè)階段:第1 階段是針對(duì)局部的訓(xùn)練;第2 階段主要是結(jié)合局部重新對(duì)殘差計(jì)算并且擬合得到擬合殘差從而獲得整體的模型。因此,本文提出的漸進(jìn)性能感知模型是一種考慮到系統(tǒng)局部與整體關(guān)系的分層模型,并且通過(guò)GBDT 算法能夠在模型參數(shù)調(diào)整較少時(shí),訓(xùn)練出精準(zhǔn)度更高的模型,所以利用梯度提升回歸樹算法來(lái)針對(duì)漸進(jìn)感知模型獲取資源配置調(diào)優(yōu)中的重要參數(shù)。
在建立有效的漸進(jìn)感知模型后,需要基于漸進(jìn)感知模型對(duì)系統(tǒng)性能進(jìn)行優(yōu)化。遺傳算法是一種用于求解此類問(wèn)題的搜索算法,該算法能夠有效地避免陷入局部最優(yōu)解的問(wèn)題。因此,本文將提出的漸進(jìn)感知模型與遺傳算法有效結(jié)合,形成GTS(Gradual Tuning Storage)配置優(yōu)化方法,提高問(wèn)題求解質(zhì)量,尋找出最優(yōu)的資源分配方案。優(yōu)化算法迭代最優(yōu)配置的步驟如圖4所示。
圖4 迭代最優(yōu)配置過(guò)程Fig.4 Process of iterating optimal configuration
從圖4 可以看出,將得到局部模型生成的漸進(jìn)感知模型和參數(shù)集合作為輸入,進(jìn)行資源配置優(yōu)化,通過(guò)多次的迭代訓(xùn)練搜索出最優(yōu)的資源配置方案。詳細(xì)實(shí)現(xiàn)如算法1所示。
算法1GTS 算法
為驗(yàn)證DPDK 下面向Redis 的存儲(chǔ)資源配置優(yōu)化的有效性,本文實(shí)驗(yàn)的環(huán)境構(gòu)建在集群之上,使用的Redis 版本為Redis-4.0.9,是目前較為穩(wěn)定的版本。測(cè)試集群建立在2 臺(tái)服務(wù)器上,服務(wù)器的相關(guān)信息如表2所示。
表2 測(cè)試機(jī)器的參數(shù)配置Table 2 Parameter configuration of test machine
因?yàn)閷?shí)際物理服務(wù)器的個(gè)數(shù)難以到達(dá)實(shí)驗(yàn)所需規(guī)模的集群,及采用1 機(jī)1 實(shí)例,所以需要在已有的2 臺(tái)物理服務(wù)器中開啟多個(gè)Redis 服務(wù)節(jié)點(diǎn)來(lái)模擬出大規(guī)模的Redis 集群,對(duì)于初步節(jié)點(diǎn)的設(shè)置數(shù),由于受到CPU 的限制且一般Redis 集群的建立采用奇數(shù),因此2 臺(tái)服務(wù)器建立的集群規(guī)模為2×(16-2)-1=27 個(gè)節(jié)點(diǎn)的集群。
測(cè)試使用關(guān)鍵軟件除了Redis 4.0.9 外,為了測(cè)試高速網(wǎng)絡(luò)下的存儲(chǔ)以及集群存儲(chǔ)下的整體配置優(yōu)化,還使用測(cè)試工具M(jìn)oonGen 來(lái)生成測(cè)試數(shù)據(jù)集,所使用版本是基于DPDK-19.05 的開發(fā)版本,軟件搭建在單獨(dú)一臺(tái)物理服務(wù)器之上,防止程序之間的互相干擾。
使用YCSB(Yahoo!Cloud Serving Benchmark)模擬不同負(fù)載測(cè)試參數(shù)優(yōu)化后的存儲(chǔ)性能。YCSB是一個(gè)用來(lái)測(cè)試在線數(shù)據(jù)庫(kù)性能與擴(kuò)展性的框架。用戶自主編寫代碼來(lái)測(cè)試數(shù)據(jù)庫(kù),也可以通過(guò)配置文件來(lái)指定需要進(jìn)行負(fù)載類型測(cè)試,例如讀寫比例、記錄大小、并發(fā)數(shù)等。
為驗(yàn)證配置優(yōu)化方法對(duì)系統(tǒng)整體性能調(diào)優(yōu)的效果。實(shí)驗(yàn)選取存儲(chǔ)吞吐量以及時(shí)延作為評(píng)估優(yōu)化效果的標(biāo)準(zhǔn)。在實(shí)驗(yàn)過(guò)程中根據(jù)YCSB 中每個(gè)基準(zhǔn)測(cè)試程序,初始化DPDK 程序以及Redis 內(nèi)存數(shù)據(jù)庫(kù),停止Redis 集群,并且更新Redis 運(yùn)行配置和集群配置,重啟Redis 集群存儲(chǔ)并啟動(dòng)Redis 的基準(zhǔn)測(cè)試,重復(fù)此過(guò)程并保證所有配置組合均被測(cè)試。
為對(duì)比各方法對(duì)系統(tǒng)存儲(chǔ)時(shí)延的影響,采用不同配置優(yōu)化算法進(jìn)行重復(fù)實(shí)驗(yàn)。在實(shí)驗(yàn)過(guò)程中對(duì)于相同的算法,調(diào)整工作執(zhí)行量進(jìn)行多次實(shí)驗(yàn)。通過(guò)讀取寫密集下不同工作量的時(shí)間進(jìn)行實(shí)驗(yàn)驗(yàn)證本文提出算法的有效性。在實(shí)驗(yàn)過(guò)程中對(duì)數(shù)據(jù)庫(kù)采用Redis 本身的Redis-cli 輔助Redis-live 進(jìn)行監(jiān)控,將數(shù)據(jù)發(fā)送的時(shí)間作為初始時(shí)間,并將讀取數(shù)據(jù)顯示時(shí)間作為完成時(shí)間,通過(guò)計(jì)算兩者之間的差值,得到時(shí)間效率的實(shí)驗(yàn)結(jié)果。
針對(duì)不同負(fù)載環(huán)境下默認(rèn)配置導(dǎo)致吞吐性能下降的問(wèn)題,采用YCSB 進(jìn)行不同的負(fù)載類型的模擬實(shí)現(xiàn),包括RMW、UH、RO、RH、AVG,其分別表示讀寫混合型、寫密集型、只讀型、讀密集型、平均。圖5反映了不同操作數(shù)下存儲(chǔ)吞吐差異。
圖5 寫密集下I/O 吞吐的性能對(duì)比Fig.5 Performance comparison of I/O throughput under write-intensive
在圖5中分別選取10萬(wàn)、20萬(wàn)、40萬(wàn)、80萬(wàn)、100萬(wàn)這5 個(gè)層度進(jìn)行測(cè)試,可以看出算法所得最優(yōu)組合配置穩(wěn)定適應(yīng)操作數(shù)的變化并且不斷上升在100 萬(wàn)時(shí)可以到10 000 Operations/s,而采用默認(rèn)配置運(yùn)行差距較大。
圖6所示主要是時(shí)延與不同操作數(shù)的關(guān)系,通過(guò)對(duì)比默認(rèn)配置、ATH 算法和本文的GTS 算法可以看出,默認(rèn)配置在不同的操作數(shù)10~80 萬(wàn)下相對(duì)其他算法都表現(xiàn)出了較高的平均時(shí)延,本文的GTS 算法與ATH 算法相比在整體時(shí)延上有所降低。除寫密集下不同負(fù)載的時(shí)延與吞吐測(cè)試以外,針對(duì)模型構(gòu)建以及最優(yōu)配置調(diào)整對(duì)速率影響進(jìn)行實(shí)驗(yàn),并對(duì)MoonGen 產(chǎn)生的流量和實(shí)際處理速率進(jìn)行對(duì)比。通過(guò)圖7 對(duì)比可以看出,由于兩者監(jiān)測(cè)有一定的延遲,因此整體波形向右偏移,雖然相對(duì)于MoonGen 而言有著一定的成本消耗,但是整體的速率基本于MoonGen 的測(cè)試速率保持一致,體現(xiàn)了本文優(yōu)化方法具有較低的成本消耗。
圖6 寫密集下不同算法的時(shí)延對(duì)比Fig.6 Comparison of different algorithms in latency under write-intensive
圖7 測(cè)試速率與實(shí)際存儲(chǔ)對(duì)比Fig.7 Comparison of test rate and actual storage
本文針對(duì)默認(rèn)資源配置參數(shù)限制高速網(wǎng)絡(luò)存儲(chǔ)效率的問(wèn)題,建立性能模型,綜合考慮資源配置對(duì)系統(tǒng)的影響,將漸進(jìn)感知模型與遺傳算法相結(jié)合,形成DPDK 下面向Redis 的資源配置優(yōu)化方法,將局部模型作為基礎(chǔ)生成系統(tǒng)模型,考慮內(nèi)核級(jí)配置和應(yīng)用級(jí)配置區(qū)別,提高模型的準(zhǔn)確性,形成系統(tǒng)的最優(yōu)配置方案。實(shí)驗(yàn)結(jié)果表明,該方法能有效優(yōu)化資源配置參數(shù),從而適應(yīng)高速網(wǎng)絡(luò)下的集群存儲(chǔ)。下一步考慮將抽樣技術(shù)與參數(shù)配置調(diào)優(yōu)技術(shù)相結(jié)合,以提高存儲(chǔ)I/O 的效率。