楊青霖,吳桂勇,張廣艷
清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系,北京 100084
分布式存儲(chǔ)系統(tǒng)是由多個(gè)存儲(chǔ)設(shè)備或者服務(wù)器(統(tǒng)稱為節(jié)點(diǎn))通過(guò)I/O總線或者互聯(lián)網(wǎng)絡(luò)連接而成的,并通過(guò)節(jié)點(diǎn)間的數(shù)據(jù)分散布局實(shí)現(xiàn)高效、低廉的數(shù)據(jù)存儲(chǔ)。分布式存儲(chǔ)系統(tǒng)因其強(qiáng)大的橫向擴(kuò)展能力在大數(shù)據(jù)場(chǎng)景中得到廣泛應(yīng)用[1]。然而,以Ceph為代表的分布式存儲(chǔ)系統(tǒng)存在以下幾個(gè)問(wèn)題。
● 寫放大。為了支持寫事務(wù),需要將數(shù)據(jù)先寫入日志,然后再應(yīng)用到本地文件系統(tǒng)中,這導(dǎo)致了雙倍的數(shù)據(jù)寫入量,降低了寫入性能,且后端文件系統(tǒng)的寫入容易成為性能瓶頸。
● I/O路徑過(guò)長(zhǎng),響應(yīng)時(shí)延較高。一個(gè)完整的I/O過(guò)程需要經(jīng)過(guò)多種相關(guān)線程和模塊協(xié)同,部分模塊之間還需要進(jìn)行網(wǎng)絡(luò)傳輸或內(nèi)存復(fù)制,且過(guò)程中存在多處排隊(duì)等待,這些排隊(duì)等待有可能阻塞讀寫請(qǐng)求,過(guò)長(zhǎng)的I/O路徑增大了讀寫操作的響應(yīng)時(shí)延,降低了存儲(chǔ)系統(tǒng)的讀寫性能。
現(xiàn)有技術(shù)中普遍將內(nèi)存或固態(tài)硬盤(solid state disk,SSD)等快速設(shè)備作為底層存儲(chǔ)系統(tǒng)的緩存,利用數(shù)據(jù)分層機(jī)制提高存儲(chǔ)系統(tǒng)的讀寫性能,如Memcache分布式緩存系統(tǒng)、Flashcache混合磁盤技術(shù),或者在磁盤陣列上層支持SSD客戶端緩存等。因此,為了解決分布式存儲(chǔ)系統(tǒng)中的性能問(wèn)題,在以磁盤為介質(zhì)的存儲(chǔ)系統(tǒng)中引入以固態(tài)硬盤為介質(zhì)的緩存是一種可行的途徑。
對(duì)于單機(jī)系統(tǒng)中的SSD緩存技術(shù),現(xiàn)有的研究和應(yīng)用已經(jīng)比較成熟。但是,運(yùn)行在分布式存儲(chǔ)系統(tǒng)上的大規(guī)模任務(wù)通常會(huì)被分割為許多小任務(wù)分散執(zhí)行,這就導(dǎo)致數(shù)據(jù)訪問(wèn)模式呈現(xiàn)弱局部性,若采用傳統(tǒng)的緩存機(jī)制,容易造成緩存污染的問(wèn)題。另外,由于分布式場(chǎng)景下緩存管理的粒度通常較大,對(duì)數(shù)據(jù)塊的緩存操作需要大量的網(wǎng)絡(luò)帶寬和磁盤讀寫開銷,在傳統(tǒng)的緩存機(jī)制中,緩存操作會(huì)落在I/O的關(guān)鍵路徑上,增大I/O請(qǐng)求的響應(yīng)時(shí)延。由于容錯(cuò)需要,緩存層和存儲(chǔ)層還需要做數(shù)據(jù)冗余,導(dǎo)致數(shù)據(jù)緩存和臟數(shù)據(jù)回刷的開銷更大。因此,在分布式場(chǎng)景下,傳統(tǒng)的緩存機(jī)制并不完全適用,不能發(fā)揮SSD等快速設(shè)備的優(yōu)秀特性,不能充分提升分布式存儲(chǔ)系統(tǒng)的讀寫性能。
本文提出一種分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)高效緩存方法——基于熱點(diǎn)檢測(cè)(hot spot detection,HOSD)的緩存方法,該方法通過(guò)充分利用分布式系統(tǒng)訪問(wèn)模式信息來(lái)提高緩存池中數(shù)據(jù)的命中率,最終提高緩存系統(tǒng)的讀寫性能。首先,HOSD采用讀寫旁路和懶惰緩存的方法降低了緩存操作對(duì)I/O時(shí)延的影響,且避免了緩存污染;其次,HOSD采用高效的緩存管理機(jī)制及緩存替換策略降低了緩存管理開銷,提高了對(duì)緩存中冷數(shù)據(jù)的識(shí)別精度,使得更多的熱數(shù)據(jù)得以保留在緩存中,提高了緩存效率和分布式場(chǎng)景下弱局部性訪問(wèn)的I/O性能;最后,HOSD通過(guò)跟蹤前臺(tái)工作負(fù)載的變化情況自適應(yīng)地調(diào)整主動(dòng)回刷臟數(shù)據(jù)的速率,以避免在發(fā)生緩存替換時(shí)密集回刷數(shù)據(jù)對(duì)系統(tǒng)I/O性能造成很大影響。
HOSD的基本思想是冷熱數(shù)據(jù)分離,用相對(duì)快速的固態(tài)存儲(chǔ)設(shè)備組成一個(gè)熱數(shù)據(jù)緩存池,后端用相對(duì)慢速的磁盤設(shè)備組建冷數(shù)據(jù)存儲(chǔ)池(如圖1所示)。HOSD在分布式存儲(chǔ)系統(tǒng)內(nèi)部支持?jǐn)?shù)據(jù)緩存,數(shù)據(jù)在緩存池與存儲(chǔ)池之間的遷移由HOSD軟件模塊控制,這個(gè)過(guò)程對(duì)客戶端透明,因此無(wú)須在提供塊接口、文件接口或?qū)ο蠼涌诘目蛻舳松线M(jìn)行改動(dòng)。
圖1 緩存方法的軟件邏輯架構(gòu)
HOSD主要包括以下軟件模塊(如圖2所示)。
● Objecter模塊:屬于客戶端,負(fù)責(zé)將讀寫請(qǐng)求路由到緩存池或存儲(chǔ)池。
● Filter模塊:根據(jù)數(shù)據(jù)的訪問(wèn)熱度,判斷是否將數(shù)據(jù)調(diào)入緩存池。
● Promotion模塊:負(fù)責(zé)將存儲(chǔ)池中的數(shù)據(jù)調(diào)入緩存池。
● Agent模塊:負(fù)責(zé)將臟數(shù)據(jù)適時(shí)回刷到存儲(chǔ)池,或者將冷數(shù)據(jù)從緩存池中剔除出去。
分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)緩存方法HOSD的工作流程如下。當(dāng)客戶端要讀寫的數(shù)據(jù)在緩存池命中時(shí),則直接在緩存池進(jìn)行讀寫,不會(huì)訪問(wèn)相對(duì)慢速的存儲(chǔ)池。若未命中,則旁路讀寫請(qǐng)求,將請(qǐng)求轉(zhuǎn)發(fā)給存儲(chǔ)池,讓客戶端在存儲(chǔ)池中進(jìn)行讀寫。另外,由Filter模塊負(fù)責(zé)熱數(shù)據(jù)發(fā)現(xiàn),判斷該數(shù)據(jù)是否被頻繁訪問(wèn),若是,則由Promotion模塊將數(shù)據(jù)遷移到緩存池;否則,該數(shù)據(jù)進(jìn)入緩存候選狀態(tài),暫不調(diào)入緩存池。當(dāng)緩存池的占用率達(dá)到一定閾值時(shí),Agent模塊負(fù)責(zé)將臟數(shù)據(jù)回刷到存儲(chǔ)池,或者將冷數(shù)據(jù)剔除出緩存池。
圖2 緩存方法的軟件模塊設(shè)計(jì)
由上述HOSD緩存方法的工作流程可以看出,其緩存管理主要涉及3種數(shù)據(jù)交換操作,分別如下。
● 調(diào)入緩存池:客戶端讀寫時(shí),依據(jù)HOSD調(diào)入算法將數(shù)據(jù)從存儲(chǔ)池遷移到緩存池中。
● 臟數(shù)據(jù)回刷:對(duì)于寫入緩存池中的數(shù)據(jù),經(jīng)過(guò)一定的時(shí)間,HOSD Agent模塊會(huì)將這部分?jǐn)?shù)據(jù)回刷到存儲(chǔ)池中,以免緩存池中臟數(shù)據(jù)過(guò)多。
● 冷數(shù)據(jù)替換:在緩存池裝滿的情況下,HOSD Agent模塊會(huì)將緩存池中的一些數(shù)據(jù)塊剔除出去,讓新的數(shù)據(jù)可以調(diào)入進(jìn)來(lái)。
上述數(shù)據(jù)交換操作會(huì)帶來(lái)大量存儲(chǔ)和網(wǎng)絡(luò)開銷,因此希望通過(guò)設(shè)計(jì)高效的緩存機(jī)制來(lái)提高緩存效率,并減少這種數(shù)據(jù)流動(dòng)開銷。
本文提出的分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)高效緩存方法HOSD主要包括如下3個(gè)技術(shù)點(diǎn):
● 通過(guò)讀寫旁路和懶惰緩存相結(jié)合的方法,避免緩存操作落在I/O路徑上,增大I/O請(qǐng)求的響應(yīng)時(shí)延,且通過(guò)熱點(diǎn)數(shù)據(jù)發(fā)現(xiàn)的方法來(lái)選擇性地將數(shù)據(jù)調(diào)入緩存,提高緩存中的數(shù)據(jù)質(zhì)量,避免緩存污染;
● 通過(guò)高效的緩存管理機(jī)制,減少緩存管理操作帶來(lái)的額外磁盤訪問(wèn)和計(jì)算開銷,并采用兼顧最近訪問(wèn)時(shí)間和歷史訪問(wèn)頻率的緩存替換策略來(lái)提高替換操作的準(zhǔn)確性,使得更多的熱數(shù)據(jù)得以保留在緩存中,提高數(shù)據(jù)訪問(wèn)的緩存命中率;
● 通過(guò)跟蹤前臺(tái)工作負(fù)載的輕重程度,自適應(yīng)地調(diào)整主動(dòng)回刷臟數(shù)據(jù)的速率,減少緩存替換時(shí)的臟數(shù)據(jù)回刷,并減輕數(shù)據(jù)回刷操作對(duì)系統(tǒng)讀寫性能的影響。
前兩個(gè)技術(shù)點(diǎn)保證了緩沖池中的數(shù)據(jù)質(zhì)量,提高了緩存命中率和系統(tǒng)讀寫性能;第三個(gè)技術(shù)點(diǎn)保證了緩存方法能夠盡可能地使用富余的網(wǎng)絡(luò)和磁盤帶寬來(lái)管理緩存,降低緩存管理操作對(duì)系統(tǒng)性能的影響。
傳統(tǒng)的緩存機(jī)制采用按需調(diào)入策略,即一旦發(fā)現(xiàn)緩存缺失,就將對(duì)應(yīng)的數(shù)據(jù)調(diào)入緩存,再響應(yīng)客戶端的讀寫請(qǐng)求。這樣做,一方面會(huì)使緩存操作落到I/O路徑上,增加I/O時(shí)延;另一方面,該數(shù)據(jù)塊可能只是被偶發(fā)性地訪問(wèn),后續(xù)不會(huì)被頻繁地訪問(wèn),那么,將該數(shù)據(jù)塊調(diào)入緩存就會(huì)造成緩存污染,且?guī)?lái)大量開銷,還會(huì)導(dǎo)致一些原本在緩存中較熱的數(shù)據(jù)塊被替換出去。因此,HOSD緩存方法采用讀寫旁路和懶惰緩存相結(jié)合的方法來(lái)解決上述問(wèn)題,從而保證緩存池中的數(shù)據(jù)質(zhì)量。
HOSD處理讀寫請(qǐng)求的主要流程如圖3所示,當(dāng)一個(gè)I/O請(qǐng)求達(dá)到時(shí),如果對(duì)應(yīng)數(shù)據(jù)塊在緩存池中,則由緩存池直接響應(yīng)用戶請(qǐng)求;如果對(duì)應(yīng)數(shù)據(jù)塊不在緩沖池中,則HOSD會(huì)將該請(qǐng)求轉(zhuǎn)發(fā)給存儲(chǔ)池,筆者把這種處理請(qǐng)求的方式叫作讀寫旁路。對(duì)于緩存缺失的數(shù)據(jù)塊,HOSD采用懶惰緩存策略。具體來(lái)講,就是預(yù)先定義一個(gè)數(shù)據(jù)重用距離和緩存閾值,當(dāng)該數(shù)據(jù)塊在重用距離內(nèi)被訪問(wèn)的次數(shù)超過(guò)了設(shè)定的緩存閾值時(shí),將其調(diào)入緩存。另外,數(shù)據(jù)重用距離也可以根據(jù)緩存的命中情況來(lái)動(dòng)態(tài)調(diào)整。
通過(guò)讀寫旁路和懶惰緩存的方法,HOSD讓緩存操作異步進(jìn)行,避免了緩存操作對(duì)I/O時(shí)延的影響,同時(shí)減少了緩存池和存儲(chǔ)池之間的數(shù)據(jù)流動(dòng)開銷。事實(shí)上,按需的緩存調(diào)入策略相當(dāng)于緩存閾值為1的特例,HOSD通過(guò)增大遷移閾值來(lái)延緩對(duì)數(shù)據(jù)塊的緩存,最終提高緩存池中數(shù)據(jù)塊的命中潛力。
HOSD緩存管理機(jī)制的工作流程如圖4所示,通過(guò)在內(nèi)存中維護(hù)一個(gè)將訪問(wèn)熱度作為優(yōu)先級(jí)的序列來(lái)對(duì)緩存池中的數(shù)據(jù)進(jìn)行排列,當(dāng)緩存的占用率達(dá)到一定的閾值時(shí),通過(guò)緩存替換,將訪問(wèn)熱度較低的數(shù)據(jù)塊從緩存池中剔除出去。同時(shí),當(dāng)發(fā)生讀寫請(qǐng)求時(shí),需要對(duì)數(shù)據(jù)塊序列進(jìn)行更新,為了避免這部分開銷對(duì)I/O時(shí)延造成影響,需要對(duì)緩存中的數(shù)據(jù)做邏輯劃分,也就是在內(nèi)存中維護(hù)多個(gè)緩存序列,以此來(lái)減小鎖粒度,降低緩存管理帶來(lái)的額外開銷。
緩存信息維護(hù)在內(nèi)存中,如果發(fā)生節(jié)點(diǎn)故障,會(huì)造成緩存信息的丟失。因此,HOSD周期性地將緩存信息打包成一個(gè)對(duì)象,通過(guò)存儲(chǔ)系統(tǒng)現(xiàn)成的寫入邏輯,將緩存信息以檢查點(diǎn)的形式持久化到存儲(chǔ)系統(tǒng)中。對(duì)于檢查點(diǎn)之間丟失的緩存信息,HOSD也可以通過(guò)存儲(chǔ)系統(tǒng)的變更操作的日志信息將其重建出來(lái)。通過(guò)上述方法,保證HOSD緩存方法在節(jié)點(diǎn)故障的情況下仍能正常工作,保證了存儲(chǔ)系統(tǒng)的容錯(cuò)能力。
當(dāng)進(jìn)行緩存替換時(shí),需要選擇訪問(wèn)熱度最低的數(shù)據(jù)塊,將其從緩存中剔除,以便為即將調(diào)入緩存中的數(shù)據(jù)塊騰出空間。HOSD緩存方法采用基于訪問(wèn)歷史的替換策略,綜合考慮數(shù)據(jù)塊的歷史訪問(wèn)頻率和最近訪問(wèn)時(shí)間,并構(gòu)造了兩級(jí)緩存,一級(jí)緩存完整的數(shù)據(jù),另一級(jí)僅緩存元數(shù)據(jù),避免了由緩存量不足導(dǎo)致的緩存預(yù)測(cè)不準(zhǔn)確的問(wèn)題,保證了從緩沖池中替換出去的數(shù)據(jù)塊都具有較低的命中潛力。
圖3 HOSD 緩存方法讀寫流程
圖4 HOSD 緩存管理機(jī)制工作流程
圖5 HOSD 緩存方法替換策略
HOSD緩存替換策略的主要數(shù)據(jù)結(jié)構(gòu)由4個(gè)鏈表構(gòu)成(如圖5所示):MRU(most recently used)鏈表、MFU(most frequently used)鏈表、MRUG(MRU ghost)鏈表、MFUG(MFU ghost)鏈表。其核心思想如下。
● 當(dāng)數(shù)據(jù)塊進(jìn)入緩存時(shí),HOSD先將數(shù)據(jù)放入MRU鏈表中。MRU鏈表是依據(jù)數(shù)據(jù)塊的訪問(wèn)時(shí)間進(jìn)行排序的一個(gè)有限序列。當(dāng)一個(gè)新的數(shù)據(jù)塊進(jìn)入MRU鏈表時(shí),隊(duì)列LRU(least recently used)端的數(shù)據(jù)塊將被替換出去。如果MRU鏈表中的某個(gè)數(shù)據(jù)塊在被替換之前被二次訪問(wèn),那么將該數(shù)據(jù)塊放入MFU鏈表中的MFU端。MFU鏈表也是依據(jù)數(shù)據(jù)塊的訪問(wèn)時(shí)間進(jìn)行排序的一個(gè)有限序列。不同的是,每發(fā)生一次二次命中,都是把MFU鏈表中的對(duì)應(yīng)數(shù)據(jù)塊放到MFU鏈表頭部。
● 如果有數(shù)據(jù)需要進(jìn)入緩存中,而此時(shí)緩存中的數(shù)據(jù)塊數(shù)目已經(jīng)到了設(shè)定的閾值,HOSD會(huì)從LRU和LFU(least frequently used)端刪除元素,并將對(duì)應(yīng)的元數(shù)據(jù)信息送入ghost鏈表中,即MFUG鏈表和MRUG鏈表。MFUG鏈表和MRUG鏈表不存儲(chǔ)數(shù)據(jù),只存儲(chǔ)數(shù)據(jù)塊的訪問(wèn)記錄。將MFU鏈表的數(shù)據(jù)送入MFUG鏈表中,同時(shí)釋放該數(shù)據(jù)塊在MFU鏈表中占用的存儲(chǔ)空間;如果釋放的數(shù)據(jù)塊在MRU鏈表中,那么將該元素從中刪除,并送入MRUG鏈表中。
● 當(dāng)再次訪問(wèn)該數(shù)據(jù)塊時(shí),數(shù)據(jù)如果在MRUG鏈表或者M(jìn)FUG鏈表中,那么從存儲(chǔ)池讀取該元素,并重新將其插入MRU鏈表或MFU鏈表中。HOSD會(huì)根據(jù)MRUG鏈表或者M(jìn)FUG鏈表中發(fā)生偽命中次數(shù)的多少,動(dòng)態(tài)地調(diào)整MRU或MFU兩個(gè)鏈表應(yīng)包含的元素的個(gè)數(shù)。
HOSD緩存替換策略在傳統(tǒng)算法上構(gòu)造了一層元數(shù)據(jù)緩存,能夠較快地讀取剛被替換的緩存,并兼顧數(shù)據(jù)塊的最近訪問(wèn)時(shí)間和歷史訪問(wèn)頻率信息,可以準(zhǔn)確識(shí)別出緩存中訪問(wèn)熱度較低的數(shù)據(jù)塊,將其替換出緩存池,從而保證緩存中的數(shù)據(jù)塊都具有較高的命中潛力。此外,在真實(shí)系統(tǒng)中實(shí)現(xiàn)的HOSD緩存策略支持多線程訪問(wèn)。
分布式存儲(chǔ)系統(tǒng)中的數(shù)據(jù)回刷操作和前臺(tái)應(yīng)用會(huì)競(jìng)爭(zhēng)系統(tǒng)中的I/O、網(wǎng)絡(luò)和CPU等資源。為了減小對(duì)前臺(tái)性能的影響,HOSD采用主動(dòng)回刷的策略,并根據(jù)應(yīng)用負(fù)載自適應(yīng)地調(diào)整回刷速率。目標(biāo)包括兩個(gè)方面:一是讓系統(tǒng)將緩存池中的臟數(shù)據(jù)盡快回刷到存儲(chǔ)池,二是減少回刷操作過(guò)程對(duì)前臺(tái)應(yīng)用的影響。
當(dāng)緩存中的數(shù)據(jù)量達(dá)到一定的閾值時(shí),HOSD周期性地主動(dòng)將緩存中較冷的臟數(shù)據(jù)回刷到存儲(chǔ)池,而不是等到替換發(fā)生時(shí)再回刷。自適應(yīng)的主動(dòng)回刷機(jī)制需要跟蹤系統(tǒng)中的應(yīng)用負(fù)載,進(jìn)而動(dòng)態(tài)調(diào)整數(shù)據(jù)回刷的速率,實(shí)現(xiàn)回刷操作快速完成,并對(duì)前臺(tái)應(yīng)用性能影響較小。
在回刷速率控制方面,HOSD采用一個(gè)開/關(guān)邏輯閥來(lái)進(jìn)行調(diào)控(如圖6所示)。是否在下一時(shí)間周期內(nèi)執(zhí)行數(shù)據(jù)回刷操作取決于當(dāng)前時(shí)間周期內(nèi)負(fù)載的輕重。如果當(dāng)前時(shí)間周期內(nèi)負(fù)載較輕,則下一時(shí)間周期執(zhí)行數(shù)據(jù)回刷操作;反之,下一周期不執(zhí)行數(shù)據(jù)回刷操作。也就是說(shuō),利用當(dāng)前周期內(nèi)的負(fù)載來(lái)近似估算下一周期的負(fù)載,因此時(shí)間周期不能設(shè)置得太長(zhǎng)。
HOSD是基于Ceph 0.94.2開發(fā)的緩存管理系統(tǒng),為了測(cè)試HOSD原型系統(tǒng)的性能,本文構(gòu)建了一個(gè)分布式存儲(chǔ)系統(tǒng)。其中,存儲(chǔ)服務(wù)器通過(guò)專用的高速存儲(chǔ)網(wǎng)絡(luò)連接起來(lái)。每臺(tái)機(jī)器都有一定數(shù)量的硬盤驅(qū)動(dòng)器(hard disk drive,HDD)用于構(gòu)建存儲(chǔ)池,以及一定數(shù)量的固態(tài)硬盤用于構(gòu)建緩存池。
實(shí)驗(yàn)所用的測(cè)試環(huán)境描述如下:實(shí)驗(yàn)過(guò)程中共使用了3臺(tái)機(jī)器,每臺(tái)機(jī)器配有2個(gè)E5-2609V2 CPU、4個(gè) DDR3 RECC 8 GB內(nèi)存、6塊ST2000NM0033 2T SASA磁盤、2塊Intel S3500 480 GB固態(tài)硬盤、一塊Intel S3500 120 GB固態(tài)硬盤、一塊LSI 9260-8IRAID卡以及一塊Intel X520-SR2萬(wàn)兆網(wǎng)卡,每臺(tái)機(jī)器均安裝了Redhat 7.0操作系統(tǒng)。這些機(jī)器通過(guò)萬(wàn)兆光纖交換機(jī)連接起來(lái),形成一個(gè)高速集群存儲(chǔ)系統(tǒng)。
通過(guò)對(duì)比HOSD和Ceph自帶的分布式緩存系統(tǒng)Cache Tiering的性能,評(píng)價(jià)HOSD的性能。通過(guò)播放有代表性的讀寫請(qǐng)求trace,收集系統(tǒng)的每秒輸入輸出量(input/output per second,IOPS)和讀寫帶寬等數(shù)據(jù)。實(shí)驗(yàn)采用典型的I/O測(cè)試工具FIO(flexible I/O tester)生成有代表性的工作負(fù)載。FIO能生成具有不同特征的工作負(fù)載,特征參數(shù)包括讀寫比例、傳輸請(qǐng)求大小和同時(shí)發(fā)出請(qǐng)求的最大數(shù)目等。
4.2.1 人工負(fù)載下的性能
第一組實(shí)驗(yàn)使用FIO默認(rèn)的均衡隨機(jī)負(fù)載進(jìn)行測(cè)試。實(shí)驗(yàn)中磁盤存儲(chǔ)池大小為200 GB,SSD緩存池大小為40 GB,Ceph對(duì)象大小設(shè)置為1 MB,F(xiàn)IO播放負(fù)載所用的iodepth參數(shù)值設(shè)為128。分別將請(qǐng)求大小參數(shù)設(shè)置為4 KB、1 MB和4 MB,分別測(cè)試Cache Tiering和HOSD的IOPS及讀寫帶寬。
圖6 HOSD 緩存臟數(shù)據(jù)回刷控制機(jī)制
圖7 FIO 隨機(jī)負(fù)載下的I/O 性能
圖7統(tǒng)計(jì)了每種情況下HOSD相對(duì)于Cache Tiering的加速比,加速比在2.52和5.96之間波動(dòng)。為了統(tǒng)計(jì)HOSD的平均加速效果,筆者計(jì)算了各個(gè)加速比的幾何平均值,以減小極端數(shù)據(jù)對(duì)平均值的影響。可以得到,HOSD帶來(lái)高達(dá)3.48的平均加速比。因此,相對(duì)于Cache Tiering,HOSD帶來(lái)了明顯的性能提高。這種性能提升的原因是:Cache Tiering將大量冷數(shù)據(jù)調(diào)入緩存,既占用了緩存空間,又增加了系統(tǒng)的I/O開銷;HOSD則通過(guò)懶惰緩存的方法,保證了緩沖池中的數(shù)據(jù)具有較高的命中率,并通過(guò)自適應(yīng)的主動(dòng)回刷機(jī)制,保證了分布式緩存系統(tǒng)具有較低的維護(hù)開銷。
4.2.2 真實(shí)負(fù)載下的性能
為了在真實(shí)的磁盤I/O 負(fù)載下比較Cache Tiering和HOSD的性能,第二組實(shí)驗(yàn)使用FIO同時(shí)播放多個(gè)trace進(jìn)行測(cè)試。實(shí)驗(yàn)中磁盤存儲(chǔ)池大小為100 GB,SSD緩存池大小為8 GB,Ceph對(duì)象大小設(shè)置為1 MB,F(xiàn)IO播放負(fù)載所用的iodepth參數(shù)值設(shè)為64。同時(shí)播放的trace包括prxy_1、wdev_0、prxy_0、webmail和hm_0,分別測(cè)試Cache Tiering和HOSD的IOPS。
表1統(tǒng)計(jì)了第二組實(shí)驗(yàn)中每種情況下HOSD相對(duì)于Cache Tiering的加速比,加速比在1.01和1.13之間波動(dòng)。為了統(tǒng)計(jì)HOSD的平均加速效果,筆者計(jì)算了各個(gè)加速比的幾何平均值??梢钥闯觯琀OSD帶來(lái)高達(dá)1.08的平均加速比。因此,相對(duì)于Cache Tiering,HOSD帶來(lái)了一定的性能提高。
第二組實(shí)驗(yàn)的平均加速比相對(duì)第一組實(shí)驗(yàn)明顯下降,原因分析如下:筆者統(tǒng)計(jì)了實(shí)驗(yàn)所用的5個(gè)I/O trace,發(fā)現(xiàn)每個(gè)trace的訪問(wèn)都局限在一個(gè)較小的地址空間。這樣帶來(lái)的結(jié)果是無(wú)論使用Cache Tiering還是HOSD,絕大多數(shù)I/O請(qǐng)求會(huì)在SSD緩存區(qū)命中。在命中的情況下,二者性能幾乎沒有差距。不同的是,HOSD維護(hù)緩存區(qū)中數(shù)據(jù)的數(shù)據(jù)交換操作成本要比Cache Tiering低一些,且對(duì)訪問(wèn)時(shí)間序列的維護(hù)更加精確,因此帶來(lái)了8%的性能提高。
表1 播放真實(shí)trace 負(fù)載下的I/O 性能
隨著閃存的日益普及,無(wú)論是工程師還是研究人員,都對(duì)將其集成到存儲(chǔ)棧中表現(xiàn)出較大興趣。硬盤制造商支持混合磁盤已有多年。主流操作系統(tǒng)上也已經(jīng)有如ReadyBoost和bcache的軟件實(shí)現(xiàn)。Facebook將固態(tài)盤作為數(shù)據(jù)中心磁盤進(jìn)行高速緩存。Solaris ZFS支持使用固態(tài)盤作為二級(jí)緩存[2]。NetApp公司也使用固態(tài)硬盤來(lái)加速存儲(chǔ)系統(tǒng)[3]。
早期的一些研究主要關(guān)注如何改進(jìn)基于閃存的高速緩存。Kgil T等人[4]提出將閃存作為內(nèi)存擴(kuò)展或磁盤緩存來(lái)減少功耗。他們采用能夠改變糾錯(cuò)碼(error correction code,ECC)強(qiáng)度和閃存芯片單元存儲(chǔ)密度的可編程閃存控制器,能夠在保證性能犧牲不到5%的情況下延長(zhǎng)閃存使用壽命。Mesnier M P等人[5]利用從文件系統(tǒng)和數(shù)據(jù)庫(kù)管理系統(tǒng)獲得的語(yǔ)義信息改進(jìn)基于SSD的磁盤緩存,通過(guò)對(duì)元數(shù)據(jù)塊和小文件賦予更高的優(yōu)先級(jí),能夠獲得比不考慮語(yǔ)義的緩存算法更好的性能。Pritchett T等人[6]將SSD作為多個(gè)服務(wù)器的全局高速緩存,以便最大化它的利用率。他們用更少的SSD設(shè)備獲得更高的命中率,比為每個(gè)服務(wù)器單獨(dú)配置緩存更加高效。同時(shí)他們還通過(guò)懶惰緩存機(jī)制來(lái)延長(zhǎng)SSD設(shè)備的壽命。
近期的研究工作[7]利用內(nèi)部垃圾回收行為提高了固態(tài)硬盤的緩存性能。垃圾回收操作對(duì)SSD的性能和壽命有較大的影響。研究人員將SSD分為3個(gè)區(qū)域(未使用區(qū)域、讀區(qū)域和寫區(qū)域),動(dòng)態(tài)調(diào)整這些區(qū)域的大小,在提高命中率的同時(shí),減少了擦除操作次數(shù)。同時(shí),SSD也可以作為數(shù)據(jù)庫(kù)管理系統(tǒng)的擴(kuò)展緩沖池。參考文獻(xiàn)[8]提出了基于訪問(wèn)頻率的替換策略——溫度感知緩存(temperature-aware caching,TAC)。參考文獻(xiàn)[9]在Microsoft SQL Server上實(shí)現(xiàn)了一個(gè)專用模型,作者還評(píng)估了3個(gè)不同的將臟頁(yè)替換出內(nèi)存緩存池的策略。
除了緩存,存儲(chǔ)分層[10-12]是另一個(gè)熱門的混合存儲(chǔ)技術(shù)。一個(gè)分層存儲(chǔ)系統(tǒng)會(huì)動(dòng)態(tài)選擇熱門的數(shù)據(jù)子集,并將它們移動(dòng)到速度更快但容量較小的設(shè)備上。這項(xiàng)技術(shù)被廣泛應(yīng)用于企業(yè)級(jí)存儲(chǔ)陣列,以滿足大容量、高性能與低成本的需求。一個(gè)典型例子是,蘋果公司通過(guò)Fusion Drive推出了消費(fèi)級(jí)分層存儲(chǔ)產(chǎn)品。
緩存和分層存儲(chǔ)都屬于分級(jí)存儲(chǔ)。作為替代,橫向混合存儲(chǔ)系統(tǒng)使用SSD存儲(chǔ)數(shù)據(jù)的特定部分,以更好地利用SSD和HDD。這種體系結(jié)構(gòu)背后的想法是一個(gè)塊的訪問(wèn)模式取決于它存儲(chǔ)了什么樣的數(shù)據(jù)。例如,元數(shù)據(jù)占用的存儲(chǔ)空間極小,但是其訪問(wèn)頻率較高[13]。因此,將它們固定存儲(chǔ)在SSD中可以提高總體性能,同時(shí)避免了來(lái)回移動(dòng)數(shù)據(jù)塊的開銷。這種架構(gòu)的例子包括ChunkStash[14]和I-CASH[15]。Wang S C等人[16]發(fā)現(xiàn)了HDD讀寫性能的波動(dòng)性,從而設(shè)計(jì)了調(diào)度器,在HDD和SSD的混合存儲(chǔ)中根據(jù)HDD的波動(dòng)情況將I/O調(diào)度至HDD或者SSD,在節(jié)省SSD存儲(chǔ)空間的同時(shí),降低了尾部時(shí)延。
Liu Z X等人[17]指出,在大規(guī)模分布式存儲(chǔ)系統(tǒng)中,負(fù)載均衡是影響服務(wù)等級(jí)目標(biāo)(service-level objective,SLO)的關(guān)鍵因素,而一個(gè)快速的緩存可以保證負(fù)載均衡。由此設(shè)計(jì)了一個(gè)兩層的緩存系統(tǒng)DistCache,通過(guò)兩個(gè)不同的哈希函數(shù)將熱數(shù)據(jù)分散在不同的緩存層,從而提升緩存性能。Zhang Y等人[18]通過(guò)記錄存儲(chǔ)集群中各節(jié)點(diǎn)的緩存命中情況來(lái)動(dòng)態(tài)調(diào)整集群中的緩存分配情況,從而提升總體緩存命中率,減少與底層存儲(chǔ)系統(tǒng)的數(shù)據(jù)交換總量。Berger D S等人[19]針對(duì)用戶的網(wǎng)絡(luò)服務(wù)存在的長(zhǎng)尾時(shí)延問(wèn)題,提出了RobinHood方法,該方法可以動(dòng)態(tài)地將緩存從富余的地方分配至緊張的地方,有效地降低了尾部時(shí)延。在糾刪碼被越來(lái)越多地應(yīng)用于現(xiàn)代存儲(chǔ)集群中的情況下,Luo T Q等人[20]提出了使用編碼緩存來(lái)減少峰值數(shù)據(jù)傳輸量的方法。
本文提出了一種分布式存儲(chǔ)系統(tǒng)中數(shù)據(jù)高效緩存方法HOSD,采用讀寫旁路和懶惰緩存的辦法,降低了緩存操作對(duì)I/O時(shí)延的影響,并減少了對(duì)冷數(shù)據(jù)的緩存,避免了緩存污染情況的發(fā)生。同時(shí),采用高效的緩存管理機(jī)制降低了緩存管理對(duì)存儲(chǔ)系統(tǒng)讀寫性能的影響,并通過(guò)兼顧最近訪問(wèn)時(shí)間和歷史訪問(wèn)頻率的緩存替換策略,提高了對(duì)緩存中冷數(shù)據(jù)的識(shí)別精度,使得更多的熱數(shù)據(jù)得以保留在緩存中,提高了緩存的效率和分布式場(chǎng)景下弱局部性訪問(wèn)的I/O性能。另外,通過(guò)跟蹤應(yīng)用負(fù)載輕重而自適應(yīng)地主動(dòng)回刷臟數(shù)據(jù),減輕了數(shù)據(jù)回刷操作對(duì)系統(tǒng)性能的影響。最后,通過(guò)定期對(duì)內(nèi)存中維護(hù)的緩存信息進(jìn)行持久化來(lái)保證存儲(chǔ)系統(tǒng)和緩存方法的容錯(cuò)能力。實(shí)驗(yàn)表明,相對(duì)于Ceph自帶的Cache Tiering緩存系統(tǒng),本文所提分布式緩存方法HOSD實(shí)現(xiàn)了3.48的平均加速比,帶來(lái)了明顯的性能提升。未來(lái),將進(jìn)一步探索本文提出的緩存策略在大規(guī)模存儲(chǔ)集群及糾刪碼存儲(chǔ)系統(tǒng)中的應(yīng)用。