袁戎:非常感謝大家今天來(lái)聽我的演講,我希望能夠在這個(gè)演講中給大家?guī)?lái)一些干貨,這是我們?cè)贜VMe這個(gè)領(lǐng)域,Memblaze不斷地去實(shí)現(xiàn)、演進(jìn)這個(gè)協(xié)議做的一些探索。
PCIe SSD的發(fā)展階段一:性能峰值
首先我想說(shuō)一下,其實(shí)我們大家都知道我們SSD拿到最外面講的東西都是它的性能,它的性能是非常優(yōu)越的。我們從客戶的角度來(lái)看,我們對(duì)一個(gè)SSD的追求其實(shí)我們大家很多人都可以看到各種各樣的評(píng)測(cè),鋪天蓋地的都會(huì)大講SSD順序讀、順序?qū)?、隨機(jī)讀、隨機(jī)寫的能力到底是多少,我們把這叫做(PCIe SSD)最開始的性能追求階段一。
SSD的性能追求階段二:IO低延遲
當(dāng)前的NVMe SSD已經(jīng)比SATA SSD在性能方面有了巨大的質(zhì)變了,我們還知道SATA SSD是集中在600MB/s以下的傳輸數(shù)據(jù)。在NVMe階段上,我們可以把大量的Flash帶寬利用到,直接透?jìng)鹘oHost,讓Host享受到最高的讀寫帶寬。
所以NVMe SSD可以達(dá)到接近6GB/s的讀和接近4GB/s的寫,100萬(wàn)IOPS,這在SATA SSD的時(shí)代都是完全不能想象的數(shù)字。但是實(shí)際上很少有客戶真的能夠把NVMe SSD的性能能夠利用到極致,這就帶來(lái)了我們看到的第二個(gè)階段的性能追求。
我們平時(shí)所說(shuō)的所謂的順序讀、順序?qū)?、隨心讀、隨心寫的性能,其實(shí)它標(biāo)稱的數(shù)據(jù)我們?cè)诂F(xiàn)實(shí)生活場(chǎng)景中很難遇到。首先我們知道順序?qū)懙臏y(cè)試需要單線程,如果多線程引入了之后,順序?qū)懙臇|西在落盤的時(shí)候?qū)嶋H上會(huì)變成隨機(jī)寫,自然就帶來(lái)了額外的垃圾回收效果在里面,這些效果會(huì)導(dǎo)致我們硬盤實(shí)現(xiàn)的性能其實(shí)是會(huì)有一定下降的。
同樣,我們?cè)陔S機(jī)寫的測(cè)試中也有一些很苛刻的要求,測(cè)試它需要極高的壓力,這樣它才能夠把這些性能發(fā)揮到極致。這樣的測(cè)試環(huán)境往往在現(xiàn)實(shí)中不常見,導(dǎo)致用戶感受不到性能帶來(lái)的變化,我稱之為這是階段二的性能追求,本質(zhì)上的原因是需要低延時(shí)。
不管是什么樣的IO模型,不管是多小的IO請(qǐng)求,我的每一個(gè)IO都必須從硬盤上得到一個(gè)最及時(shí)的響應(yīng),這意味著不管在什么樣的應(yīng)用場(chǎng)景,請(qǐng)求都能夠得到最高速的響應(yīng),這樣才能夠體現(xiàn)出你的性能在整個(gè)系統(tǒng)級(jí)是低延時(shí)的。
那么NVMe SSD做了什么來(lái)做到極低的延遲?從系統(tǒng)的IO路徑角度,NVMe比原來(lái)的SATA SSD多了很多優(yōu)勢(shì),原來(lái)的SATA SSD的CPU從芯片和內(nèi)核要走到南橋,再通過(guò)南橋和SATA 的Bus再加上SATA 協(xié)議的一些東西,導(dǎo)致它天生延時(shí)就是非常高的。NVMe通過(guò)PCIe直接連接到CPU內(nèi)部,就把這些全部都給抹殺掉了。
我們現(xiàn)在可以看到最高性能的SSD檔次已經(jīng)做到10微秒的響應(yīng)時(shí)間,這10微秒僅僅是把數(shù)據(jù)從Host送到內(nèi)存。我們知道Flash響應(yīng)時(shí)間是比較慢的,這個(gè)時(shí)間在后臺(tái)操作中對(duì)于Host而言根本不用在乎,只要我的電容可以保證這部分的數(shù)據(jù)從內(nèi)存寫下去,數(shù)據(jù)只要落地就是安全的,這是主流的SSD都可以保證的東西。
我們可以看到主流的硬盤現(xiàn)在寫的延時(shí)都已經(jīng)降到20微秒以下,現(xiàn)在我們自己的產(chǎn)品可以做到10微秒,這個(gè)速度會(huì)體現(xiàn)在大量應(yīng)用中,都可以看到我的各種順序?qū)?、小帶寬、小壓力的寫都可以得到快速響?yīng)。
另外在讀延時(shí)沒(méi)有寫延時(shí)那么有優(yōu)勢(shì),因?yàn)閷懷訒r(shí)只要把數(shù)據(jù)落在內(nèi)存就結(jié)束了,但是讀的話所有每一筆數(shù)據(jù)都是來(lái)自于你的Flash,這方面最大頭的時(shí)延其實(shí)是在我們的Flash上面。
我們現(xiàn)在知道其實(shí)我們的3D TLC主流的Flash已經(jīng)比2D時(shí)代要好了很多了,2D時(shí)代那時(shí)候還是接近100微秒的讀延時(shí),更有極致的產(chǎn)品,我們也非常欣慰地看到Intel推出的一些產(chǎn)品,更加進(jìn)一步地把Flash上的讀延時(shí)推進(jìn)到了一個(gè)極致,都已經(jīng)到了10微秒左右的級(jí)別。這樣的效果,就會(huì)使得我們?cè)贜VMe或者SSD上看到的延時(shí)效果越來(lái)越好,對(duì)于用戶來(lái)說(shuō)性能感受也就越來(lái)越好。
階段三-NVMe SSD在廣泛部署后面臨的QoS挑戰(zhàn)
從階段二的性能追求之后,我們又會(huì)發(fā)現(xiàn)很多的用戶現(xiàn)在隨著硬盤越用越大,一塊硬盤4TB、8TB,一個(gè)用戶他用不到,他需要分成兩個(gè)用戶(共用一塊SSD)。這時(shí)候SSD會(huì)面臨一些新的挑戰(zhàn),因?yàn)楫?dāng)兩個(gè)應(yīng)用同時(shí)在使用一塊硬盤的時(shí)候,互相會(huì)對(duì)對(duì)方進(jìn)行一些干擾,這樣的干擾可能不會(huì)體現(xiàn)在IOPS,你的盤整體性能還是挺高的,但是從每一個(gè)用戶的角度看來(lái),都會(huì)認(rèn)為旁邊的應(yīng)用(Noisy Neighbors)影響了自己的正常響應(yīng)。
多個(gè)應(yīng)用共用一塊SSD造成延遲提高(Source: facebook)
在用戶的真正場(chǎng)景上,QoS是我們重要的第三個(gè)挑戰(zhàn)。在應(yīng)用共享SSD的時(shí)候,應(yīng)用之間干擾造成延時(shí)的巨幅升高。比如其中一個(gè)應(yīng)用程序在用的時(shí)候不停在寫,這個(gè)寫的過(guò)程就會(huì)對(duì)另外一個(gè)以讀為主的應(yīng)外造成巨大的影響,這個(gè)影響沒(méi)有辦法避免,因?yàn)橛脖P只有一個(gè)。
這個(gè)問(wèn)題怎么解決?我們現(xiàn)在實(shí)際上看到了很多解決方案,比如OpenChannel是一個(gè)方案,它希望通過(guò)對(duì)Flash的直接管理能夠進(jìn)行QOS控制。
NVMe的協(xié)議從一開始定義到現(xiàn)在,就是純粹為了Flash而生,它在這方面也有它自己的演進(jìn)路線。NVMe 1.4的時(shí)候有IOD規(guī)范的加入,其中文詞義就是IO的確定性。實(shí)際上它包含了什么內(nèi)容?實(shí)際上它是會(huì)在NVMe ?1.4加入之后,會(huì)把SSD 分成不同的Set,這個(gè)Set是一組Flash LUN的集合,稱之為一個(gè)Set。
通過(guò)NVM Sets機(jī)制對(duì)設(shè)備進(jìn)行物理隔離
比如說(shuō)我們可以知道我們現(xiàn)在一個(gè)固態(tài)硬盤有4通道、8通道、10通道,每個(gè)通道上還會(huì)有4個(gè)、8個(gè)、10個(gè)LUN,這些LUN可以拆分成一個(gè)一個(gè)Set,在Set上通過(guò)協(xié)議劃分成不同的Namespace,可以在協(xié)議中確定的要求每一個(gè)Namespace只屬于一個(gè)Set或者多個(gè)Set。這樣當(dāng)用戶訪問(wèn)其中一個(gè)Namespace,這部分空間是必須要落在一個(gè)確定的Flash LUN上面,也就是一個(gè)確定的Set上面。
NVM Set
這樣的好處很多,兩個(gè)獨(dú)立的Flash不像磁盤只有一個(gè)磁頭,盤片在轉(zhuǎn)的時(shí)候無(wú)論如何只有一個(gè)通道能夠出數(shù)據(jù),但SSD的場(chǎng)景非常不一樣,SSD的場(chǎng)景里面不同的Flash完全可以獨(dú)立工作,這就帶來(lái)一個(gè)好處,可以把IO的影響徹底隔離。接下來(lái)會(huì)有具體的實(shí)例來(lái)看一下我們具體的操作。
Endurance Group保證NVM Set間磨損均衡
其中在NVMe Group ID的設(shè)置里面,除了剛才說(shuō)的Set,還有Endurance Group的概念(如上圖),這個(gè)可以讓SSD進(jìn)行磨損均衡的管理。如果只有一個(gè)NVM Set和Endurance Group ID關(guān)聯(lián),磨損均衡范圍不能跨越該Set,但主機(jī)端可以選擇跨Set進(jìn)行壽命管理。
本質(zhì)上我覺(jué)得Endurance Group帶來(lái)的好處是說(shuō)沒(méi)有規(guī)定你的Namespace只能屬于一個(gè)Set,實(shí)際上你的Namespace可以跨多個(gè)Set。為什么要跨多個(gè)Set?后面我會(huì)講到Set的使用由于它把Flash進(jìn)行了隔離,也會(huì)帶來(lái)了一定的帶寬。如果我們?cè)侔裇et聚合在一起,我們的性能其實(shí)可以根據(jù)Set的數(shù)量線增增長(zhǎng)。
相當(dāng)于我的用戶在面對(duì)一個(gè)有8個(gè)、16個(gè)Set的SSD時(shí)候,需要有多高的帶寬就選幾個(gè)Set,需要多好的響應(yīng)就把Namespace放在單獨(dú)的Set上,這些性能全部都是隨著你的Set數(shù)量進(jìn)行線性增長(zhǎng)。
驗(yàn)證NVM Set帶來(lái)的QoS提升
Memblaze對(duì)Set在具體的SSD應(yīng)用中的效果做了幾個(gè)驗(yàn)證試驗(yàn)。第一個(gè)試驗(yàn)是有和沒(méi)有NVM Set兩種狀態(tài)下SSD的性能表現(xiàn)。
我們這邊舉的例子是8通道的SSD,上側(cè)小黃塊是所有的Flash LUN。這些在使用過(guò)程中,你的數(shù)據(jù)會(huì)全部鋪在所有的LUN,就會(huì)導(dǎo)致我們前面說(shuō)的問(wèn)題,不同應(yīng)用的讀寫在操作同一個(gè)Flash。
NVMe的Set實(shí)現(xiàn)有兩種典型結(jié)構(gòu),一種是垂直結(jié)構(gòu),一種是水平結(jié)構(gòu)。垂直結(jié)構(gòu)的角度,F(xiàn)lash資源一半是屬于一個(gè)Set,另外一半是屬于另一個(gè)Set。
另外一種我們還可以看到水平的邏輯單元,每一個(gè)Set都是跨越了所有的T,這種IO并行程度會(huì)更加高一些,這邊的隔離效果感覺(jué)會(huì)更加好一些,是不是真的是這樣子,我們后面會(huì)有實(shí)測(cè)的結(jié)果向大家展示一下這兩種不同方式帶來(lái)的差別。
首先我們看一下最傳統(tǒng)、最簡(jiǎn)單的水平邏輯單元。在這個(gè)測(cè)試中,我們把一塊4T的SSD分成兩半,每一半占了一半的LUN,我們操作的時(shí)候其中一個(gè)Namespace是在上面做順序?qū)?,另外一個(gè)Namespace做隨機(jī)讀,這是一個(gè)非常典型的業(yè)務(wù)場(chǎng)景,有的業(yè)務(wù)以讀為主,有的業(yè)務(wù)以寫為主,把這兩個(gè)業(yè)務(wù)拆成兩個(gè)Namespace的時(shí)候,我們看看它的效果。
我們可以看到黃色這個(gè)是讀的Latency的,我們可以看到這個(gè)線抖的很厲害,這個(gè)效果雖然其實(shí)還算可以,但在200—250微秒之間,它是在不停抖動(dòng),因?yàn)槟愕腇lash一會(huì)兒在做讀、一會(huì)兒在做寫,不可避免Flash的讀會(huì)受到寫的影響。下面這條藍(lán)色是一條平線,是我們用了Set的功能之后讀的操作完全沒(méi)有受到任何寫的影響所達(dá)到的效果,100微秒。
我們可以看到這邊有2.25倍的提升,再?gòu)腝oS的角度看99.99%、99.999%、99.9999%的情況下有多大的影響?99.9999%下有21倍的差距,當(dāng)多個(gè)應(yīng)用讀寫混合在同一個(gè)硬盤上,你的IO延遲必然會(huì)遭到影響,延遲動(dòng)輒到3毫秒、5毫秒、10毫秒,雖然現(xiàn)在有一些Flash的技術(shù),讓這種影響最小化。但實(shí)際上在QoS看到99.9999%的情況下,這個(gè)影響還是非常可觀的。反過(guò)來(lái)我們?nèi)绻侔褍蓚€(gè)Flash、兩個(gè)Namespace、兩個(gè)Set拆開之后,延遲所受的影響可能就微乎其微了。
上面這兩副圖表明了我們的IOPS、QD和QoS之間的關(guān)系,同樣可以看到如果沒(méi)有NVM Set,我們的QoS大幅下降,QoS的延時(shí)水平都在大幅下降,并且我的IOPS是顯著翻倍式的提高。原因無(wú)它,就是因?yàn)閷W?,SSD的特定的資源池可以在專注做讀的操作,或者專注做寫的操作,這個(gè)時(shí)候你的效果是最好的。我們可以看到使用了NVM Set之后,被測(cè)設(shè)備4K隨機(jī)讀的IOPS提高了2倍,延遲也降低了2倍以上。
NVM Set效果驗(yàn)證二:傳統(tǒng)邏輯單元VS 垂直邏輯單元VS 水平數(shù)據(jù)邏輯單元
接下來(lái)我們?cè)倏纯戳硗庖唤M對(duì)比,這組對(duì)比時(shí)我們現(xiàn)在將加入垂直邏輯單元的對(duì)比。這里的測(cè)試設(shè)備的資源劃分如下圖:
我們?cè)谠O(shè)計(jì)的時(shí)候會(huì)想到垂直的單元由于它的Flash是有獨(dú)立接口的,我們想象這個(gè)效果可能會(huì)更好,但是這個(gè)測(cè)試過(guò)當(dāng)時(shí)測(cè)出來(lái)有點(diǎn)出乎我們的意料,我們來(lái)看一下結(jié)果。
這里紅線是Vertical Sets的結(jié)果,藍(lán)線是Horizontal Sets的結(jié)果,雖然垂直設(shè)置的時(shí)候它的Flash接口等等是獨(dú)立的,但是出來(lái)的效果怎么會(huì)比水平的情況還會(huì)要差一些?
后來(lái)我們發(fā)現(xiàn)讀和讀之間由于你的平鋪的關(guān)系,你在不同的接口上,你利用的Flash BUS數(shù)更多了,同時(shí)并發(fā)的數(shù)就更多了。你只用了8個(gè)接口和用了16個(gè)接口,本身你在同一個(gè)接口上的數(shù)量更多之后,本身你自己會(huì)對(duì)自己造成影響。
所以何以看到在Vertical Sets上的時(shí)候,讀的大壓力下去,它的QOS這邊比Horizontal Sets要更加小一些。如果你在非常小的讀壓力下,Vertical Sets由于它完全不受到影響,它的QOS還會(huì)要更好一些,這就是壓力大小的差別會(huì)造成一些細(xì)微的變化。從QOS角度來(lái)看,不管是Vertical Sets還是Horizontal Sets都對(duì)比原來(lái)的做法有了接近十幾、二十倍的提升。
上圖展示了整體的QOS數(shù)據(jù)。在下面的時(shí)候,比如說(shuō)在99.99%的時(shí)候,我們已經(jīng)看到傳統(tǒng)的模式下延時(shí)已經(jīng)上升的很厲害了,大是在使用NVMe Set的情況下,不管是紅線還是藍(lán)色都非常低。只有到99.9999%等情況下,才會(huì)看到紅線、藍(lán)線上升了一點(diǎn),但即使在這種情況下,跟傳統(tǒng)的混合情況下還是有差距。由于Link帶來(lái)的差距,同樣也會(huì)反映到IOPS上。不管是在哪個(gè)QD,在QD的測(cè)試下,我們依然可以發(fā)現(xiàn)不同隊(duì)列深度下性能都是線性增長(zhǎng)的,并且它會(huì)比我們的傳統(tǒng)模式要好得多。
寫帶寬對(duì)比
最后我們?cè)倏匆幌聦憥挼膶?duì)比,當(dāng)你把Flash切成一半的時(shí)候,你的寫帶寬到底會(huì)受多少影響?這個(gè)我們也拿出了實(shí)測(cè)的結(jié)果。這條黃線使用了最多的Flash,它的寫性能毫無(wú)疑問(wèn)到了2個(gè)G以上,這是比后面兩種都更高的。黃線的兩點(diǎn)幾個(gè)GB其實(shí)也是一個(gè)在混和寫和讀同時(shí)操作的情況下得到的寫帶寬,本身寫的帶寬受到了上面讀的IO影響,并不能有效利用到所有的Flash Learn的能力,我們?cè)赩和H的使用情況下,都各用了一半的Flash,導(dǎo)致它其實(shí)只有整體帶寬的一半效果。實(shí)際上你跟傳統(tǒng)對(duì)比的時(shí)候,它大概是在70%左右的情況,所以它使用了一半的Flash帶來(lái)了70%寫的效率,還是非常不錯(cuò)的一個(gè)投寫。
在這里我們還可以看到在垂直模式,其實(shí)比Horizontal Sets模式要略高一點(diǎn),這個(gè)有細(xì)微的一點(diǎn)點(diǎn)差別,這也是由于Vertical Sets的模式是不占帶寬的,讓傳輸能夠更加專注放在上面。所以就我看來(lái),不管是Vertical Sets還是Horizontal Sets,其實(shí)都是一個(gè)非常有效的隔離手法。具體要怎么使用?這個(gè)可能是見仁見智,看你的軟件怎么實(shí)現(xiàn)更加方便。
IOD的生態(tài)其實(shí)在NVMe協(xié)議中還是一個(gè)正在演進(jìn)的過(guò)程,我們可以看到Windows Driver很快會(huì)加入IOD的支持,Linux Driver也會(huì)加入IOD的支持,我們常用的管理工具NVMe的CLI也已經(jīng)支持IOD。最后1.3C和1.4都已經(jīng)把IOD擺上了日程,并且這是一個(gè)比較確定的要發(fā)布的東西。所以我們可以看到在整個(gè)生態(tài)系統(tǒng)中,IOD的支持會(huì)是一個(gè)快速現(xiàn)金、快速得到全面響應(yīng)的過(guò)程。
回到我們剛開始的話題,我最開始就說(shuō)了Open Channel的SSD也是為了控制QOS和延時(shí)來(lái)出生的。我們比較一下Open Channel的SSD跟NVMe的IOD有什么樣的優(yōu)缺點(diǎn)?其實(shí)效果毫無(wú)疑問(wèn)Open Channel的效果是更好的?
因?yàn)?strong>Open Channel的效果是把所有的Flash都交到了Host應(yīng)用軟件的手上,讓Host進(jìn)行有效的管理,這種管理會(huì)可以避免在垃圾回收和各種操作的時(shí)候?qū)η芭_(tái)IO的影響。
IOD的情況效果會(huì)略低,雖然我們剛剛看到的演示效果還是很不錯(cuò)的,但是我們不能不承認(rèn)我們當(dāng)時(shí)只是對(duì)單一Set做了單一操作,這種在應(yīng)用場(chǎng)景還是比較少的,這要看我們的Host能否真的隔離非常徹底,在每一個(gè)Namespace上要么只做讀、要么只做寫,那種情況下效果比較好。但如果Host的應(yīng)用還是會(huì)采取讀寫混合等一些奇奇怪怪的操作,SSD的操作不可避免還是會(huì)影響到前臺(tái)的QOS。
從另外一個(gè)角度看,Open Channel帶來(lái)的復(fù)雜度遠(yuǎn)比IOD帶來(lái)的要高。IOD非常簡(jiǎn)單,就是把一個(gè)SSD在邏輯上分了區(qū),分了區(qū)之后就跟你原來(lái)使用任何一個(gè)硬盤,分幾個(gè)驅(qū)動(dòng)器是一樣的效果。這個(gè)非常簡(jiǎn)單,只要你開始配置好了,后面就不用管了。
第三個(gè)就是標(biāo)準(zhǔn)化的程度,Open Channel的標(biāo)準(zhǔn)化現(xiàn)在已經(jīng)演進(jìn)到Open Channel2.0,但是在這個(gè)基礎(chǔ)上還是會(huì)有很多需求。對(duì)應(yīng)起來(lái)IOD是NVMe1.4的標(biāo)準(zhǔn)協(xié)議,我相信它會(huì)很快成為所有SSD的標(biāo)配功能,可以提供到用戶去使用。
所以我們最后覺(jué)得不同的類型客戶,應(yīng)該是根據(jù)自己的情況,根據(jù)自己的應(yīng)用可配置情況、可定制情況能夠去選擇最合適自己的產(chǎn)品。在這里,Memblaze的SSD我們會(huì)隨著NVMe的協(xié)議一起不停往前去演進(jìn),希望能夠提供給用戶層面更多不一樣的功能,提供給更多用戶更好的用戶體驗(yàn)。我今天的介紹就到這里,謝謝大家!