?

低CPU開銷的低延遲存儲引擎

2022-03-09 05:50廖曉堅楊洪章屠要峰舒繼武
計算機研究與發展 2022年3期
關鍵詞:存儲系統收割機固態

廖曉堅 楊 者 楊洪章 屠要峰 舒繼武

1(清華大學計算機科學與技術系 北京 100084)

2(中興通訊股份有限公司 南京 210012)

隨著新型存儲如NVMe SSD(non-volatile memory express solid-state drive)以及網絡如infiniband技術的出現,計算機系統正在進入“微秒級延遲”時代.這使得原先針對毫秒級延遲的I/O設備設計的系統軟件需要被重新設計,以充分發揮新型高速I/O設備的低延遲優勢.本文關注低延遲的存儲系統.固態存儲(solid-state drive, SSD)技術近10年發展迅猛.例如,Intel公司于2020年公開銷售的高性能固態存儲[1],硬件帶寬高達7.2 GB/s,讀寫4 KB數據的延遲低至5 μs,較傳統的磁盤存儲(hard disk drive, HDD)和5年前的SATA(serial advanced technology attachment)固態存儲均有多個數量級的改良.對于這些超低延遲的固態存儲,主機端存儲系統的延遲開銷逐漸凸顯.

主機端存儲系統的延遲主要分為3個部分:系統調用延遲、系統軟件延遲例如文件系統層和塊設備層延遲,以及I/O收割延遲.已有工作通過在用戶態實現存儲系統以及簡化或繞開塊設備層,以優化系統調用和系統軟件延遲.伴隨著硬件性能提升以及這些軟件優化,I/O收割延遲高以及抖動的問題逐漸凸顯.本文主要關注I/O收割延遲.

收割I/O請求,即探測并處理存儲設備完成I/O請求的信號,是存儲系統的一項重要基本功能.傳統存儲系統依賴硬件中斷(interrupt)機制收割I/O請求.然而,硬件中斷會引入額外的上下文切換開銷,帶來額外的延遲.對于高性能固態存儲,中斷開銷變得不可忽視.為此,一些工作提出采用輪詢(polling)機制[2]替代中斷,以完全消除上下文切換.然而,輪詢機制要求主機端CPU一直處于查詢I/O完成信號的狀態,使得CPU占用率高達100%,嚴重浪費了CPU的計算資源.

為了解決上述I/O延遲高和CPU開銷大的問題,本文提出一種低CPU開銷的低延遲存儲引擎NIO(nimble I/O).NIO的核心思想是動態地混合使用中斷和輪詢機制,從而以低CPU開銷取得較低的I/O延遲.NIO的主要架構是將“大”“小”I/O的處理路徑分離:對于大I/O采用中斷機制,因為在此類情況下I/O的傳輸和硬件處理時間占比較重,中斷和輪詢的延遲無顯著差別;對于小I/O使用惰性輪詢機制,先讓CPU睡眠一段時間再持續輪詢,以此來減少持續輪詢帶來的巨大CPU開銷.在該架構之上,NIO設計和實現了事務感知的I/O收割機制,即以一個事務(一組需要同時完成的I/O請求)為單位判斷請求大小,因為一個事務的完成時間取決于最慢的I/O.此外,為了應對應用負載以及存儲設備內部活動的變化,NIO提出了動態調整機制,在不影響現有NVMe[3]存儲系統高并發和低延遲的前提下,動態調整小I/O的睡眠等待時間.

本文工作的主要貢獻包括3個方面:

1) 提出了大小I/O處理路徑分離的存儲架構NIO,對不同的路徑采用不同的I/O收割機制,以同時優化CPU占用率和I/O延遲.

2) 提出了事務感知的I/O收割機制和動態調整機制,以應對應用負載和存儲設備內部活動的變化.

3) 在Linux內核中實現了NIO和以上機制,動態負載測試顯示,NIO與基于輪詢的存儲引擎性能相當,并能減少至少59%的CPU占用率.

1 背景介紹與研究動機

本節主要介紹現有高性能固態存儲及其軟件存儲系統的相關背景,并分析現有中斷和輪詢機制.

1.1 高性能固態存儲

固態存儲是一種新型的非易失存儲.不同于磁頭式結構的傳統磁盤存儲,固態存儲內部為電子式結構,因此能提供更高的硬件帶寬和更低的讀寫延遲.

早期的固態存儲直接兼容傳統的硬盤接口和協議如SATA.然而,傳統的磁盤接口和協議帶寬受限,存儲協議開銷大,使得系統軟件難以發揮固態存儲高帶寬和低延遲的優勢.因此,一種新型的針對高性能固態存儲設計的存儲協議NVMe[3]被提出并廣泛應用于固態存儲.相比于傳統的SATA協議,NVMe協議顯著地降低了處理1個I/O所需要的CPU指令.同時,NVMe提供多硬件隊列抽象,在現代多CPU的計算機上具有更好的多核擴展性,從而降低核間競爭和同步機制帶來的額外延遲.以上優勢使得基于NVMe的存儲設備能提供更低的延遲.

近幾年來,固態存儲的平均延遲有了顯著的降低,如表1所示.例如2014年Samsung公司推出的850pro SATA SSD,平均延遲以及延遲標準差均超過50 μs.然而,2018年Intel公司推出的905P NVMe SSD能在10 μs內處理4 KB隨機讀,延遲標準差也能控制在2 μs內.另一方面,從表1中“99.9%延遲”列中可以看出,固態存儲也能提供越來穩定的延遲.

Table 1 Comparison of SSDs Latency (4 KB random read)

1.2 I/O收割機制——中斷和輪詢機制

固態存儲越來越低及越來越平穩的延遲,促使系統軟件設計者重新思考存儲軟件的設計.其中,如何提供高效的I/O收割機制,即以低開銷快速探測并處理存儲設備完成I/O請求的信號,成為系統軟件關注的熱點問題[2-6].本節將具體介紹硬件中斷和輪詢2種廣泛應用于存儲系統的I/O收割機制,并分析它們的優劣.

硬件中斷機制依賴硬件發出完成信號,由CPU暫停正在執行的任務,將原先的I/O處理任務調度回CPU執行,以完成I/O處理的最后階段,如通知應用程序.中斷機制在主機端CPU不繁忙時,會因為任務上下文切換或CPU運行模式切換引入1 μs左右的延遲;在主機端CPU繁忙時,CPU任務調度和緩存失效等使得中斷機制帶來的延遲變得更加不可預測.中斷開銷在高性能固態存儲上顯得愈發嚴重.

為此,部分系統如SPDK[2]提供了輪詢機制以消除中斷開銷.輪詢機制使得I/O任務所在CPU無休止地查看完成信號.這種極端的I/O收割機制能縮減I/O延遲,卻需要付出100%的CPU開銷.如表2所示,對于現代一塊超低延遲的固態存儲盤,輪詢的延遲低于中斷延遲,尤其是I/O請求大小較小時.然而,隨著I/O請求變大,輪詢帶來的I/O延遲低的優勢逐漸變得不明顯.這是因為大I/O請求的硬件處理時間明顯高于I/O收割延遲,使得中斷的上下文開銷變得不明顯.另一方面,隨著I/O請求變大,中斷的CPU開銷越來越低,而輪詢卻需要獨占CPU.

Table 2 Comparison of the Latency and CPU Consumption of Interrupt Against Polling

通過分析,我們發現輪詢機制在I/O請求較小時延遲低的優勢明顯;在I/O請求較大時,中斷機制CPU開銷低的優勢顯著,延遲與輪詢機制相當.

2 NIO設計

本文提出一種低CPU開銷的低延遲存儲引擎NIO,旨在提供與輪詢接近的低延遲,同時降低I/O收割過程中的CPU占用率.

Fig. 1 Overall architecture of NIO圖1 NIO的整體架構圖

2.1 NIO架構

圖1顯示了NIO的架構圖.NIO是介于NVMe設備驅動層和應用層之間的基本存儲引擎(類似于塊設備層).應用程序、文件系統或者鍵值存儲系統通過讀寫接口將I/O請求發送給NIO.受到表2的啟發,NIO將大小I/O路徑分離,并采取不同的I/O收割機制以低CPU開銷獲取低I/O延遲.如圖1和算法1所示,在提交I/O到設備后,對于小I/O,使用惰性輪詢機制,先讓出CPU一段時間,再接著輪詢I/O請求的完成信號(算法1的行②~④).對于大I/O,NIO仍然使用傳統的硬件中斷機制(算法1的行⑤⑥).

算法1.NIO處理I/O請求算法.

輸入:發送到存儲設備端的I/O請求bio,I/O大小io_size;

輸出:函數返回值void.

①submit_bio(bio); /*提交I/O到設備*/

② ifio_size

/*THRESHOLD為界定的大小I/O的閾值*/

③sleep(INTERVAL);

/*讓出CPU,INTERVAL為小I/O睡眠時間*/

④wake_up()并輪詢;

/*被高精度定時器hrtimer喚醒并進入輪詢*/

⑤ else /*大I/O處理路徑*/

⑥io_schedule()并等待中斷;

/*讓出CPU并等待中斷信號*/

⑦ end if

NIO的架構面臨著2個基本問題:如何區分大小I/O以及如何確定惰性輪詢的睡眠等待時間.

NIO通過系統預設的分界閾值區分大小I/O.分界閾值可通過對比存儲設備在帶寬利用率不高的情況下,中斷和輪詢5類規整大小I/O的延遲確定.如表2所示,在讀請求大小低于64 KB時,輪詢的優勢顯著;而在≥64 KB時,輪詢優勢不明顯.故NIO對于同種型號的SSD的讀請求采用64 KB為分界閾值,寫請求的情況類似.這種靜態切分的方法能有效應對復雜的應用I/O.首先,雖然應用I/O大小可能不規整(即非4 KB的整數倍),操作系統在提交I/O請求一般通過填充操作將其對齊,故在確定分界閾值只需要測量少數5種規整大小的I/O.其次,在確定分界閾值時,只需考慮存儲設備帶寬未被充分利用的極端情況.因為在這種情況下設備的硬件延遲較低,能確定在所有設備狀態下小I/O的一個超集,使得小I/O總是能被準確判定.本文將在2.3節討論在設備帶寬充分利用情況下,通過動態調整機制調整惰性輪詢睡眠間隔以應對小I/O被誤判的情況.

NIO通過系統靜態預設和動態調整的方法,為每一種規整大小的小讀和小寫請求都設定一個睡眠閾值.NIO靜態睡眠閾值綜合考慮了I/O的平均延遲、延遲抖動以及睡眠開銷,其確定式為

Tstatic=Tavg-Tstdev-Tsleep,

(1)

其中,Tavg為輪詢該類型該大小I/O的平均延遲,例如表2中的第3列輪詢延遲.Tstdev為該類型該大小I/O耗時的標準差.式(1)之所以減去標準差,是為了緩解I/O延遲抖動帶來的影響.最后,靜態睡眠時間Tstatic還除去了睡眠機制帶來的開銷Tsleep,如睡眠前后的上下文切換.睡眠開銷可動態配置,在NIO中為1 μs.

以上NIO的基本架構涵蓋了I/O收割過程中的靜態屬性.然而,如何應對上層應用以及底層存儲設備的動態變化依然存在難題.因此,NIO提出事務感知的I/O收割機制和動態調整機制.

2.2 事務感知的I/O收割機制

在存儲系統中,一組需要同時完成的I/O請求被稱為一個事務.事務的響應延遲由事務中處理最慢的I/O請求確定,它對系統的性能表現有很大的影響.在現有的存儲系統中,I/O的處理和收割都是以單個I/O為單位,無法感知上層系統的事務語義,從而可能無法發揮NIO大小I/O分離的架構優勢.例如,文件系統在處理用戶通過文件接口存儲的數據時,可能需要寫入2個數據,即文件元數據(描述文件存放位置)以及用戶數據.文件元數據一般較小,例如低于64 KB,而用戶數據視應用情況可能較大,例如高于64 KB.在最基本的NIO設計中,文件元數據被劃分為小I/O處理,而用戶數據被劃分為大I/O.即使文件元數據被快速收割,用戶請求的快慢還是取決于較大的I/O,即用戶數據;這使得小I/O優化失效.

為了解決上述問題,NIO提出了事務感知的I/O收割機制,即判斷I/O大小是以整個事務為基本單位.若一個事務中存在大I/O,則該事務被判定為大I/O;事務中的小I/O也還是以中斷的方式收割.若一個事務中的請求均為小I/O,則該事務被判定為小I/O;事務中的所有I/O以惰性輪詢的方式收割.

事務感知的I/O收割機制還面臨2個問題:1)上層系統如何傳達事務語義給NIO;2)事務內部的請求依賴在NIO架構下如何處理.

上層系統或應用需要顯示地指定某些I/O屬于同一個事務.事務指定方式可以通過為I/O請求標上同一個事務ID(identity)或者通過同一個系統調用實現.在NIO的具體實現中,我們通過后者,即同一個系統調用,傳達事務語義.NIO通過矢量化的I/O系統調用pvsync2,實現事務感知的I/O收割機制.應用程序可以通過pvsync2指定多個不連續的I/O請求,并將這些I/O請求標記為高優先級(例如攜帶RWF_HIPRI標志),以觸發NIO的事務感知的I/O收割機制.

事務內部的I/O請求可能存在依賴.如文件系統中日志數據塊和日志提交塊存在寫依賴,即日志提交塊需要在日志數據塊之后持久化.NIO通過分階段的思想,將有依賴的請求劃分成多個階段處理,從而在保證原先事務寫依賴的前提下,盡可能加速每一階段的I/O請求.如一個事務中A和B這2組請求,A需要在B之前持久化,則第1階段先使用對A組請求整體收割.在A組請求完成后,B組請求接著以類似的方式處理.

2.3 動態調整機制

現代的存儲設備一般具有多個硬件隊列,且1個硬件隊列可同時處理多個I/O請求.所以,一個I/O預期的完成時間不僅僅取決于存儲系統中的靜態因素(即式(1)),也受到其他硬件隊列以及本隊列上I/O的影響.為了應對上述問題,NIO提出動態調整機制,在保留現有NVMe存儲系統高并發低延遲的特點前提下,動態調整小I/O處理的睡眠時間.

I/O請求可能由于有限設備資源和設備內部活動如垃圾回收而遭受額外的排隊時間.NIO通過啟發式算法確定I/O的排隊時間,并將該排隊時間加上式(1)的時間確定小I/O的總體睡眠時間:

Toverall=Tstatic+Tdynamic.

(2)

NIO為每個硬件隊列上的每類請求大小的讀和寫請求維護1個排隊時間Tdynamic.例如NIO系統中有32個硬件隊列,5種請求大小,則每個隊列有10(=2×5)個排隊時間,總共有320(=2×5×32)個排隊時間.NIO為每個硬件隊列都維護1個排隊時間,從而不影響硬件隊列的并行性.

排隊時間在每一次I/O請求完成時動態更新.排隊時間為當前隊列當前I/O前N個I/O請求等待時間的算數平均數:

(3)

Δti=max(0,Treal-Texpect),

(4)

其中,Treal為I/O從NIO發出至I/O被NIO收割的時間間隔,Texpect為該I/O在輪詢機制下的平均延遲,例如表2的第3列輪詢延遲.

為了維護排隊時間,NIO需要額外的內存空間記錄前N個I/O請求的排隊時間.例如對于32個硬件隊列,2種I/O和5種請求大小,N=1 024,每個排隊時間用8 B記錄,則需要額外2.5 MB(=32×2×5×1 024×8 B)內存空間.現代計算機一般擁有4 GB以上的內存空間,故本工作認為該內存空間開銷可以接受.

同時,為了實時更新排隊時間,NIO需要追蹤每個I/O的實際完成時間,該追蹤和實時更新開銷在NIO可忽略不計.現有Linux NVMe存儲系統自身已經追蹤每個I/O的生命周期(如完成時間),向上層系統提供這些信息供程序分析、服務質量控制等功能.NIO構建于NVMe存儲系統之上,天然地利用每個I/O的實際完成時間,故無額外的追蹤開銷.在更新排隊時間時,NIO采用遞歸增量更新的方式而非每次都重新計算平均值:

(5)

NIO每次只需計算最近I/O的排隊時間,即ΔtN+k,并根據式(5)以常數時間復雜度遞歸更新排隊時間,極大地降低了更新排隊時間的開銷.

3 NIO實現

本工作通過修改Linux 4.18.20內核中的多隊列塊設備層(blk-mq)實現了NIO.

Fig. 2 The implementation of NIO圖2 NIO的實現

圖2展示了NIO的具體實現以及流程圖.為了方便闡述,圖2的每次系統調用即步驟①為只包含1個I/O請求的事務,I/O大小的判斷即步驟③也是以事務為單位.如圖2步驟①所示,應用程序需要通過pvsync2接口,并將該請求標記成O_DIRECT和RWF_HIPRI,以調用NIO的功能.這2個標志存在于原生Linux內核中,分別表示繞開VFS頁緩存和高優先級請求.NIO利用這2個標志實現低延遲的I/O收割機制,從而無需改動除blk-mq之外的其他內核模塊如VFS.如步驟②所示,VFS檢查請求標志,若不攜帶RWF_HIPRI,則將請求直接派發到傳統基于中斷機制的I/O路徑中,否則進入blk-mq模塊進一步判斷大小I/O.如步驟③所示,若為小I/O,即I/O大小≤64 KB,則采用惰性輪詢機制.NIO首先睡眠間隔為Tstatic+Tdynamic,其中Tstatic為式(1)所定義.本工作在blk-sysfs.c中添加了新的結構體和函數以支持Tstatic的手動配置.在操作系統啟動完成時,系統管理員可以通過Linux sysfs向NIO傳入Tstatic相關數值.Tdynamic為式(3)定義.由于NIO通過式(5)計算Tdynamic,NIO維護了2個排隊時間以及N個Δt.這些變量的初始值為0.

NIO在睡眠之后持續輪詢,直到接收到I/O完成信號,如步驟④所示.之后,NIO根據式(5)更新Tdynamic.其中需要計算當前請求的實際完成時間與預期完成時間的差值,即ΔtN+k.NIO在睡眠之前通過函數ktime_get_ns記錄初始時間T1,在步驟④記錄完成時間T2.實際完成時間Treal=T2-T1.預期完成時間需要系統管理員手動配置.與Tstatic相似,系統管理員在操作系統啟動完成時通過sysfs向NIO傳入各種大小的讀寫請求在輪詢機制下的完成時間,例如表2的第3列輪詢延遲.NIO通過式(4)計算出ΔtN+k,并通過式(5)更新排隊時間.如步驟⑤所示,請求被成功處理并返回用戶應用.

4 實 驗

本節將通過實驗對比和分析NIO與現有系統的性能差異.首先,通過對比NIO與現有系統在不同I/O大小下的性能表現和CPU占用率驗證NIO的架構和整體設計.其次,通過對比測試事務處理下的性能驗證事務感知的I/O收割機制.最后,通過動態負載,分析和驗證動態調整機制.

4.1 實驗平臺和方法

本實驗使用的實驗平臺配置信息如表3所示.本實驗使用的測試設備為Intel公司于2018年推出的傲騰SSD[7],其在本實驗平臺的延遲如表2所示.NIO的配置參數如表4所示.這些參數通過FIO[8]單線程測量原生Linux NVMe存儲棧在不同I/O大小(如表4中第1列所示)對整盤進行隨機讀寫的延遲確定.靜態睡眠時間通過式(1)確定,其中延遲平均值和延遲標準差為基于輪詢的對應延遲.預期完成時間為基于輪詢的平均延遲.在操作系統啟動完成后,這些參數通過sysfs傳遞到NIO系統中.

Table 4 NIO Parameters

本實驗將NIO與基于中斷機制和輪詢機制的Linux NVMe存儲系統對比.本實驗使用性能測試工具FIO對整塊存儲設備區域進行讀寫.為了測試公平,所有測試均使用pvsync2接口發送I/O請求,以控制存儲系統其他部分的影響.整個測試過程開啟O_DIRECT標志,以繞開操作系統緩存直接對設備讀寫.如無特別說明,測試的數據量為整個盤的大小.

4.2 基準測試

本節測試啟動單個線程持續發送各種大小的I/O.測試過程中io_depth被設置為1.表5顯示了測試結果.I/O大小>64 KB的結果未顯示,是由于在這之后3個對比系統的性能無明顯差異.從表5中可知,綜合各I/O大小的平均值,NIO的平均延遲為中斷的92.9%,為輪詢的103.6%.這是因為對于小I/O,NIO使用了惰性輪詢機制,使得絕大部分I/O能消除中斷帶來的上下文開銷.進一步分析發現,對于少部分快速完成的I/O,NIO睡眠時間過長導致總體平均延遲比輪詢I/O的平均延遲高.

Table 5 Microbenchmark Results (Random Read)

NIO也能提供更穩定的延遲,其延遲標準差為中斷的86.6%,為輪詢的98.8%.相比于中斷,NIO需要額外7%的CPU占用.此外,相比于輪詢,NIO在優化I/O延遲的同時能極大地降低系統的CPU占用率.這是因為相比于極端的輪詢,NIO會主動讓出CPU進入睡眠狀態,降低CPU占用率的同時保留當前程序的可用時間片,從而降低下次CPU周期調度(10 ms 1次)將該任務調度出去的概率.

4.3 事務處理測試

本節測試使用FIO的pvsync2接口模擬事務處理.測試過程從4 KB~64 KB區間隨機選擇事務內各I/O請求的大小.本實驗設置事務大小即事務內I/O個數分別為4和64,以分別模擬大小事務.由于pvsync2接口單個操作只支持1個操作數(即讀或寫),因此目前NIO的具體實現也只支持純讀和純寫事務.因此,本實驗僅展示了純讀和純寫事務的性能.測試結果如表6所示.從表6可知,當事務大小為4時,相比于中斷,NIO能平均降低約3.4%的事務處理延遲.當事務大小為64時,NIO的優勢更明顯,事務處理延遲相比中斷平均降低了4%.另一方面,NIO相比于中斷需要付出額外50%的CPU開銷,相比于輪詢減少了約82%的CPU占用.進一步分析發現,在本實驗的SSD上,I/O的硬件處理時間還是占了相當重的比例,導致中斷機制與輪詢機制的平均延遲相差不大.相信在下一代更快的設備上,如Intel公司2020年推出的4 KB讀寫延遲僅為5 μs(比當前測試設備快了將近1倍)的PCIe 4.0 SSD[1]上,NIO的延遲和CPU占用率的降低將更加明顯.

Table 6 Results of Transaction Performance

4.4 動態負載測試

本節實驗通過動態變化測試過程中的I/O大小、I/O線程以測試NIO的動態調整機制.實驗過程分為3個階段,以分別模擬系統在頻繁小I/O、頻繁大I/O以及高并發情況下的場景以及這些場景間的切換.每個階段向測試設備上隨機寫入20 GB的數據.

階段1,FIO啟動2個進程隨機寫入I/O大小在4~8 KB的數據;階段2,測試進程增加為4個,隨機寫入128 KB~1 MB的數據;階段3,進程數量進一步增加至13個,并向設備寫入4~8 KB的數據.測試結果如表7所示.從表7可知,寫入等量數據時,NIO幾乎能和輪詢同時間完成,比最慢的中斷時間縮短約5%.

Table 7 Results of Dynamic Workloads

本實驗進一步分析了測試過程中各階段的平均延遲、歸一化到輪詢的延遲標準差和CPU占用率.在3個階段,NIO的延遲標準差分別為中斷的7%,100%,9%,為輪詢的105%,143%,142%;NIO的平均CPU占用率分別為中斷的125%,110%,110%,為輪詢的41%,7%,21%.可以看出,NIO在高并發小I/O場景下(即第3階段)表現尤其優異.高并發小I/O場景不僅考察存儲系統的I/O處理能力,也考驗CPU利用效率;NIO能以更小的CPU代價獲取較低的I/O延遲,故NIO在CPU競爭的頻繁小I/O場景下優于中斷和輪詢.

5 相關工作

本節將從I/O收割機制及低延遲存儲系統2個方面介紹相關工作.

1) I/O收割機制.傳統存儲系統通過中斷收割I/O,然而會引入額外的上下文切換開銷.因此,某些存儲系統[2-4]使用輪詢取代中斷以消除上下文切換,從而獲取低延遲.Linux內核進一步提出了混合輪詢機制[9](hybrid polling)以降低輪詢帶來的CPU開銷.混合輪詢與本文提出的惰性輪詢類似,都是先讓線程睡眠等待一段時間再持續輪詢.不同之處在于:①混合輪詢不區分大小I/O均使用同種輪詢策略,使得大I/O的收割效率低下.②混合輪詢不區分讀寫、不區分I/O大小,均使用同一睡眠時間,使得小I/O可能受大I/O的影響睡眠過長而效率低下.③混合輪詢在計算睡眠時間時,采用的是自機器啟動以來所有I/O的平均完成時間的一半;這種方法會導致睡眠時間的不準確以及破壞NVMe存儲系統的并行性.④混合輪詢無法動態調整.以上混合輪詢的種種局限使得其默認在Linux內核中被禁用;本文提出的NIO可能是內核中混合輪詢的一種更高效的替代系統.cinterrupt[6]動態地合并中斷請求,從而減少主機端CPU占用.cinterrupt的設計和本文的NIO互補,能共同促進高效的I/O收割機制.

2) 低延遲存儲系統.為了充分發揮新型固態存儲設備的超低延遲,Linux NVMe存儲系統默認不進行主機端I/O調度.FLIN[10]和D2FQ[11]提出在設備端進行I/O請求調度以保證公平性及控制尾延遲.asyncio[12]在存儲系統中將CPU和I/O操作并行,從而降低單個文件系統調用的整體延遲.CoinPurse[13]將文件系統中的小寫通過字節接口直接寫入設備的控制器緩沖區,從而加速了小寫操作.HORAE[14]提出將存儲系統中的順序性保證分離,由快速旁路保證,從而使得一連串序列化的寫請求能并行執行,縮短了事務的延遲.Max[15]通過優化讀寫鎖和數據結構組織方式,降低多進程在文件系統層的同步和競爭,從而能降低高并發場景下請求的延遲.以上低延遲存儲系統關注更上層系統(如文件系統)的I/O延遲,能進一步利用NIO縮短I/O收割階段的延遲.

另一類優化存儲延遲的系統基于開放通道固態存儲(open-channel SSD, OCSSD),利用OCSSD的白盒優勢,通過精簡軟件棧以及提供存儲隔離等方法縮減延遲.ParaFS[16]將主機端存儲軟件與設備端具有類似功能的閃存轉換層協同設計,與文獻[17-21]中所述的設計類似.ParaFS通過精簡存儲棧、主機端I/O調度以及主機設備協同的垃圾回收機制等方式優化I/O延遲.FlashBlox[22],DC-Store[23],OCVM[24]通過將不同應用、容器或虛擬機以隔離的方式運行在不同的物理存儲通道(channel)中,以消除不同應用I/O的互相干擾,從而提供穩定的延遲.此類系統通過軟硬件協同提供端到端的延遲保證,能進一步利用NIO優化I/O收割延遲.

6 討 論

高性能固態存儲支持較大的并發,且硬件控制器可能會對并發I/O進行調度,導致I/O亂序執行,從而影響NIO的優化效果.I/O亂序會導致2種結果:請求提前完成和請求延后完成.對于請求提前完成的情況,NIO針對小I/O的惰性輪詢設計可能失效.但由于NIO保留了中斷機制,NIO仍能準時捕獲I/O完成的信號.對于請求延后完成的情況,NIO針對小I/O的惰性輪詢設計仍能起作用,但惰性輪詢的睡眠時間相比于無亂序場景是次優的.

針對I/O亂序問題,利用白盒、灰盒存儲或機器學習技術,NIO能在將來被進一步優化.在白盒和灰盒存儲例如開放通道固態存儲中,主機端軟件能控制I/O調度,使得I/O完成時間能被更準確地預測,如文獻[16,25]所述.在黑盒存儲例如商用的標準NVMe SSD中,已有工作[26]利用機器學習模型預測I/O請求的完成時間,此類技術也可用于確定NIO的睡眠等待時間.

7 結 論

高性能固態存儲I/O處理速率越來越快,其單個I/O的延遲已低于10 μs.因此,構建低延遲存儲引擎具有重要意義.本文提出一種低CPU開銷的低延遲存儲引擎NIO.通過將大小I/O路徑分離并提出事務感知的I/O收割和動態調整機制,NIO以低CPU開銷快速探測并處理存儲設備完成I/O請求的信號.實驗顯示,相比于傳統的基于中斷或輪詢的存儲引擎,NIO能取得與輪詢接近的延遲并大幅降低CPU占用率.

作者貢獻聲明:廖曉堅進行了該論文相關實驗設計、編碼及測試、論文撰寫等工作;楊者進行了前期實驗方案的討論設計與論文修改;楊洪章進行了論文結構討論和修改;屠要峰進行了實驗補充設計討論及論文修改;舒繼武進行了論文修改以及新型固態并發亂序研究討論.

猜你喜歡
存儲系統收割機固態
PCle 4.0平臺的性價比之選!WD_BLACK SN770固態硬盤
巧克力,不只好吃這么簡單
收割機
收割機維修與保養的方法研究
天河超算存儲系統在美創佳績
面向4K/8K的到來 存儲該怎么辦?
聯合收割機常見故障排除
英特爾發布采用3D NAND技術的數據中心級固態盤
未來的收割機
漫談Windows?。穼虘B硬盤的優化
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合