目錄
1 存儲媒體的變革
2 NVME SSD成為主流
2.1 NAND FLASH媒體發展
2.2 軟體層面看SSD——多隊列技術
2.3 深入了解SSD硬體
3 影響NVME SSD的性能因素
3.1 GC對性能的影響
3.2 IO PATTERN對性能的影響
3.2.1 順序寫入Pattern對SSD性能優化的奧秘
3.2.2 讀寫沖突Pattern對性能的影響
4 SSD寫性能分析模型
5 小結
NVMe SSD的性能時常捉摸不定,為此我們需要打開SSD的神秘盒子,從各個視角分析SSD性能影響因素,并思考從存儲軟體的角度如何最優化使用NVMe SSD,推進資料中心閃存化程序。本文從NVMe SSD的性能影響因素進行分析,并給出存儲系統設計方面的一些思考。
1 存儲媒體的變革
近幾年存儲行業發生了翻天覆地的變化,半導體存儲登上了曆史的舞台。和傳統磁盤存儲媒體相比,半導體存儲媒體具有天然的優勢。無論在可靠性、性能、功耗等方面都遠遠超越傳統磁盤。目前常用的半導體存儲媒體是NVMe SSD,采用PCIe接口方式與主機進行互動,大大提升了性能,釋放了存儲媒體本身的性能。通常NVMe SSD内部采用NAND Flash存儲媒體進行資料存儲,該媒體本身具有讀寫不對稱性,使用壽命等問題。為此在SSD内部通過FTL(Flash Translation Layer)解決NAND Flash存在的問題,為上層應用軟體呈現和普通磁盤相同的應用接口和使用方式。
如上圖所示,随着半導體存儲媒體的發展,計算機系統的IO性能得到了飛速發展。基于磁媒體進行資料存儲的磁盤和處理器CPU之間一直存在着棘手的剪刀差性能鴻溝。随着存儲媒體的演進與革新,這種性能剪刀差将不複存在。從整個系統的角度來看,IO性能瓶頸正從後端磁盤往處理器和網絡方向轉移。如下圖性能資料所示,在4KB通路粒度下,NVMe SSD和15K轉速磁盤相比,每秒随機讀IO處理能力提升了将近5000倍;每秒随機寫IO處理能力提升了1000多倍。随着非易失性存儲媒體的進一步發展,半導體存儲媒體的性能将進一步提升,并且會具有更好的IO QoS能力。
存儲媒體的革命一方面給存儲系統性能提升帶來了福音;另一方面對存儲系統的設計帶來了諸多挑戰。原有面向磁盤設計的存儲系統不再适用于新型存儲媒體,面向新型存儲媒體需要重新設計更加合理的存儲軟體堆棧,發揮存儲媒體的性能,并且可以規避新媒體帶來的新問題。面向新型存儲媒體重構存儲軟體棧、重構存儲系統是最近幾年存儲領域的熱門技術話題。
在面向NVMe SSD進行存儲系統設計時,首先需要對NVMe SSD本身的特性要非常熟悉,需要了解SSD性能的影響因素。在設計過程中需要針對SSD的特性通過軟體的方式進行優化。本文對SSD進行簡要介紹,并從性能影響因素角度出發,對NVMe SSD進行深入剖析,在此基礎上給出閃存存儲設計方面的一些思考。
**2 NVMe SSD成為主流
2.1 NAND Flash媒體發展**
目前NVMe SSD主流采用的存儲媒體是NAND Flash。最近幾年NAND Flash技術快速發展,主要發展的思路有兩條:第一,通過3D堆疊的方式增加NAND Flash的存儲密度;第二,通過增加單Cell比特數來提升NAND Flash的存儲密度。3D NAND Flash已經成為SSD标配,目前主流釋出的SSD都會采用3D NAND Flash技術工藝。從cell的角度來看,目前單個cell可以表示3bit,這就是通常所說的TLC NAND Flash。今年單個cell的bit存儲密度又提升了33%,可以表示4bit,向前演進至QLC NAND Flash。NAND Flash的不斷演進,推動了SSD存儲密度不斷提升。截止到今天,單個3.5寸SSD盤可以做到128TB的容量,遠遠超過了磁盤的容量。下圖是近幾年NAND Flash技術的發展、演進過程。
從上圖可以看出,NAND Flash在不斷演進的過程中,一些新的非易失性記憶體技術也開始發展。Intel已經推出了AEP記憶體存儲媒體,可以預計,未來将會是非易失性記憶體和閃存共存的半導體存儲時代。
2.2 軟體層面看SSD——多隊列技術
從軟體接口的角度來看,NVMe SSD和普通的磁盤沒有太多的差別,在Linux環境下都是标準塊裝置。由于NVMe SSD采用了最新的NVMe協定标準,是以從軟體堆棧的角度來看,NVMe SSD的軟體棧簡化了很多。在NVMe标準中,和傳統的SATA/SAS相比,一個重大的差别是引入了多隊列機制,如下圖所示。
何為多隊列技術?主機(X86 Server)與SSD進行資料互動的模型采用“生産者-消費者”模型,采用生産者-消費者隊列進行資料互動。在原有的AHCI規範中,隻定義了一個互動隊列,那麼主機與HDD之間的資料互動隻能通過一個隊列通信,多核處理器也隻能通過一個隊列與HDD進行資料互動。在磁盤存儲時代,由于磁盤是慢速裝置,是以一個隊列也就夠用了。多個處理器核通過一個共享隊列與磁盤進行資料互動,雖然處理器之間會存在資源競争,但是相比磁盤的性能,處理器之間競争所引入的開銷實在是微乎其微,可以忽略。在磁盤存儲時代,單隊列有其他的好處,一個隊列存在一個IO排程器,可以很好的保證送出請求的IO順序最優化。
和磁盤相比,半導體存儲媒體具有很高的性能,AHCI原有的規範不再适用,原有的假設也已經不複存在,在此背景下NVMe規範誕生了。NVMe規範替代了原有的AHCI規範,并且軟體層面的處理指令也進行了重新定義,不再采用SCSI/ATA指令規範集。在NVMe時代,外設和處理器之間的距離更近了,不再需要像SAS一樣的面向連接配接的存儲通信網絡。相比于以前的AHCI、SAS等協定規範,NVMe規範是一種非常簡化,面向新型存儲媒體的協定規範。該規範的推出,将存儲外設一下子拉到了處理器局部總線上,性能大為提升。并且主機和SSD處理器之間采用多隊列的設計,适應了多核的發展趨勢,每個處理器核與SSD之間可以采用獨立的硬體Queue Pair進行資料互動。
從軟體的角度來看,每個CPU Core都可以建立一對Queue Pair和SSD進行資料互動。Queue Pair由Submission Queue與Completion Queue構成,通過Submission queue發送資料;通過Completion queue接受完成事件。SSD硬體和主機驅動軟體控制queue的Head與Tail指針完成雙方的資料互動。
2.3 深入了解SSD硬體
和磁盤相比,NVMe SSD最大的變化在于存儲媒體發生了變化。目前NVMe SSD普遍采用3D NAND Flash作為存儲媒體。NAND Flash内部有多個存儲陣列單元構成,采用floating gate或者charge trap的方式存儲電荷,通過存儲電荷的多少來保持資料存儲狀态。由于電容效應的存在、磨損老化、操作電壓幹擾等問題的影響,NAND Flash天生會存在漏電問題(電荷洩漏),進而導緻存儲資料發生變化。是以,從本質上講,NAND Flash是一種不可靠媒體,非常容易出現Bit翻轉問題。SSD通過控制器和固件程式将這種不可靠的NAND Flash變成了可靠的資料存儲媒體。
為了在這種不可靠媒體上建構可靠存儲,SSD内部做了大量工作。在硬體層面,需要通過ECC單元解決經常出現的比特翻轉問題。每次資料存儲的時候,硬體單元需要為存儲的資料計算ECC校驗碼;在資料讀取的時候,硬體單元會根據校驗碼恢複被破壞的bit資料。ECC硬體單元內建在SSD控制器内部,代表了SSD控制器的能力。在MLC存儲時代,BCH編解碼技術可以解決問題,4KB資料中存在100bit翻轉時可以糾正錯誤;在TLC存儲時代,bit錯誤率大為提升,需要采用更高糾錯能力的LDPC編解碼技術,在4KB出現550bit翻轉時,LDPC硬解碼仍然可以恢複資料。下圖對比了LDPC硬解碼、BCH以及LDPC軟解碼之間的能力, 從對比結果可以看出,LDPC軟解碼具有更強的糾錯能力,通常使用在硬解碼失效的情況下。LDPC軟解碼的不足之處在于增加了IO的延遲。
在軟體層面,SSD内部設計了FTL(Flash Translation Layer),該軟體層的設計思想和log-structured file system設計思想類似。采用log追加寫的方式記錄資料,采用LBA至PBA的位址映射表記錄資料組織方式。Log-structured系統最大的一個問題就是垃圾回收(GC)。是以,雖然NAND Flash本身具有很高的IO性能,但受限于GC的影響,SSD層面的性能會大受影響,并且存在十分嚴重的IO QoS問題,這也是目前标準NVMe SSD一個很重要的問題。SSD内部通過FTL解決了NAND Flash不能inplace write的問題;采用wear leveling算法解決了NAND Flash磨損均衡問題;通過data retention算法解決了NAND Flash長時間存放漏電問題;通過data migration方式解決read diatribe問題。FTL是NAND Flash得以大規模使用的核心技術,是SSD的重要組成部分。
NAND Flash内部本身具有很多并發單元,如上圖所示,一個NAND Flash晶片由多個Target構成,每個Target包含多個Die。每個Die是一個獨立的存儲單元,一個Die由多個Plane構成,多個Plane之間共享一套操作總線,多個Plane可以組成一個單元并發操作,建構Multi-plane。一個Plane由若幹個Block構成,每個Block是一個擦除單元,該單元的大小也決定了SSD軟體層面的GC回收粒度。每個Block由多個page頁構成,每個Page是最小寫入(程式設計)單元,通常大小為16KB。SSD内部軟體(固件)需要充分利用這些并發單元,建構高性能的存儲盤。
一塊普通NVMe SSD的實體硬體結構簡單,由大量的NAND Flash構成,這些NAND Flash通過SOC(SSD控制器)進行控制,FTL軟體運作在SOC内部,并通過多隊列的PCIe總線與主機進行對接。為了提升性能,企業級SSD需要闆載DRAM,DRAM資源一方面可以用來緩存資料,提升寫性能;另一方面用來緩存FTL映射表。企業級SSD為了提升性能,通常采用Flat mapping的方式,需要占據較多的記憶體(0.1%)。記憶體容量的問題也限制了大容量NVMe SSD的發展,為了解決記憶體問題,目前一種可行的方法是增大sector size。标準NVMe SSD的sector size為4KB,為了進一步增大NVMe SSD的容量,有些廠商已經開始采用16KB的sector size。16KB Sector size的普及應用,會加速大容量NVMe SSD的推廣。
3 影響NVMe SSD的性能因素
NVMe SSD 廠商Spec給出的性能非常完美,前面也給出了NVMe SSD和磁盤之間的性能對比,NVMe SSD的性能的确比磁盤高很多。但在實際應用過程中,NVMe SSD的性能可能沒有想象中的那麼好,并且看上去不是特别的穩定,找不到完美的規律。和磁盤媒體相比,SSD的性能和很多因素相關,分析SSD的性能影響因素,首先需要大體了解SSD構成的主要部分。如下圖所示,其主要包括主機CPU、PCIe互連帶寬、SSD控制器及FTL軟體、後端NAND Flash帶寬、NAND Flash媒體。影響SSD性能的主要因素可以分成硬體、軟體和客觀環境三大部分,具體分析如下。
1, 硬體因素
a) NAND Flash本身。不同類型的NAND Flash本身具有不同的性能,例如SLC的性能高于MLC,MLC的性能優于TLC。選擇不同的工藝、不同類别的NAND Flash,都會具有不同的性能。
b) 後端通道數(CE數量)及總線頻率。後端通道數決定了并發NAND Flash的數量,決定了并發能力。不同的SSD控制器支援不同數量的通道數,也決定了SSD的後端吞吐帶寬能力。NAND Flash Channel的總線頻率也決定了通路Flash的性能。
c) SSD控制器的處理能力。SSD控制器中會運作複雜的FTL(Flash Translation Layer)處理邏輯,将邏輯塊讀寫映射轉換成NAND Flash 讀寫請求。在大資料塊讀寫時,對處理器能力要求不是很高;在小資料塊讀寫時,對處理器能力要求極高,處理器能力很容易成為整個IO系統的性能瓶頸點。
d) SSD控制器架構。通常SSD控制器采用SMP或者MPP兩種架構,早期的控制器通常采用MPP架構,多個小處理器通過内部高速總線進行互連,通過硬體消息隊列進行通信。記憶體資源作為獨立的外設供所有的處理器進行共享。這種架構和基于消息通信的分布式系統類似。MPP架構的很大優勢在于性能,但是程式設計複雜度較高;SMP架構的性能可擴充性取決于軟體,程式設計簡單,和在x86平台上程式設計相似。不同的控制器架構會影響到SSD的總體性能,在SSD設計時,會根據設計目标,選擇不同類型的SSD控制器。
e) 記憶體支援容量。為了追求高性能,SSD内部的映射資源表會常駐記憶體,映射表的記憶體占用大小是盤容量的0.1%,當記憶體容量不夠大時,會出現映射表換入換出的問題,影響到性能。
f) PCIe的吞吐帶寬能力。PCIe前端帶寬展現了SSD的前端吞吐能力,目前NVMe SSD采用x4 lane的接入方式,上限帶寬為3GB/s,當後端NAND Flash帶寬和處理器能力足夠時,前端PCIe往往會成為性能瓶頸點。NAND Flash具有很高的讀性能,目前來看,SSD的讀性能在很大程度上受限于PCIe總線,是以需要快速推進PCIe4.0标準。
g) 溫度對性能造成影響。在NAND Flash全速運作的情況下,會産生較大的散熱功耗,當溫度高到一定程度時,系統将會處于不正常的工作狀态,為此,SSD内部做了控溫系統,通過溫度檢測系統來調整SSD性能,進而保證系統溫度維持在門檻值之内。調整溫度會犧牲性能,本質上就是通過降低SSD性能來降溫。是以,當環境溫度過高時,會影響到SSD的性能,觸發SSD内部的溫度控制系統,調節SSD的性能。
h) 使用壽命對性能造成影響。NAND Flash在不斷擦除使用時,Flash的bit error會不斷上升,錯誤率的提升會影響到SSD的IO性能。
2, 軟體因素
a) 資料布局方式。資料布局方法需要充分考慮NAND Flash中的并發單元,如何将IO操作轉換成NAND Flash的并發操作,這是資料布局需要考慮的問題。例如,采用資料交錯的方式在多通道page上進行資料布局,通過這種方式可以優化順序帶寬。
b) 垃圾回收/wear leveling排程方法。資料回收、wear leveling、data retention等操作會産生大量的NAND Flash後端流量,後端流量直接反應了SSD的寫放大系數,也直接展現在後端帶寬的占用。垃圾回收等産生的流量也可以稱之為背景流量,背景流量會直接影響到前端使用者性能。是以需要對背景流量和使用者流量之間進行合理排程,使得使用者IO性能達到最佳。
c) OP預留。為了解決壞塊、垃圾回收等問題,在SSD内部預留了一部分空閑資源,這些資源被稱之為OP(Overprovisioning)。OP越大,GC過程中平均搬移的資料會越少,背景流量會越小,是以,寫放大降低,使用者IO性能提升。反之,OP越小,性能會越低,寫放大會越大。在SSD容量較小的時代,為了提升SSD的使用壽命,往往OP都設定的比較大。
d) Bit error處理影響性能。在SSD内部采用多種機制來處理NAND Flash所産生的Bit error。ECC糾錯、read retry、soft LDPC以及RAIN都是用來糾正bit翻轉導緻的錯誤。當Bit錯誤率增加時,軟體處理的開銷越大,在bit控制在一定範圍之内,完全可以通過硬體進行糾正。一旦軟體參與到bit糾正的時候,會引入較大的性能開銷。
e) FTL算法。FTL算法會影響到SSD性能,對于不同用途的SSD,FTL的設計與實作是完全不同的,企業級SSD為了追求高性能,通常采用Flat mapping的方式,采用大記憶體緩存映射表;消費級SSD為了追求低成本,通常采用中繼資料換入換出的方式,并且采用pSLC+TLC的組合方式進行分層存儲,也可以采用主機端記憶體緩存中繼資料資訊,但是這些方式都會影響到性能。
f) IO排程算法。NAND Flash具有嚴重的性能不對稱性,Flash Erase和Program具有ms級延遲,Flash read的延遲在us級。是以,如何排程Erase、Program以及read是SSD後端設計需要考慮的問題。另外,前端IO以及背景IO之間的排程也是需要權衡考慮,通過IO排程可以達到最佳性能表現。在IO排程過程中,還需要利用NAND Flash的特性,例如Program Suspension,通過這些特性的利用,最優化SSD前端IO性能。
g) 驅動軟體。驅動軟體運作在主機端,通常分為核心态和使用者态兩大類,核心态驅動會消耗較多的CPU資源,存在頻繁上下文切換、中斷處理,是以性能較低;使用者态驅動通常采用Polling IO處理模式,去除了上下文切換,可以充分提升CPU效率,提升整體IO性能。
h) IO Pattern對性能産生影響。IO Pattern影響了SSD内部的GC資料布局,間接影響了GC過程中的資料搬移量,決定了後端流量。當IO Pattern為全順序時,這種Pattern對SSD内部GC是最為友好的,寫放大接近于1,是以具有最好的性能;當IO Pattern為小塊随機時,會産生較多的GC搬移資料量,是以性能大為下降。在實際應用中,需要通過本地檔案系統最優化IO Pattern,擷取最佳性能。
3, 客觀因素
a) 使用時間越長會導緻SSD性能變差。使用時間變長之後,SSD内部NAND Flash的磨損會加重,NAND Flash磨損變大之後會導緻bit錯誤率提升。在SSD内部存在一套完整的bit錯誤恢複機制,由硬體和軟體兩大部分構成。當bit錯誤率達到一定程度之後,硬體機制将會失效。硬體機制失效之後,需要通過軟體(Firmware)的方式恢複翻轉的bit,軟體恢複将會帶來較大的延遲開銷,是以會影響到SSD對外表現的性能。在有些情況下,如果一塊SSD在掉電情況下放置一段時間之後,也可能會導緻性能變差,原因在于SSD内部NAND Flash中存儲電荷的漏電,放置一段時間之後導緻bit錯誤率增加,進而影響性能。SSD的性能和時間相關,本質上還是與NAND Flash的比特錯誤率相關。
b) 環境溫度也會對性能造成影響。為了控制SSD溫度不能超過上限值,在SSD内部設計有一套溫度負回報機制,該機制通過檢測的溫度對NAND Flash後端帶寬進行控制,達到降低溫度的效果。如果一旦溫度負回報機制開始工作,那麼NAND Flash後端帶寬将會受到限制,進而影響前端應用IO的性能。
下面從軟體的角度出發,重點闡述GC以及IO Pattern對SSD性能的影響。
3.1 GC對性能的影響
SSD内部有一個非常厚重的軟體層,該軟體層用來解決NAND Flash的問題,采用log-structured的方式記錄資料。Log-structured方式引入了GC的問題,對于前端業務來講,GC流量就是背景噪聲。GC流量不是時時刻刻存在的,是以,SSD對外展現性能大幅度波動。當SSD為空盤時,性能會非常好,為最佳性能;當SSD被用過一段時間之後,性能會大幅降低。其中GC起到了很重要的作用。企業級SSD在釋出Spec的時候,都會釋出SSD盤的穩态性能。在性能測試的時候,需要對盤進行老化預處理。通常預處理的方法是順序寫滿盤,然後再随機兩遍寫盤,預處理完成之後,再對盤進行随機讀寫測試,得到Spec中定義的值。穩态值基本可以認為是盤的下限性能。
上圖所示是多個廠商的盤在空盤和穩态情況下的性能對比,由此可見穩态情況和空盤情況下的性能差距很大。在穩态情況下,SSD内部的GC會全速運作,會占用較多的NAND Flash後端帶寬。背景流量和前端資料流的比例也就展現了SSD盤的寫放大系數,寫放大系數越大,背景流量占用帶寬越多,SSD對外展現的前端性能也就越差。寫放大系數很多因素相關,例如OP、應用IO Pattern等。如果應用IO Pattern比較好,那麼可以降低寫放大系數,背景噪聲流就會減少,前端業務的性能會提升。例如,在SSD完全順序寫入的情況下,寫放大系數可以接近于1,此時GC産生的資料流很少,背景流量基本沒有,後端帶寬基本被業務資料流占用,是以對外展現的性能會很好。
GC是影響性能的重要因素,除了影響性能之外,GC會增大寫放大,對SSD的使用壽命産生影響。從軟體層面的角度考慮,可以通過優化應用IO Pattern的方式優化SSD内部GC,進而進一步提升SSD的性能,優化使用壽命。對于下一代更為廉價的QLC SSD媒體,就需要采用這種優化思路,否則無法很好的滿足實際業務的應用需求。
3.2 IO Pattern對性能的影響
IO Pattern會對SSD的性能産生嚴重影響,主要表現在如下幾個方面:
1, 不同的IO Pattern會産生不同的寫放大系數,不同的寫放大系數占用後端NAND Flash帶寬不同。目前端應用對SSD采用完全順序的方式進行寫入時,此時是最佳的IO Pattern,對于SSD而言寫放大系數接近1,SSD内部的背景流量基本可以忽略,前端性能達到最佳。在實際應用中,很難采用這種完全順序的資料寫模型,但可以通過優化逼近順序寫入。
2, 不同請求大小的IO之間會産生幹擾;讀寫請求之間會産生幹擾。小請求會受到大請求的幹擾,進而導緻小請求的延遲增加,這個比較容易了解,在HDD上同樣會存在這種情況。由于NAND Flash媒體存在嚴重的讀寫不對稱性,是以讀寫請求之間也會互相幹擾,尤其是寫請求對讀請求産生嚴重的性能影響。
3.2.1 順序寫入Pattern對SSD性能優化的奧秘
在針對閃存系統的設計中,需要考慮IO Pattern對性能産生的影響,通過軟體的優化來最優化SSD的使用。在實際應用中完全順序寫入的IO Pattern基本上是不存在的,除非用作順序寫入的日志裝置。對于順序寫入優化性能這個結論,需要從SSD内部實作來深入了解,知道根源之後,可以采用合理的方式來逼近順序寫入的模式,進而最優化SSD的性能。
SSD内部采用log-structured的資料記錄模式,并發寫入的IO資料按照時間順序彙聚成大資料塊,合并形成的大資料塊以Page stripe的方式寫入NAND Flash。多個Page stripe會被寫入同一個GC單元(Chunk or Superblock),當一個GC單元被寫完成之後,該GC單元進入sealed模式(隻讀),配置設定新的GC單元寫新的資料。在這種模式下,如果多個業務的資料流并發随機的往SSD中寫入資料,那麼多個應用的資料就會交錯在一起被存儲到同一個GC單元中。如下圖所示,不同應用的資料生命周期不同,當需要回收一個GC單元的時候,會存在大量資料的遷移,這些遷移的資料就會形成寫放大,影響性能和使用壽命。
不同應用的資料交錯存儲在同一個GC單元,本質上就是不同冷熱程度的資料交錯存儲的問題。從GC的角度來講,相同冷熱程度的資料存儲在同一個GC單元上是最佳的,為此三星推出了Multi-stream SSD,該SSD就允許不同應用的資料存儲到不同的Stream單元(GC單元),進而提升GC效率,降低寫放大。Multi-stream是一種顯式的設計方式,需要更改SSD接口以及應用程式。從IO Pattern的角度考慮,可以通過順序大塊的方式也可以逼近類似的效果。假設操作SSD隻存在一個線程,不同的應用都采用大資料塊的方式寫入資料,那麼在一個時間片段内隻存在一個應用的資料往SSD中寫入資料,那麼在一個GC單元記憶體儲的資料會變得有序和規則。如下圖所示,采用上述方法之後,一個GC單元記憶體儲的資料将會變得冷熱均勻。在GC過程中會大大減少資料的搬移,進而減少背景流量。
在實際應用中,上述IO Pattern很難産生,主要是應用很難産生非常大粒度的請求。為此在存儲系統設計過程中,可以引入Optane高性能存儲媒體作為SSD的寫緩存。前端不同業務的寫請求首先寫到Optane持久化媒體中,在Optane持久化媒體中聚合形成大資料塊。一旦聚合形成大資料塊之後,再寫入SSD,通過這種方式可以最大程度的逼近SSD順序寫入過程,提升SSD的性能和使用壽命。
**
3.2.2 讀寫沖突Pattern對性能的影響**
如下圖所示,NAND Flash媒體具有很強的讀寫不對稱性。Block Erase和Page Program的延遲會遠遠高于Page Read所耗費的時間。那麼在這種情況下,如果read請求在同一個Flash Channel上和Erase、Program操作沖突,那麼read操作将會被Erase/program操作影響。這是在讀寫混合情況下,讀性能會受到影響的重要因素。
在實際應用過程中,經常會發現應用的測試結果和SSD Spec對不上,會比Spec給出的值要來的低。Spec給出的值通常為純讀或者純寫情況下的性能名額,在讀寫混合的場景下,性能表現和Spec給出的值就會存在非常大的出入。
對于不同的SSD,通過測試可以發現在讀寫混合情況下的性能表現差距會比較大。在SSD處于穩态條件下,應用随機讀的情況下,如果引入一個壓力不是很大的順序寫,那麼會發現不同SSD的抗幹擾能力是不同的。有些SSD在寫幹擾的情況下,讀性能會急劇下降,延遲快速上升,QoS性能得不到保證。下圖是兩個SSD在相同情況下的測試結果,從結果來看,有些SSD的抗寫幹擾能力比較強,讀性能不會急劇下降。
為什麼有些SSD會具備比較強的抗寫幹擾能力呢?其中的奧秘就在于SSD内部的IO排程器。IO排程器會對write、read 和Erase請求進行排程處理,該排程器算法的不同就會表現出不同的抗幹擾能力。目前很多NAND Flash可以支援Program/Erase Suspension的功能,在IO排程處理的過程中,為了提升讀性能,降低讀請求延遲,可以采用Suspension指令對Program/Erase指令暫停,對read請求優先排程處理。
讀寫沖突是SSD内部影響IO QoS的重要因素。在SSD内部通過IO排程器的優化可以提升SSD性能的QoS能力,但是還是無法與存儲軟體結合來協同優化QoS。為了達到最佳的SSD性能QoS,需要關注Openchannel技術。Openchannel其實隻是一種軟硬體層次劃分的方法,通常來講,SSD内部的邏輯可以劃分為面向NAND資源的實體資源管理層以及面向資料布局的資源映射層。實體資源管理由于和NAND Flash密切相關,是以可以放到SSD内部。傳統的NVMe SSD需要對外暴露标準的塊裝置接口,是以需要在SSD内部實作資源映射層。從端至端的角度來看,資源映射層可以與存儲軟體層結合起來,為此将資源映射層從SSD内部剝離出來,內建至存儲軟體層。一旦資源映射層從SSD内部剝離之後,需要定義一個新的SSD接口,其中的一種接口方式就是Openchannel。
盤古分布式存儲針對SSD QoS問題進行了大量研究,提出了Object SSD的概念,Object SSD也是一種新的SSD接口方式,其采用對象方式對SSD進行讀寫删操作,每個對象采用Append write操作方式。這種接口方式可以很好的與分布式存儲無縫結合。采用Object SSD之後,SSD内部的大量工作被簡化,IO的排程會更加靈活,存儲軟體與SSD協同配合,達到IO性能的最優化,以及QoS的最大化。
4 SSD寫性能分析模型
SSD内部的資料流分成兩大類,一類為前端使用者資料流;另一類為内部背景資料流。前端使用者資料流和背景資料流會彙聚成NAND Flash後端流量。當背景資料流不存在時,NAND Flash帶寬會被使用者資料流全部占據,此時SSD對外表現的性能達到最佳。當SSD具有較大寫放大時,會産生很大的背景資料流,背景流會搶占NAND Flash帶寬,導緻前端使用者IO性能降低。為了穩定前端IO性能,在SSD内部的排程器會均衡前端和背景流量,保證前端性能的一緻性。背景流量的占比反應了SSD的寫放大系數,是以,站在NAND Flash帶寬占用的角度可以分析SSD在穩态情況下的性能。
在此,假設寫放大系數為WA,順序寫情況下的總帶寬數為B,使用者寫入流量(随機寫入流量)為U。那麼,由于GC寫放大造成的背景流量為:(WA - 1)* U
寫放大流量為一讀一寫,都會占用帶寬,是以,總帶寬可以描述為:
2 (WA - 1) U + U = B
是以,可以得到:
U = B / (2(WA - 1) + 1) = B / (2 WA - 1)
上述公式表述了前端使用者流量和NAND Flash總帶寬、寫放大系數之間的關系。
根據Spec,Intel P4500的順序寫帶寬為1.9GB/s,按照上述公式,在随機通路模式下的帶寬為: 1900 / (2 * 4 - 1) = 270MB/s,IOPS為67K,根據該公式推導的結果和Spec給出的結果相同。
下圖是Intel P4500和Samsung PM963随機寫延遲和推導公式之間的對比。結果非常吻合。
由此可以推出,随機寫性能由SSD内部後端帶寬以及寫放大系數來決定。是以,從存儲軟體的角度出發,我們可以通過優化IO Pattern的方式減小寫放大系數,進而可以提升SSD的随機寫性能。
5 小結
閃存存儲技術正在飛速發展,閃存媒體、SSD控制器、存儲系統軟體、存儲硬體平台都在圍繞閃存日新月異的發展。閃存給資料存儲帶來的價值顯而易見,資料中心閃存化是重要發展趨勢。NVMe SSD性能受到很多因素的影響,在軟體層面可以通過IO Pattern優化SSD的性能,使得整體存儲系統的性能達到最佳。
點選了解“阿裡雲新品釋出會頻道”:
https://promotion.aliyun.com/ntms/act/cloud/product.html【阿裡雲總監系列課】重磅上線!聚焦人工智能、彈性計算、資料庫等熱門領域,首次集齊12位阿裡雲技術高管,耗時半年精心打磨,從理論到實踐傾囊相授,從零開始繪制技術大牛成長路徑,限時直播課程免費報名中!歡迎戳“
https://yq.aliyun.com/promotion/689”免費報名學習。