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