以下為王勁凱先生的演講實(shí)錄整理:
FusionStack公司介紹:2007年成立,公司做分布式存儲(chǔ)。2010年上線首個(gè)超融合項(xiàng)目,是國內(nèi)較早做超融合項(xiàng)目的企業(yè)。
我們先通過英特爾官網(wǎng)數(shù)據(jù)畫出的一張圖來分析過去十年閃存的動(dòng)態(tài)。紅線是閃存的性能增長曲線,從2008年開始到2013年,閃存性能變化并不大。從4萬IOPS達(dá)到10萬IOPS,2013年之后突然爆發(fā),目前可以看到將近百萬級(jí)別的IOPS的閃存成為主流。另外就是CPU性能增長曲線,CPU性能過去在十年變化也不是很大。這里我們發(fā)現(xiàn)一個(gè)非常明顯的問題,存儲(chǔ)軟件性能逐漸跟不上閃存的發(fā)展,閃存性能繼續(xù)提升,存儲(chǔ)成了整個(gè)軟件定義存儲(chǔ)和超融合的瓶頸。
高性能存儲(chǔ)技術(shù)演進(jìn)觸發(fā)的裸金屬架構(gòu)
在過去的十年里,陣列時(shí)代的高性能是高速緩存技術(shù)。磁盤性能比較低,一個(gè)磁盤一秒鐘處理100IO。數(shù)據(jù)量相對不是很大,熱點(diǎn)比較集中。用內(nèi)存來做緩存,實(shí)際IO落到內(nèi)存里面,這種方式是過去十多年來一直用的方式。
分布式時(shí)代,谷歌領(lǐng)先分布式互聯(lián)網(wǎng)架構(gòu)時(shí)代,大家用的是并行IO。這時(shí)的時(shí)代特點(diǎn)是什么?磁盤性能低,數(shù)據(jù)量大,熱點(diǎn)不明顯。大量磁盤,用軟件把IO聚合起來,一個(gè)分析業(yè)務(wù)我們把它拆散到數(shù)百塊磁盤甚至上千塊磁盤處理,這是分布式時(shí)代的一個(gè)做法。
現(xiàn)在已然進(jìn)入了閃存時(shí)代,閃存性能高,延遲低不再需要你去優(yōu)化。但幾乎所有軟件都落后于閃存的性能,用戶可能在買超融合的時(shí)候,購買多塊閃存,一塊100萬IOPS,3塊就是300萬IOPS,你的軟件能跑300萬嗎?通常不能。用非常高配英特爾至強(qiáng)2699的CPU跑到30萬IOPS,一個(gè)節(jié)點(diǎn)。
在2013年前后,我們注意這到個(gè)問題,然后進(jìn)行了深入研究,最終提出了一個(gè)裸金屬架構(gòu)概念。
裸金屬架構(gòu)實(shí)現(xiàn)應(yīng)當(dāng)注意的問題
這個(gè)架構(gòu)首先我們要注意幾點(diǎn),第一intterupt是什么?過去編程通常會(huì)使用中斷,你第一件事情就是避免中斷。原子操作,用來實(shí)現(xiàn)鎖,無鎖隊(duì)列。我們有CPU原子指令可以實(shí)現(xiàn)。過去那個(gè)時(shí)代,這個(gè)東西比較高效。閃存實(shí)現(xiàn)這個(gè)東西變得比較低效,帶來核之間的互斥。TLB miss(TLB是頁表緩沖,就是負(fù)責(zé)將虛擬內(nèi)存地址翻譯成實(shí)際的物理內(nèi)存地址,而CPU尋址時(shí)會(huì)優(yōu)先在TLB中進(jìn)行尋址。TLB miss則表示TLB中沒有所需頁表),而處理器的性能和尋址的命中率有很大的關(guān)系。還有NUMA的問題,你在一個(gè)CPU訪問另外一個(gè)CPU內(nèi)存會(huì)發(fā)現(xiàn)非常之慢??赡苎舆t增大一兩倍,一般場景沒有問題,閃存場景不可用。
這個(gè)是CPU內(nèi)部的照片,八個(gè)核,中間紅色部分是CPU核之間的鏈接。有一個(gè)比較有意思的現(xiàn)象,每一個(gè)核會(huì)帶一個(gè)L2 Cache,核與核之間通過內(nèi)部高速聯(lián)接連起來。你會(huì)發(fā)現(xiàn)一個(gè)問題,如果你一個(gè)核訪問數(shù)據(jù),它所帶的L2會(huì)很快。但跨一個(gè)核,在另外一個(gè)核上訪問數(shù)據(jù)就會(huì)出現(xiàn)性能下降問題。我們提出一個(gè)理念就是Core as a compute,你跨一個(gè),哪怕另外一個(gè)節(jié)點(diǎn)也是遠(yuǎn)程訪問,帶來的代價(jià)可能會(huì)導(dǎo)致軟件性能急劇下降。因此設(shè)計(jì)的時(shí)候盡可能的避免遠(yuǎn)程訪問,做到每一個(gè)核處理自己的事情,核與核要盡量壓縮。
總體架構(gòu)要進(jìn)行哪些改進(jìn)?首先傳統(tǒng)編程模型里用到生產(chǎn)的模型在閃存時(shí)代是不可用的。我們用的是Producer-consumer模型,現(xiàn)在用的分時(shí)操作系統(tǒng),出現(xiàn)之前采用的就是批處理的Producer-consumer玩法。任務(wù)調(diào)度,調(diào)度器導(dǎo)致你性能下降,會(huì)反復(fù)去影響你的寄存器。我們在這上面設(shè)立了協(xié)作式調(diào)度器。事件處理,傳統(tǒng)模型采用event,event延遲很高,會(huì)達(dá)到10微妙,對閃存來說非常長了。我們用的是Polling模型。過去采用多核共同處理一件事情,我們用lock/lock-free。其它就是關(guān)于硬件訪問,你采用訪問網(wǎng)卡或者硬盤都會(huì)把它交給操作系統(tǒng)。這些我們都避開了。
Run-to-completion,采用polling和recv,exec,send四步。采用這個(gè)模型基本上就避免了我們剛才所說得幾乎所有問題。我們要把VM的訪問,根據(jù)不同數(shù)據(jù)的位置放到不同的核上。避免核和核之間的交互。那么,coroutine(協(xié)程)能不能提升性能?答案是不能。調(diào)試?yán)щy,gdb不可用。Swapcontext開銷大(150萬次每秒),需要改進(jìn)。我們目前的測算是每秒能測算150萬次的切換,這個(gè)對我們來說太慢了,我們自己來寫,但如果計(jì)算器的拷貝遺漏了不該遺漏的東西,后果很嚴(yán)重。
Stack-bypass是繞過操作系統(tǒng)訪問硬件的部分。首先紅色部分是操作系統(tǒng)的對站,通常無法繞開紅色部分對站,已經(jīng)有很成熟的方法已經(jīng)列出來了,可以讓你繞過這些東西,我們把這些東西徹底解決掉了。
另外,我們知道ceph,ceph我們目前看到的數(shù)據(jù)比較快,能夠跑出15萬IOPS。到了今天我們延遲已經(jīng)壓縮到300微秒以下。我們單個(gè)IO延遲是軟件對站里面延遲,目前是3微秒, NVME設(shè)備是90微秒。英特爾下一代的處理器延遲是10微秒,我們只需要3微秒完成它軟件層的處理。未來把這個(gè)壓縮到更低,有可能壓縮到2微秒。
雖然FusionStack是初創(chuàng)公司,但產(chǎn)品卻不是基于某個(gè)開源軟件改的。因?yàn)樵?007年的時(shí)候沒有任何東西可以用。其產(chǎn)品是一個(gè)分布式元數(shù)據(jù)的加工,是有元數(shù)據(jù)的。比較有意思是社區(qū)的開源版本軟件定義存儲(chǔ)絕大部分都是采用某種改進(jìn)的模型,沒有元數(shù)據(jù)。我們看到比較多的商業(yè)軟件帶元數(shù)據(jù)比較多一些。為什么有這個(gè)分歧,我們認(rèn)為在2007年前后Hadoop主導(dǎo)分布式的時(shí)候,大家對一些數(shù)據(jù)不滿意,紛紛設(shè)計(jì)新的模型。就FusionStack的角度來看,對于一個(gè)分布式塊存儲(chǔ)來說,分布式元數(shù)據(jù)足以應(yīng)對生產(chǎn)需求,分布式元數(shù)據(jù)帶來一些好處,比如說本地化。
之前是邏輯布局,這是物理布局,物理布局與很多存儲(chǔ)廠商交流的時(shí)候,都說與傳統(tǒng)架構(gòu)有一致性,其實(shí)就是這樣。FusionStack的設(shè)計(jì)是介于分布式存儲(chǔ)和傳統(tǒng)存儲(chǔ)之間的模型。首先我們考慮的是保證你能夠滿足傳統(tǒng)存儲(chǔ)模型的一致性的性能,然后才是分布式問題。我們有一個(gè)微控制器,每一個(gè)卷會(huì)有一個(gè)控制器,因?yàn)樗锌刂破鞴芾淼脑獢?shù)據(jù)。這個(gè)控制器記錄了它的副本位置,我們的副本是分成1兆大小的塊,打散存放在集群中。每卷一個(gè)控制器,這個(gè)控制器的位置隨著你的虛擬機(jī)的遷移進(jìn)行遷移。