SCM: 顛覆存儲系統軟件架構
- 背景
SCM(Storage Class Memory)是一種新型的存儲介質,其特性與傳統的存儲介質有很大的不同。如何基于SCM介質的特性,在軟件層面做出相關的改變,充分發揮SCM的能力,是下一代超高性能存儲系統需要解決的至關重要的問題。
- SCM對存儲軟件的挑戰
SCM對存儲軟件的挑戰是多方面的,其中最關鍵的挑戰是軟件棧時延、網絡時延以及崩潰一致性,下面分別進行簡單的說明。
- 軟件棧時延
不同介質的時延如下圖所示,在沒有SCM出現以前,時延從低到高分別是SRAM、DRAM、NAND(SSD)、Magnetic Disk(HDD)??梢钥吹?,DRAM和NAND之間存在2-3個數量級的差異,這是一個明顯的性能鴻溝(Performance Gap)。SCM的時延在在DRAM和SSD之間,它的出現填補了這個性能鴻溝,這使得SCM既能夠被當作比較快的存儲設備來使用,又可以當作略慢一些的內存(同時有非易失特性)來使用,如下圖右側所示(在圖中標為NVM)。
SCM填補了DRAM和NAND之間的性能鴻溝(FromSNIA)
在現有AFA存儲系統中,為追求NVMe SSD的極致性能,軟件棧本身帶來的時延已經無法忽略 。相比SSD,SCM介質的訪問時延有幾個數量級的差異(從數百微秒級到數百納秒級),軟件棧時延的問題將更為凸顯。如傳統的從應用到內核的軟件棧對功能的分解層級清晰,對于慢速的存儲介質是合適的,但對于SCM這樣的超高速介質則成為了速度的瓶頸。
- 網絡時延
基于同樣的原因,網絡時延在SCM系統中的占比也成為了影響系統時延的主要矛盾。如何構建高速、穩定的網絡,成為了能否在系統中充分利用SCM介質性能的關鍵因素。
- 崩潰一致性(CrashConsistency)
相對于傳統內存,SCM可以提供相同的訪問接口(Byte Addressable SCM: Load/Store),同時提供了數據非易失能力。在基于內存的計算機系統中,不需要考慮系統崩潰后內存中數據的恢復問題(系統崩潰后內存數據全部丟失,需要從其他地方恢復數據),而在SCM系統中需要考慮這個問題(如何在系統恢復后直接從SCM中恢復數據?)。這個問題極大影響了軟件系統的設計理念,如在數據寫入SCM的過程中,由于CPU保存到介質的順序可能受到硬件的自動調整,需要根據數據在系統崩潰后被使用的順序來保證數據在存儲到SCM時的順序,或者能夠通過其他方式恢復數據的內在一致性,否則就會發生數據損壞。
一個簡單的示例如下圖所示。程序的意圖是先寫入數據data[0]和data[1],然后再設置valid標志位為1,表示數據是有效的。然而如果不通過store和fence指令配合指定數據寫入SCM的順序,數據寫入SCM就可以被硬件調整。調整后的順序可能是先寫入valid標志,再寫入data。如果在寫入valid標志后,但data尚未寫入之前發生了系統崩潰,則在SCM將會存在錯誤的信息。在系統恢復后,將會將SCM中的垃圾數據認為是有效數據,從而帶來數據一致性的問題:
訪存重排將會引入崩潰一致性問題
Data數據從Cache 到SCM介質的持久過程,通常需要增加新的commit CPU指令,保障數據真正持久化到了NVM 介質中。但是,在commit操作未執行之前,由于Cache空間不足,引起的不可控、隨機的Data數據從Cache到SCM的持久化,讓數據不一致問題更復雜了。Commit操作影響了未來存儲應用軟件設計,甚至成為軟件架構設計的關鍵要素。數據一致性與性能的矛盾仍然是永恒的架構課題。
- 如何應對這些挑戰
- 應對軟件棧時延的挑戰
應對軟件棧時延挑戰的主要方法,是采用新的軟件分層模式,打薄軟件棧深度,減少軟件消耗。如開源的libpmem(http://pmem.io/)為持久化內存提供了基礎的編程框架,在極致性能場景通過bypass傳統軟件棧的直通方式去除相應的時延消耗,如下圖最右側所示(引自http://pmem.io/2014/08/27/crawl-walk-run.html)。軟件可以從用戶態通過Load/Store直接訪問SCM,繞過內核軟件棧,就能夠最大程度地減少軟件棧的時延開銷。
用戶態Load/Store直通模式提供最優軟件棧時延
所以,軟件用戶態化,除了帶來維護性、App實例編排的好處外,性能優化是更重要的。上圖直接訪問新介質空間地址的信息,避免了內核過多的操作。 內核調度,系統調用的us級開銷,在us級的介質面前,已經過于重載,bypass 內核操作新介質成為必須的選擇。
- 應對崩潰一致性的挑戰
保證崩潰一致性的最簡單方式是在寫入數據前先記錄日志(Log),并在故障恢復后通過日志回放來恢復數據(Redo)。這個方式只要保證日志在SCM上先持久化即可,其恢復過程相對簡單,不易出錯,但該方案的缺點是產生了兩倍的寫I/O,時延也增加了一倍,影響了SCM系統的可靠性和性能。
針對這一缺點,學術界提出了一些能夠避免寫日志,通過巧妙地組織數據結構的更新順序來在crash后恢復一致狀態的方法。例如Write Optimal Radix Tree(WORT),通過記錄節點的層次信息,使得crash后可以檢測出不一致的節點,并通過檢查其子節點將狀態恢復到一致。
下圖是在WORT上插入一個新的parent節點的示意圖,每個節點最左側的數字表示節點所在的層次,后面的一個數字標志其子節點共同的prefix長度,其后是子節點共同的prefix本身(這里可以先忽略prefix長度和prefix本身)。圖中也標出了插入新的parent節點的操作順序:
- 先產生新的parent節點C4
- 再更新原來葉子節點B4的層次信息(原來層次為1,現在為3,新的層次為3是因為C4節點進行了prefix壓縮)
- 再將A4節點的指針指向C4節點
假定在第二步之后第三步之前發生了crash,那么從A4沿著父子節點的指針訪問到B4的時候,就會發現期待的層次應該是1,但B4上記錄的卻是3,這就說明有crash發生過并需要恢復B4。這時可以通過檢查B4的任意兩個childrenkey的共同prefix,恢復出B4原來記錄的prefix長度(2)和prefix值(2, 0),并把層次信息恢復為1。
可以看出,WORT解決了崩潰一致性的問題,但數據結構較復雜,同時其直接更新數據的方式有可能帶來介質寫入的不均衡,影響SCM壽命。這說明學界在SCM專用數據結構方面的研究,仍有很大的探索空間。
(關于WORT的更詳細介紹,請參考https://www.usenix.org/system/files/conference/fast17/fast17-lee.pdf)
- 應對網絡時延的挑戰
隨著RDMA技術的不斷成熟,利用RDMA構建低時延網絡成為構建高性能存儲系統(包括使用SCM的系統)的主要解決方案。通過RDMA通信,可以同時降低網絡時延(特別是小數據的網絡傳輸時延)和CPU在網絡傳輸相關動作上的消耗。存儲軟件需要基于RDMA協議對原有I/O路徑進行優化,以獲得更高的性能。典型的方案包括使用RDMA實現數據鏡像,利用RDMA構造存儲節點間的高性能通信機制等。
- 總結
如何利用好SCM特別是Byte Addressable SCM,對存儲系統的軟件架構設計提出了非常高的要求,這個命題的解法涉及了數據結構,算法,調度,協議,計算機體系架構等多個方面,具有顛覆性影響,也是未來很長一段時間內學界和業界的研究熱點。華為也在充分擁抱學界和業界的成果,同時積極追求創新,努力構建SCM介質應用的競爭力:
- 在軟件時延上,進行Load/Store訪問方式的研究,打薄軟件棧。同時進行低時延調度框架的研究,保障SCM訪問時延不因為調度而發生大幅度波動,提高時延穩定性。
- 在崩潰一致性方面,進行SCM專用創新性數據結構的研究。當前的成果已能夠在性能,磨損等方面進行均衡,相對業界其他數據結構有更好的表現。在今年的Flash Summit大會上,華為針對SCM數據結構的研究做了專題演講,把研究結果向業界共享:https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2017/20170808_FN11_Zha.pdf
- 在網絡方面,結合華為自研網絡芯片進行軟件棧垂直優化,充分發揮RDMA的優勢。
在使用好SCM上,學界和業界都在探索中,華為也將以開放、合作的姿態,加入到這個進程,爭取在第一時間實現研究到產品的轉化,為客戶提供新一代的超高性能存儲而持續努力。