百度是國內最早大規模使用SSD/Flash的互聯網公司之一,早在2007年,就開始在搜索引擎中大規模使用SSD。在過去的幾年中,百度數據中心部署了數以十萬計的SSD,支撐了每天60億次的搜索請求及其背后的廣告、大數據實時分析處理、CDN等系統。在百度多年部署使用SSD的過程中,積累了很多經驗,也發現了傳統SSD的一些缺陷。在實際系統中,傳統SSD只能為上層軟件或存儲系統提供硬件裸帶寬(raw bandwidth)的40%左右,甚至更低。因為Flash必須先擦除再寫入的特性(Out-of-place Update)以及需要7%~50%的預留空間(over-provisioning space)來處理隨機寫,傳統SSD還需要提供10%左右的空間來做Flash通道之間的奇偶校驗,因此,傳統SSD只能提供硬件裸容量(raw capacity)的50%~70%給上層應用或存儲系統。另外,傳統SSD的性能往往會在使用過程中出現抖動,或隨著剩余空間變小而降低??紤]到百度大規模的數據中心和大規模的SSD部署,傳統SSD的不足給我們帶來了巨大的成本和效率開銷。
我們認為非常有必要按照大規模存儲系統的需求重新設計SSD的軟硬件架構,以徹底解決其不足。于是我們提出“軟件定義Flash”(SDF,Software–Defined Flash)的概念。SDF是一個軟件硬件協同的系統,把底層Flash通道的接口暴露給上層軟件,軟件可以管理數據的分布,以充分挖掘硬件的并發性;同時針對大規模存儲系統的特性設計軟硬件架構,消除了傳統SSD的冗余空間和奇偶校驗空間,使得幾乎所有的Flash空間都能提供給上層軟件使用。百度自行實現了SDF所有的軟件和硬件設計,并部署在內部存儲系統上,實現了99%的容量利用率和95%的帶寬利用率。相對于傳統同配置的PCIE SSD,性能提高了3倍,成本降低了50%。
傳統SSD的特性與不足
SSD是采用NAND為介質的存儲設備,與機械硬盤不同,它不需要任何機械操作,因而功耗很低,帶寬比機械硬盤高1個數量級,IOPS高兩個數量級。隨著NAND顆粒不斷降價,SSD應用更加廣泛,基本成為數據中心的標準配置之一。但其每GB成本仍然比機械硬盤貴1個量級以上,因此,充分發揮SSD的潛能就顯得非常重要。
NAND有如下兩個特性,決定了SSD的一切設計取舍。
先擦除才能寫(Out-of-place Update):一個物理塊必須先擦除才能寫入新數據。
該特性會影響隨機寫性能,因為更新的數據不能直接覆蓋舊數據,而是必須先寫到一塊已擦除過的新塊中,等寫到一定程度,需要把老的、無用的數據統一刪除,以騰出空間給新數據。這個過程需要merge操作,非常耗時。因此傳統SSD必須預留很大容量(一般為7%~50%),作為寫緩存,以降低merge的代價。一般越高端、性能越好的SSD冗余空間就越大。也就是說,一個本來有1TB空間的SSD,為了確保高效,用戶只能使用500GB。這意味著落到用戶的每GB成本就更高,但如果冗余空間較小,往往性能也沒法滿足用戶的需求。
我們選擇一款SATA接口的SSD硬盤,通過調節冗余空間,在不同比例下做隨機寫測試,可以看到,冗余空間為7%時相對于0%有接近4倍的性能提升,冗余空間為50%相對于7%有40%多的性能提升(如圖1所示)。
Out-of-place Update還會導致一個問題是寫放大系數(Amplification Factor)。SSD在做垃圾回收的過程中要做merge操作,會把一些有效數據搬移到新塊,并把原來的塊擦掉,導致了額外的擦除。如果寫放大系數太大,會大大降低SSD的使用壽命,一般寫放大系數都在2~3之間。
傳統SSD的大部分設計努力,都是在保證一定性能的前提下,盡量降低冗余空間的比例和寫放大系數。
單個NAND的性能非常有限,必須利用多個NAND并發操作來達到較高的性能。
一般一個頁的讀延時是幾十μs,寫延時是ms量級,一個NAND芯片內部會有多個plane,一個SSD會有多個NAND通道。SSD控制器會把數據盡量strip到多個通道中的多個plane中,以通過并發訪問提高總性能。傳統SSD的硬件架構如圖2。
一個SSD控制器包含十個到幾十個Flash通道,每個通道一般包含1~2個NAND顆粒,每個NAND顆粒有數個到十幾個Flash plane。如果用戶要寫一塊數據到SSD,這時SSD控制器會負責把數據拆成小塊,并發寫到多個通道中,以充分利用硬件的并發性。如果要讀數據,SSD也會根據之前寫的映射關系找到對應的通道,將數據讀出來。傳統SSD的控制器需要承擔數據stripping、layout和mapping管理等策略,很難針對不同應用需求、不同訪問模式做到最優,而且會增加硬件復雜度,提升成本。
NAND還有一些其他特點,如讀寫以為頁單位,擦除以塊為單位,數據必須經過BCH校驗,使用過程中會出現壞塊,每個塊都有固定的使用壽命等,這導致了SSD設計還有其他一些妥協,如磨損平衡、地址映射等。
軟件定義硬件原則
所謂軟件定義硬件,從系統角度來看,有兩個原則。
應用驅動。
軟硬件協同系統。
從實現的角度,有如下三個設計原則。
硬件要簡單,可控性大于智能化。
盡可能暴露硬件底層接口。
軟件從層次化變成豎井化。
軟件定義Flash
基于這樣的設計原則,在2011年初,我們開始著手設計面向大規模存儲需求的下一代SSD——SDF。
SDF擁有與傳統SSD完全不一樣的架構和設計,我們針對海量存儲系統的數據訪問模式設計,底層硬件接口暴露給上層軟件,取消了傳統的Linux文件系統和I/O棧,主要創新包括以下幾點。
全新的硬件架構
底層Flash通道暴露給上層軟件,軟件可直接管理數據的layout以充分挖掘硬件的并發能力。SDF的架構如圖3所示,可以看到,其架構和SSD有明顯不同。在SDF中,每個Flash通道對于上層軟件來說都是一個獨立的小SSD,軟件通過自己定義的調度器來管理數據的布局,使得多個通道能比較容易同時工作,這樣實際帶寬可以在不同場景下都能達到硬件裸帶寬的極限。
每個Flash通道具有一個獨立的FTL(Flash Translation Layer)控制器,實現了簡單的地址映射、壞塊管理等功能。
全新的軟件架構
消除了傳統的Linux文件系統和I/O棧,我們自行研發了輕量級的用戶態文件系統,大大降低了I/O請求延時。SDF的軟件架構如圖4所示。
基于從層次到豎井的設計原則,我們可以看到,SDF的軟件棧,只保留了最底層的硬件驅動,其他層次都沒有了,Linux的文件系統也變成了用戶態的一個輕量級文件系統。
不對稱的讀寫粒度,寫單位是2MB,剛好是一個擦除塊的大??;讀單位是8KB,剛好是一個頁的大小。在互聯網大規模存儲系統中,為了提高I/O性能,一般都會在內存中把隨機寫合并成順序寫,典型系統包括Google的LevelDB,Facebook的Haystack,以及百度的新存儲體系??梢园殉志没瘜懙牧6仍O置成NAND的擦除塊大小,并且硬件不做stripping,這樣就不需要預留冗余空間,也不需要垃圾回收,因此寫放大系數恒為1。
全新的系統視角
通過軟硬件結合的辦法保證系統的可靠性。因為存儲系統本身已對數據進行了3副本備份或做了Erasure Code,因此并不需要硬件提供非??量痰目煽啃员U稀6鴤鹘ySSD除了對數據做了必須的BCH校驗,還在通道之間做了橫向的奇偶校驗,奇偶校驗數據存儲在一個獨立的通道,相當于消耗了一個通道的容量。SDF取消通道間的奇偶校驗,把之前存放奇偶校驗數據的通道用來存放數據,相當于多增加了10%的存儲空間。
具體的設計細節和設計原則,可以參考百度發表在ASPLOS 2014上的論文《SDF: Software-Defined Flash for Web-scale Internet Storage Systems》。
SDF性能數據
2011年設計的SDF采用25nm的Micron MLC NAND,控制器采用Xilinx的FPGA,硬件板卡由第三方ODM提供,百度自行設計了Verilog RTL代碼、驅動代碼和用戶態文件系統代碼。
在大壓力測試時,性能數據如表1。
百度SDF和“市場某主流PCIE SSD”采用同樣的硬件配置,但性能更好。SDF的讀帶寬達到1.59GB/s,是PCIE 1.1 x8實際性能的上限,帶寬利用率99%;寫性能達到0.96GB/s,是44個Flash通道寫聚合性能的上限,寫帶寬利用率達到96%。
我們可以通過定義不同的軟件調度策略來激活不同的Flash通道,通過不斷增加工作的通道數量,可以看到,其讀寫性能也線性提高(如圖5),可見SDF的設計具有非常良好的擴展性。
結論
百度提出軟件定義硬件的概念,并依此原則設計了軟件定義Flash(SDF),我們將SDF部署在實際生產環境,每GB成本比市場上主流的PCIE SSD降低了50%,性能提高了3倍。同時在ASPLOS、EUROSYS、ISLPED等全球頂級計算機系統和體系結構會議發表論文3篇,發明專利9個,取得了良好的應用效果和學術成果。
SDF除了可以應用在百度的大規模存儲系統中,也可以用在其他基于LSM-tree的存儲系統,如Haystack、LevelDB等,具有很好的適應性。
作者簡介:歐陽劍,百度基礎結構部高級架構師,負責數據中心體系結構等工作,包括計算、存儲、通信、低功耗等軟硬件協同系統。