阿里雲儲道深度解析儲存系統設計——NVMe SSD 效能影響因素一探究竟
NVMe SSD 的效能時常捉摸不定,為此我們需要開啟 SSD 的神祕盒子,從各個視角分析 SSD 效能影響因素,並思考從儲存軟體的角度如何最優化使用 NVMe SSD,推進資料中心快閃記憶體化程序。本文從 NVMe SSD 的效能影響因素進行分析,並給出儲存系統設計方面的一些思考。
儲存介質的變革
近幾年儲存行業發生了翻天覆地的變化,半導體儲存登上了歷史的舞臺。和傳統磁碟儲存介質相比,半導體儲存介質具有天然的優勢。無論在可靠性、效能、功耗等方面都遠遠超越傳統磁碟。目前常用的半導體儲存介質是 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 進行深入剖析,在此基礎上給出快閃記憶體儲存設計方面的一些思考。
NVMe SSD 成為主流
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 記憶體儲存介質,可以預計,未來將會是非易失性記憶體和快閃記憶體共存的半導體儲存時代。
軟體層面看 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 指標完成雙方的資料互動。
深入理解 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 的推廣。
影響 NVMe SSD 的效能因素
NVMe SSD 廠商 Spec 給出的效能非常完美,前面也給出了 NVMe SSD 和磁碟之間的效能對比,NVMe SSD 的效能的確比磁碟高很多。但在實際應用過程中,NVMe SSD 的效能可能沒有想象中的那麼好,並且看上去不是特別的穩定,找不到完美的規律。和磁碟介質相比,SSD 的效能和很多因素相關,分析 SSD 的效能影響因素,首先需要大體瞭解 SSD 構成的主要部分。如下圖所示,其主要包括主機 CPU、PCIe 互連頻寬、SSD 控制器及 FTL 軟體、後端 NAND Flash 頻寬、NAND Flash 介質。影響 SSD 效能的主要因素可以分成硬體、軟體和客觀環境三大部分,具體分析如下。
-
硬體因素
- NAND Flash 本身。不同型別的 NAND Flash 本身具有不同的效能,例如 SLC 的效能高於 MLC,MLC 的效能優於 TLC。選擇不同的工藝、不同類別的 NAND Flash,都會具有不同的效能。
- 後端通道數(CE 數量)及匯流排頻率。後端通道數決定了併發 NAND Flash 的數量,決定了併發能力。不同的 SSD 控制器支援不同數量的通道數,也決定了 SSD 的後端吞吐頻寬能力。NAND Flash Channel 的匯流排頻率也決定了訪問 Flash 的效能。
- SSD 控制器的處理能力。SSD 控制器中會運行復雜的 FTL(Flash Translation Layer)處理邏輯,將邏輯塊讀寫對映轉換成 NAND Flash 讀寫請求。在大資料塊讀寫時,對處理器能力要求不是很高;在小資料塊讀寫時,對處理器能力要求極高,處理器能力很容易成為整個 IO 系統的效能瓶頸點。
- SSD 控制器架構。通常 SSD 控制器採用 SMP 或者 MPP 兩種架構,早期的控制器通常採用 MPP 架構,多個小處理器通過內部高速匯流排進行互連,通過硬體訊息佇列進行通訊。記憶體資源作為獨立的外設供所有的處理器進行共享。這種架構和基於訊息通訊的分散式系統類似。MPP 架構的很大優勢在於效能,但是程式設計複雜度較高;SMP 架構的效能可擴充套件性取決於軟體,程式設計簡單,和在 x86 平臺上程式設計相似。不同的控制器架構會影響到 SSD 的總體效能,在 SSD 設計時,會根據設計目標,選擇不同型別的 SSD 控制器。
- 記憶體支援容量。為了追求高效能,SSD 內部的對映資源表會常駐記憶體,對映表的記憶體佔用大小是盤容量的 0.1%,當記憶體容量不夠大時,會出現對映表換入換出的問題,影響到效能。
- PCIe 的吞吐頻寬能力。PCIe 前端頻寬體現了 SSD 的前端吞吐能力,目前 NVMe SSD 採用 x4 lane 的接入方式,上限頻寬為 3GB/s,當後端 NAND Flash 頻寬和處理器能力足夠時,前端 PCIe 往往會成為效能瓶頸點。NAND Flash 具有很高的讀效能,目前來看,SSD 的讀效能在很大程度上受限於 PCIe 匯流排,因此需要快速推進 PCIe4.0 標準。
- 溫度對效能造成影響。在 NAND Flash 全速執行的情況下,會產生較大的散熱功耗,當溫度高到一定程度時,系統將會處於不正常的工作狀態,為此,SSD 內部做了控溫系統,通過溫度檢測系統來調整 SSD 效能,從而保證系統溫度維持在閾值之內。調整溫度會犧牲效能,本質上就是通過降低 SSD 效能來降溫。因此,當環境溫度過高時,會影響到 SSD 的效能,觸發 SSD 內部的溫度控制系統,調節 SSD 的效能。
- 使用壽命對效能造成影響。NAND Flash 在不斷擦除使用時,Flash 的 bit error 會不斷上升,錯誤率的提升會影響到 SSD 的 IO 效能。
-
軟體因素
- 資料佈局方式。資料佈局方法需要充分考慮 NAND Flash 中的併發單元,如何將 IO 操作轉換成 NAND Flash 的併發操作,這是資料佈局需要考慮的問題。例如,採用資料交錯的方式在多通道 page 上進行資料佈局,通過這種方式可以優化順序頻寬。
- 垃圾回收 /wear leveling 排程方法。資料回收、wear leveling、data retention 等操作會產生大量的 NAND Flash 後端流量,後端流量直接反應了 SSD 的寫放大係數,也直接體現在後端頻寬的佔用。垃圾回收等產生的流量也可以稱之為背景流量,背景流量會直接影響到前端使用者效能。因此需要對背景流量和使用者流量之間進行合理排程,使得使用者 IO 效能達到最佳。
- OP 預留。為了解決壞塊、垃圾回收等問題,在 SSD 內部預留了一部分空閒資源,這些資源被稱之為 OP(Overprovisioning)。OP 越大,GC 過程中平均搬移的資料會越少,背景流量會越小,因此,寫放大降低,使用者 IO 效能提升。反之,OP 越小,效能會越低,寫放大會越大。在 SSD 容量較小的時代,為了提升 SSD 的使用壽命,往往 OP 都設定的比較大。
- Bit error 處理影響效能。在 SSD 內部採用多種機制來處理 NAND Flash 所產生的 Bit error。ECC 糾錯、read retry、soft LDPC 以及 RAIN 都是用來糾正 bit 翻轉導致的錯誤。當 Bit 錯誤率增加時,軟體處理的開銷越大,在 bit 控制在一定範圍之內,完全可以通過硬體進行糾正。一旦軟體參與到 bit 糾正的時候,會引入較大的效能開銷。
- FTL 演算法。FTL 演算法會影響到 SSD 效能,對於不同用途的 SSD,FTL 的設計與實現是完全不同的,企業級 SSD 為了追求高效能,通常採用 Flat mapping 的方式,採用大記憶體快取對映表;消費級 SSD 為了追求低成本,通常採用元資料換入換出的方式,並且採用 pSLC+TLC 的組合方式進行分層儲存,也可以採用主機端記憶體快取元資料資訊,但是這些方式都會影響到效能。
- IO 排程演算法。NAND Flash 具有嚴重的效能不對稱性,Flash Erase 和 Program 具有 ms 級延遲,Flash read 的延遲在 us 級。因此,如何排程 Erase、Program 以及 read 是 SSD 後端設計需要考慮的問題。另外,前端 IO 以及背景 IO 之間的排程也是需要權衡考慮,通過 IO 排程可以達到最佳效能表現。在 IO 排程過程中,還需要利用 NAND Flash 的特性,例如 Program Suspension,通過這些特性的利用,最優化 SSD 前端 IO 效能。
- 驅動軟體。驅動軟體執行在主機端,通常分為核心態和使用者態兩大類,核心態驅動會消耗較多的 CPU 資源,存在頻繁上下文切換、中斷處理,因此效能較低;使用者態驅動通常採用 Polling IO 處理模式,去除了上下文切換,可以充分提升 CPU 效率,提升整體 IO 效能。
- IO Pattern 對效能產生影響。IO Pattern 影響了 SSD 內部的 GC 資料佈局,間接影響了 GC 過程中的資料搬移量,決定了後端流量。當 IO Pattern 為全順序時,這種 Pattern 對 SSD 內部 GC 是最為友好的,寫放大接近於 1,因此具有最好的效能;當 IO Pattern 為小塊隨機時,會產生較多的 GC 搬移資料量,因此效能大為下降。在實際應用中,需要通過本地檔案系統最優化 IO Pattern,獲取最佳效能。
-
客觀因素
- 使用時間越長會導致 SSD 效能變差。使用時間變長之後,SSD 內部 NAND Flash 的磨損會加重,NAND Flash 磨損變大之後會導致 bit 錯誤率提升。在 SSD 內部存在一套完整的 bit 錯誤恢復機制,由硬體和軟體兩大部分構成。當 bit 錯誤率達到一定程度之後,硬體機制將會失效。硬體機制失效之後,需要通過軟體(Firmware)的方式恢復翻轉的 bit,軟體恢復將會帶來較大的延遲開銷,因此會影響到 SSD 對外表現的效能。在有些情況下,如果一塊 SSD 在掉電情況下放置一段時間之後,也可能會導致效能變差,原因在於 SSD 內部 NAND Flash 中儲存電荷的漏電,放置一段時間之後導致 bit 錯誤率增加,從而影響效能。SSD 的效能和時間相關,本質上還是與 NAND Flash 的位元錯誤率相關。
- 環境溫度也會對效能造成影響。為了控制 SSD 溫度不能超過上限值,在 SSD 內部設計有一套溫度負反饋機制,該機制通過檢測的溫度對 NAND Flash 後端頻寬進行控制,達到降低溫度的效果。如果一旦溫度負反饋機制開始工作,那麼 NAND Flash 後端頻寬將會受到限制,從而影響前端應用 IO 的效能。
下面從軟體的角度出發,重點闡述 GC 以及 IO Pattern 對 SSD 效能的影響。
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 介質,就需要採用這種優化思路,否則無法很好的滿足實際業務的應用需求。
IO Pattern 對效能的影響
IO Pattern 會對 SSD 的效能產生嚴重影響,主要表現在如下幾個方面:
- 不同的 IO Pattern 會產生不同的寫放大係數,不同的寫放大係數佔用後端 NAND Flash 頻寬不同。當前端應用對 SSD 採用完全順序的方式進行寫入時,此時是最佳的 IO Pattern,對於 SSD 而言寫放大係數接近 1,SSD 內部的背景流量基本可以忽略,前端效能達到最佳。在實際應用中,很難採用這種完全順序的資料寫模型,但可以通過優化逼近順序寫入。
- 1, 不同請求大小的 IO 之間會產生干擾;讀寫請求之間會產生干擾。小請求會受到大請求的干擾,從而導致小請求的延遲增加,這個比較容易理解,在 HDD 上同樣會存在這種情況。由於 NAND Flash 介質存在嚴重的讀寫不對稱性,因此讀寫請求之間也會互相干擾,尤其是寫請求對讀請求產生嚴重的效能影響。
順序寫入 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 的效能和使用壽命。
讀寫衝突 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 的最大化。
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 的隨機寫效能。
小結
快閃記憶體儲存技術正在飛速發展,快閃記憶體介質、SSD 控制器、儲存系統軟體、儲存硬體平臺都在圍繞快閃記憶體日新月異的發展。快閃記憶體給資料儲存帶來的價值顯而易見,資料中心快閃記憶體化是重要發展趨勢。NVMe SSD 效能受到很多因素的影響,在軟體層面可以通過 IO Pattern 優化 SSD 的效能,使得整體儲存系統的效能達到最佳。
作者簡介
吳忠傑(儲道),專注儲存技術研發十多年,歷經中科院計算所儲存研究中心、EMC、Memblaze 著名儲存研發機構,從傳統儲存陣列、虛擬化叢集儲存、資料去重、快閃記憶體儲存一直做到大規模分散式儲存。長期從事儲存前沿技術的研究與開發,精通軟、硬體技術,發表十餘篇學術論文,擁有多項海內外儲存技術專利,是“儲存之道”技術部落格作者。他是盤古分散式儲存資深技術專家儲道。