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