NVMe SSD的性能時常捉摸不定,為此我們需要打開SSD的神秘盒子,從各個視角分析SSD性能影響因素,并思考從存儲軟件的角度如何最優化使用NVMe SSD,推進數據中心閃存化進程。本文從NVMe SSD的性能影響因素進行分析,并給出存儲系統設計方面的一些思考。
目錄
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的性能,使得整體存儲系統的性能達到最佳。
作者:云棲社區 云攻略小攻
-
SSD
+關注
關注
21文章
2953瀏覽量
119174 -
nvme
+關注
關注
0文章
243瀏覽量
23130
發布評論請先 登錄
Xilinx FPGA NVMe主機控制器IP,高性能版本介紹應用
Xilinx FPGA高性能NVMe SSD主機控制器,NVMe Host Controller IP
高性能NVMe主機控制器,Xilinx FPGA NVMe Host Accelerator IP
NVMe協議研究掃盲
NVMe P4600的速度部分低于SATA SSD?
在Xilinx ZCU102評估套件上啟用NVMe SSD接口
西部數據推出新款高性能NVMe SSD
重新定義NVMe SSD外形

評論