以下內(nèi)容根據(jù)速記整理,未經(jīng)本人審定:
可計算存儲是這幾年熱門討論的話題。通常IT系統(tǒng)主要功能部件包括三大部分——計算、網(wǎng)絡(luò)、存儲。計算部分,主要指CPU,隨著摩爾定律的失效,每年CPU的算力增長非常有限,無法滿足應(yīng)用需求,因此才有了各種加速卡的出現(xiàn),這些加速卡可能是基于FPGA或者基于GPU、TPU,為了在某個特定領(lǐng)域極大卸載CPU計算壓力,從而提升整個系統(tǒng)能效比。
網(wǎng)絡(luò)也面臨同樣的問題,傳統(tǒng)網(wǎng)絡(luò)需要CPU運行一系列網(wǎng)絡(luò)協(xié)議實現(xiàn)網(wǎng)絡(luò)傳輸,但這一方面浪費CPU計算資源,另一方面也使網(wǎng)絡(luò)帶寬受限,智能網(wǎng)卡的出現(xiàn)大大緩解了這個問題,卸載CPU網(wǎng)絡(luò)相關(guān)功能,同時又把網(wǎng)絡(luò)傳輸帶寬提升了一個數(shù)量級。
再看存儲,物聯(lián)網(wǎng)時代已經(jīng)到來,每天都有海量數(shù)據(jù)產(chǎn)生,如何對這些數(shù)據(jù)進行存儲和訪問,對系統(tǒng)而言是非常重要的一環(huán)??上驳氖请S著高性能、大容量的SSD逐漸普及,現(xiàn)在的一臺機器上可以部署十幾張存儲卡,整體可提供幾十甚至上百TB存儲空間,存儲帶寬和訪問延遲相比HDD都得到了極大改善。
隨之而來的問題就是如何對這些海量數(shù)據(jù)進行處理,這就對CPU提出非常大的挑戰(zhàn),可計算存儲便應(yīng)運而生。
ScaleFlux作為可計算存儲領(lǐng)域的先驅(qū)廠商,一直致力于提升應(yīng)用及基礎(chǔ)設(shè)施附加值,具體來說我們希望產(chǎn)品可以在以下三個方面達成一個目標(biāo)。
第一,擴展負載容量的同時,也能夠線性擴展性能;第二,優(yōu)化基礎(chǔ)設(shè)施的成本;第三,能夠靈活適配應(yīng)用,緊跟應(yīng)用需求。
可計算存儲設(shè)備本質(zhì)上重新定義了存儲和計算的軟硬件邊界,在把可計算存儲推向?qū)嶋H應(yīng)用的過程中,我們必須要解決以下幾個問題。
第一,存儲設(shè)備內(nèi)的計算能力到底有多少,因為我們本質(zhì)上是想把主機端CPU的計算能力卸載到近存儲這一邊,所以說如果這個存儲設(shè)備沒有足夠算力,那么屬于無效卸載。
第二,可計算存儲到底能給我們整個系統(tǒng)帶來多少性能收益,這與我們所卸載的計算緊密相關(guān),我們希望卸載的計算對整個系統(tǒng)來講占有比較大的權(quán)重,這樣性能收益才會比較明顯。
第三,我們使用可計算存儲設(shè)備所解決的這個問題,適用范圍到底有多廣。最后一點,ScaleFlux重新劃分了軟硬件的邊界,頂層底層需要協(xié)同設(shè)計,這個協(xié)同設(shè)計的復(fù)雜度到底有多高,如果復(fù)雜度高,很可能會成為可計算存儲設(shè)備落地的一個障礙。
下面我們就具體的從幾個方面來介紹一下ScaleFlux在可計算存儲方面所做得一些嘗試。
第一點,透明壓縮。此前實現(xiàn)壓縮功能最常見的辦法是軟件壓縮,就是使用CPU運行軟件代碼實現(xiàn)壓縮效果。通常我們可以看到應(yīng)用中已經(jīng)集成了多種多樣的壓縮算法,本質(zhì)上是在壓縮率和壓縮吞吐之間做一個取舍,壓縮率很好的算法如ZLIB,GZIP壓縮復(fù)雜度比較高,所以說相對來說它的壓縮吞吐會比較低,還有壓縮比較快的那些算法,像SNAPPY,LZ4的壓縮效果又不太好。
整體來講,這些軟件壓縮的缺點是占用CPU資源,如果我們想用壓縮效果比較好的壓縮算法,其速度就往往較慢,很可能會成為整個系統(tǒng)的瓶頸。既想達到比較好的壓縮效果,又能夠使壓縮帶寬較大,就需要壓縮加速卡。壓縮加速卡是把壓縮和解壓縮功能從CPU卸載到專門的壓縮卡上,以此實現(xiàn)壓縮率和壓縮吞吐間比較好的平衡。
但單張壓縮加速卡的壓縮吞吐有上限,基本遠低于存儲系統(tǒng)所能夠提供的帶寬,因此為了進一步提升壓縮帶寬,我們需要在一臺機器里插入多張壓縮加速卡,占用額外的槽位,也就是要減少相應(yīng)存儲設(shè)備數(shù)量,導(dǎo)致系統(tǒng)可能得不償失。
為了解決這個問題,ScaleFlux提出了透明壓縮,把壓縮和解壓縮功能直接集成到SSD的主控里,當(dāng)主機端向存儲設(shè)備寫入數(shù)據(jù)時,這些數(shù)據(jù)首先會在主控里進行壓縮,壓縮完再寫入NAND,當(dāng)主機端需要讀取數(shù)據(jù),主控首先會從NAND上讀取壓縮后的數(shù)據(jù),經(jīng)過解壓縮再返回到上層應(yīng)用。
所以從應(yīng)用端來講,整個壓縮和解壓縮的過程,是完全透明的,這就是為什么我們叫它透明壓縮。當(dāng)然透明壓縮已經(jīng)具備了之前壓縮加速卡的一些特性,比如壓縮帶寬較高,其自身的額外優(yōu)勢是不需要額外的槽位,因此在增加存儲設(shè)備時,其壓縮和解壓縮的能力,也就得到了相應(yīng)的擴展,而真正落到NAND上的數(shù)據(jù)量減少,相對延長了SSD的使用壽命,另外還可以提升應(yīng)用性能,后面我們會專門介紹到這一部分。
使用透明壓縮,具體有什么效果,這張圖給了我們一個量化的說明,我們對比了具有透明壓縮功能的CSD 2000和市面上普通的PCIe SSD兩種產(chǎn)品,測試場景是2.5:1的數(shù)據(jù)壓縮比,8個jobs,32個隊列深度的4KB穩(wěn)態(tài)性能下的對比,然后通過這個圖我們可以看到,圖中縱軸是IOPS,也就是每秒操作數(shù),這個數(shù)值越高越好,橫軸代表讀寫操作中讀的比例,最左邊的100%對應(yīng)的是純讀的場景,最右邊的0%對應(yīng)的是純寫的場景。
可以看出,使用了透明壓縮的CSD 2000,性能上具有很大的優(yōu)勢,尤其是在讀寫混合的場景下,當(dāng)我們的寫比例超過50%的時候,基本上CSD 2000在穩(wěn)態(tài)下的性能是普通PCIeSSD的2倍左右,所以也希望借著透明壓縮可以給用戶提供更優(yōu)秀的混合讀寫性能,更低的單位存儲價格以及更簡單的頂層應(yīng)用集成。
針對數(shù)據(jù)庫上的應(yīng)用,我們對比了MySQL和PostgreSQL兩款最常見數(shù)據(jù)庫的場景,使用透明壓縮后可以節(jié)約50%以上的存儲空間,同時也可以提供更好的性能。
我們還希望可計算存儲可以承擔(dān)一些其他的計算邏輯,這些計算邏輯可以由專用的硬件來完成,也可以由通用的硬件完成,專用硬件是面向特定領(lǐng)域?qū)iT設(shè)計而成,因此可以比較容易的實現(xiàn)更高的并行度和吞吐率,這里的以行存數(shù)據(jù)庫中間的數(shù)據(jù)過濾作為例子,對專用硬件下的可計算存儲做一個說明。
這里專用硬件主要承擔(dān)的是列投影和行過濾的功能,列投影主要指是在掃描數(shù)據(jù)的時候,選擇出那些上層查詢感興趣的列,不敢去的列直接過濾掉,行過濾主要指當(dāng)某一行不滿足上述的查詢條件直接過濾掉,如果有可能滿足,再選上。
我們右邊通過了一個簡單的查詢語句,對列投影和行過濾的概念做一個說明,在查詢語句中,我們是選擇了三個列,ORDERKEY、EXTENDEDPRICE和DISCOUNT,上層只對這三個列感興趣,這三個列在可計算存儲內(nèi)部就直接被過濾掉了,所以叫做列投影。
同時我們查詢,還有一條額外的條件語句,也就是RETURNFLAG的值必須是52,如果不是52也就是不滿足上層的查詢條件,我們也會在掃描的時候,把這一行整個過濾掉,這個就叫做行過濾。
那么通過列投影和行過濾,我們希望可計算存儲達到這樣一個效果,首先就是可以極大減少從可計算存儲內(nèi)部傳輸?shù)街鳈C端的數(shù)據(jù)量,第二個就是減少PCIe帶寬和內(nèi)存帶寬的占用,第三就是大大減輕主機端CPU在后續(xù)處理時的壓力。
專用硬件雖然可以實現(xiàn)較好的計算卸載功能,但設(shè)計復(fù)雜度高,所以我們也要思考在通用硬件下是否能實現(xiàn)類似的近存儲計算。具體到可計算存儲設(shè)備,這里的通用硬件指的是ARM處理器或RISC-V處理器,但相對現(xiàn)有主機CPU計算力較弱。
如果我們想通過計算卸載來獲得整個系統(tǒng)性能的提升,承擔(dān)計算卸載的計算單元,其計算能力一般是要大于主機端CPU計算能力,只有在這種情況下,才有可能使整個系統(tǒng)產(chǎn)生一個比較好的效率。但是現(xiàn)在我們所面臨的情況,我們可計算存儲設(shè)備內(nèi)的計算單元,有可能它的計算能力是弱于主機端CPU的,在這種情況下,還有沒有可能實現(xiàn)一個比較有效的近存儲計算呢?
這里我們以列存數(shù)據(jù)庫中的數(shù)據(jù)作為例子進行探討,列存數(shù)據(jù)庫,就是把數(shù)據(jù)按照列的形式,緊密的排列,進而進行存儲,通過這種方式,一是有利于數(shù)據(jù)壓縮,第二,當(dāng)上層查詢需要訪問數(shù)據(jù)的時候,可以直接訪問感興趣的那些列,不感興趣的列不需要過濾,就直接不讀了。
那么現(xiàn)在由于可計算存儲設(shè)備內(nèi)部的計算單元計算能力比較弱,所以我們盡量需要避免對數(shù)據(jù)元素依次進行掃描,否則其計算邏輯與主機端的CPU相同,很可能導(dǎo)致整體性能不升反降。
取而代之的,我們不對單個元素進行過濾,而是對數(shù)據(jù)段進行過濾,一個數(shù)據(jù)段包含多個數(shù)據(jù)元素,如果某個數(shù)據(jù)段內(nèi)有滿足上層查詢條件,我們就把整個數(shù)據(jù)段進行選擇,如果不滿足上層的查詢條件,整個數(shù)據(jù)段就會被舍棄,如何快速對數(shù)據(jù)段進行一個判斷,這里所給出的一種方法,就是引入了國外的輔助元數(shù)據(jù),這些輔助元數(shù)據(jù)在當(dāng)初寫數(shù)據(jù)的時候,我們就已經(jīng)嵌入到列存數(shù)據(jù)庫里,輔助元數(shù)據(jù)就包含數(shù)據(jù)段內(nèi)數(shù)據(jù)分布的一個總結(jié)。
通過這種方式,我們也可以達到像之前專用硬件下的數(shù)據(jù)過濾類似的效果,在可計算存儲設(shè)備內(nèi)部進行一些預(yù)過濾,實現(xiàn)從存儲設(shè)備返回到主機端的數(shù)據(jù)量也會減少。
本質(zhì)上這種方法是在過濾的精確度或帶寬之間做了一個取舍,最終目的就使得我們雖然可計算存儲設(shè)備內(nèi)的計算能力比較弱,但能夠提供的掃描吞吐依然可以匹配,甚至大于上層主機端的掃描速度。
我們也對這種方法進行了一些評估,這里所使用的原始數(shù)據(jù)還是TPC-H Lineitem表,數(shù)據(jù)庫使用的是列存數(shù)據(jù)庫,當(dāng)前比較熱的一款引擎Click House,處理器是ARM Cortex A53處理器。
我們今天的分享到此結(jié)束,謝謝大家。