• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      低CPU開(kāi)銷的低延遲存儲(chǔ)引擎

      2022-03-09 05:50:10廖曉堅(jiān)楊洪章屠要峰舒繼武
      關(guān)鍵詞:輪詢存儲(chǔ)系統(tǒng)收割機(jī)

      廖曉堅(jiān) 楊 者 楊洪章 屠要峰 舒繼武

      1(清華大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)系 北京 100084)

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

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

      主機(jī)端存儲(chǔ)系統(tǒng)的延遲主要分為3個(gè)部分:系統(tǒng)調(diào)用延遲、系統(tǒng)軟件延遲例如文件系統(tǒng)層和塊設(shè)備層延遲,以及I/O收割延遲.已有工作通過(guò)在用戶態(tài)實(shí)現(xiàn)存儲(chǔ)系統(tǒng)以及簡(jiǎn)化或繞開(kāi)塊設(shè)備層,以優(yōu)化系統(tǒng)調(diào)用和系統(tǒng)軟件延遲.伴隨著硬件性能提升以及這些軟件優(yōu)化,I/O收割延遲高以及抖動(dòng)的問(wèn)題逐漸凸顯.本文主要關(guān)注I/O收割延遲.

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

      為了解決上述I/O延遲高和CPU開(kāi)銷大的問(wèn)題,本文提出一種低CPU開(kāi)銷的低延遲存儲(chǔ)引擎NIO(nimble I/O).NIO的核心思想是動(dòng)態(tài)地混合使用中斷和輪詢機(jī)制,從而以低CPU開(kāi)銷取得較低的I/O延遲.NIO的主要架構(gòu)是將“大”“小”I/O的處理路徑分離:對(duì)于大I/O采用中斷機(jī)制,因?yàn)樵诖祟惽闆r下I/O的傳輸和硬件處理時(shí)間占比較重,中斷和輪詢的延遲無(wú)顯著差別;對(duì)于小I/O使用惰性輪詢機(jī)制,先讓CPU睡眠一段時(shí)間再持續(xù)輪詢,以此來(lái)減少持續(xù)輪詢帶來(lái)的巨大CPU開(kāi)銷.在該架構(gòu)之上,NIO設(shè)計(jì)和實(shí)現(xiàn)了事務(wù)感知的I/O收割機(jī)制,即以一個(gè)事務(wù)(一組需要同時(shí)完成的I/O請(qǐng)求)為單位判斷請(qǐng)求大小,因?yàn)橐粋€(gè)事務(wù)的完成時(shí)間取決于最慢的I/O.此外,為了應(yīng)對(duì)應(yīng)用負(fù)載以及存儲(chǔ)設(shè)備內(nèi)部活動(dòng)的變化,NIO提出了動(dòng)態(tài)調(diào)整機(jī)制,在不影響現(xiàn)有NVMe[3]存儲(chǔ)系統(tǒng)高并發(fā)和低延遲的前提下,動(dòng)態(tài)調(diào)整小I/O的睡眠等待時(shí)間.

      本文工作的主要貢獻(xiàn)包括3個(gè)方面:

      1) 提出了大小I/O處理路徑分離的存儲(chǔ)架構(gòu)NIO,對(duì)不同的路徑采用不同的I/O收割機(jī)制,以同時(shí)優(yōu)化CPU占用率和I/O延遲.

      2) 提出了事務(wù)感知的I/O收割機(jī)制和動(dòng)態(tài)調(diào)整機(jī)制,以應(yīng)對(duì)應(yīng)用負(fù)載和存儲(chǔ)設(shè)備內(nèi)部活動(dòng)的變化.

      3) 在Linux內(nèi)核中實(shí)現(xiàn)了NIO和以上機(jī)制,動(dòng)態(tài)負(fù)載測(cè)試顯示,NIO與基于輪詢的存儲(chǔ)引擎性能相當(dāng),并能減少至少59%的CPU占用率.

      1 背景介紹與研究動(dòng)機(jī)

      本節(jié)主要介紹現(xiàn)有高性能固態(tài)存儲(chǔ)及其軟件存儲(chǔ)系統(tǒng)的相關(guān)背景,并分析現(xiàn)有中斷和輪詢機(jī)制.

      1.1 高性能固態(tài)存儲(chǔ)

      固態(tài)存儲(chǔ)是一種新型的非易失存儲(chǔ).不同于磁頭式結(jié)構(gòu)的傳統(tǒng)磁盤存儲(chǔ),固態(tài)存儲(chǔ)內(nèi)部為電子式結(jié)構(gòu),因此能提供更高的硬件帶寬和更低的讀寫延遲.

      早期的固態(tài)存儲(chǔ)直接兼容傳統(tǒng)的硬盤接口和協(xié)議如SATA.然而,傳統(tǒng)的磁盤接口和協(xié)議帶寬受限,存儲(chǔ)協(xié)議開(kāi)銷大,使得系統(tǒng)軟件難以發(fā)揮固態(tài)存儲(chǔ)高帶寬和低延遲的優(yōu)勢(shì).因此,一種新型的針對(duì)高性能固態(tài)存儲(chǔ)設(shè)計(jì)的存儲(chǔ)協(xié)議NVMe[3]被提出并廣泛應(yīng)用于固態(tài)存儲(chǔ).相比于傳統(tǒng)的SATA協(xié)議,NVMe協(xié)議顯著地降低了處理1個(gè)I/O所需要的CPU指令.同時(shí),NVMe提供多硬件隊(duì)列抽象,在現(xiàn)代多CPU的計(jì)算機(jī)上具有更好的多核擴(kuò)展性,從而降低核間競(jìng)爭(zhēng)和同步機(jī)制帶來(lái)的額外延遲.以上優(yōu)勢(shì)使得基于NVMe的存儲(chǔ)設(shè)備能提供更低的延遲.

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

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

      1.2 I/O收割機(jī)制——中斷和輪詢機(jī)制

      固態(tài)存儲(chǔ)越來(lái)越低及越來(lái)越平穩(wěn)的延遲,促使系統(tǒng)軟件設(shè)計(jì)者重新思考存儲(chǔ)軟件的設(shè)計(jì).其中,如何提供高效的I/O收割機(jī)制,即以低開(kāi)銷快速探測(cè)并處理存儲(chǔ)設(shè)備完成I/O請(qǐng)求的信號(hào),成為系統(tǒng)軟件關(guān)注的熱點(diǎn)問(wèn)題[2-6].本節(jié)將具體介紹硬件中斷和輪詢2種廣泛應(yīng)用于存儲(chǔ)系統(tǒng)的I/O收割機(jī)制,并分析它們的優(yōu)劣.

      硬件中斷機(jī)制依賴硬件發(fā)出完成信號(hào),由CPU暫停正在執(zhí)行的任務(wù),將原先的I/O處理任務(wù)調(diào)度回CPU執(zhí)行,以完成I/O處理的最后階段,如通知應(yīng)用程序.中斷機(jī)制在主機(jī)端CPU不繁忙時(shí),會(huì)因?yàn)槿蝿?wù)上下文切換或CPU運(yùn)行模式切換引入1 μs左右的延遲;在主機(jī)端CPU繁忙時(shí),CPU任務(wù)調(diào)度和緩存失效等使得中斷機(jī)制帶來(lái)的延遲變得更加不可預(yù)測(cè).中斷開(kāi)銷在高性能固態(tài)存儲(chǔ)上顯得愈發(fā)嚴(yán)重.

      為此,部分系統(tǒng)如SPDK[2]提供了輪詢機(jī)制以消除中斷開(kāi)銷.輪詢機(jī)制使得I/O任務(wù)所在CPU無(wú)休止地查看完成信號(hào).這種極端的I/O收割機(jī)制能縮減I/O延遲,卻需要付出100%的CPU開(kāi)銷.如表2所示,對(duì)于現(xiàn)代一塊超低延遲的固態(tài)存儲(chǔ)盤,輪詢的延遲低于中斷延遲,尤其是I/O請(qǐng)求大小較小時(shí).然而,隨著I/O請(qǐng)求變大,輪詢帶來(lái)的I/O延遲低的優(yōu)勢(shì)逐漸變得不明顯.這是因?yàn)榇驣/O請(qǐng)求的硬件處理時(shí)間明顯高于I/O收割延遲,使得中斷的上下文開(kāi)銷變得不明顯.另一方面,隨著I/O請(qǐng)求變大,中斷的CPU開(kāi)銷越來(lái)越低,而輪詢卻需要獨(dú)占CPU.

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

      通過(guò)分析,我們發(fā)現(xiàn)輪詢機(jī)制在I/O請(qǐng)求較小時(shí)延遲低的優(yōu)勢(shì)明顯;在I/O請(qǐng)求較大時(shí),中斷機(jī)制CPU開(kāi)銷低的優(yōu)勢(shì)顯著,延遲與輪詢機(jī)制相當(dāng).

      2 NIO設(shè)計(jì)

      本文提出一種低CPU開(kāi)銷的低延遲存儲(chǔ)引擎NIO,旨在提供與輪詢接近的低延遲,同時(shí)降低I/O收割過(guò)程中的CPU占用率.

      Fig. 1 Overall architecture of NIO圖1 NIO的整體架構(gòu)圖

      2.1 NIO架構(gòu)

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

      算法1.NIO處理I/O請(qǐng)求算法.

      輸入:發(fā)送到存儲(chǔ)設(shè)備端的I/O請(qǐng)求bio,I/O大小io_size;

      輸出:函數(shù)返回值void.

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

      ② ifio_size

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

      ③sleep(INTERVAL);

      /*讓出CPU,INTERVAL為小I/O睡眠時(shí)間*/

      ④wake_up()并輪詢;

      /*被高精度定時(shí)器hrtimer喚醒并進(jìn)入輪詢*/

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

      ⑥io_schedule()并等待中斷;

      /*讓出CPU并等待中斷信號(hào)*/

      ⑦ end if

      NIO的架構(gòu)面臨著2個(gè)基本問(wèn)題:如何區(qū)分大小I/O以及如何確定惰性輪詢的睡眠等待時(shí)間.

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

      NIO通過(guò)系統(tǒng)靜態(tài)預(yù)設(shè)和動(dòng)態(tài)調(diào)整的方法,為每一種規(guī)整大小的小讀和小寫請(qǐng)求都設(shè)定一個(gè)睡眠閾值.NIO靜態(tài)睡眠閾值綜合考慮了I/O的平均延遲、延遲抖動(dòng)以及睡眠開(kāi)銷,其確定式為

      Tstatic=Tavg-Tstdev-Tsleep,

      (1)

      其中,Tavg為輪詢?cè)擃愋驮摯笮/O的平均延遲,例如表2中的第3列輪詢延遲.Tstdev為該類型該大小I/O耗時(shí)的標(biāo)準(zhǔn)差.式(1)之所以減去標(biāo)準(zhǔn)差,是為了緩解I/O延遲抖動(dòng)帶來(lái)的影響.最后,靜態(tài)睡眠時(shí)間Tstatic還除去了睡眠機(jī)制帶來(lái)的開(kāi)銷Tsleep,如睡眠前后的上下文切換.睡眠開(kāi)銷可動(dòng)態(tài)配置,在NIO中為1 μs.

      以上NIO的基本架構(gòu)涵蓋了I/O收割過(guò)程中的靜態(tài)屬性.然而,如何應(yīng)對(duì)上層應(yīng)用以及底層存儲(chǔ)設(shè)備的動(dòng)態(tài)變化依然存在難題.因此,NIO提出事務(wù)感知的I/O收割機(jī)制和動(dòng)態(tài)調(diào)整機(jī)制.

      2.2 事務(wù)感知的I/O收割機(jī)制

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

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

      事務(wù)感知的I/O收割機(jī)制還面臨2個(gè)問(wèn)題:1)上層系統(tǒng)如何傳達(dá)事務(wù)語(yǔ)義給NIO;2)事務(wù)內(nèi)部的請(qǐng)求依賴在NIO架構(gòu)下如何處理.

      上層系統(tǒng)或應(yīng)用需要顯示地指定某些I/O屬于同一個(gè)事務(wù).事務(wù)指定方式可以通過(guò)為I/O請(qǐng)求標(biāo)上同一個(gè)事務(wù)ID(identity)或者通過(guò)同一個(gè)系統(tǒng)調(diào)用實(shí)現(xiàn).在NIO的具體實(shí)現(xiàn)中,我們通過(guò)后者,即同一個(gè)系統(tǒng)調(diào)用,傳達(dá)事務(wù)語(yǔ)義.NIO通過(guò)矢量化的I/O系統(tǒng)調(diào)用pvsync2,實(shí)現(xiàn)事務(wù)感知的I/O收割機(jī)制.應(yīng)用程序可以通過(guò)pvsync2指定多個(gè)不連續(xù)的I/O請(qǐng)求,并將這些I/O請(qǐng)求標(biāo)記為高優(yōu)先級(jí)(例如攜帶RWF_HIPRI標(biāo)志),以觸發(fā)NIO的事務(wù)感知的I/O收割機(jī)制.

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

      2.3 動(dòng)態(tài)調(diào)整機(jī)制

      現(xiàn)代的存儲(chǔ)設(shè)備一般具有多個(gè)硬件隊(duì)列,且1個(gè)硬件隊(duì)列可同時(shí)處理多個(gè)I/O請(qǐng)求.所以,一個(gè)I/O預(yù)期的完成時(shí)間不僅僅取決于存儲(chǔ)系統(tǒng)中的靜態(tài)因素(即式(1)),也受到其他硬件隊(duì)列以及本隊(duì)列上I/O的影響.為了應(yīng)對(duì)上述問(wèn)題,NIO提出動(dòng)態(tài)調(diào)整機(jī)制,在保留現(xiàn)有NVMe存儲(chǔ)系統(tǒng)高并發(fā)低延遲的特點(diǎn)前提下,動(dòng)態(tài)調(diào)整小I/O處理的睡眠時(shí)間.

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

      Toverall=Tstatic+Tdynamic.

      (2)

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

      排隊(duì)時(shí)間在每一次I/O請(qǐng)求完成時(shí)動(dòng)態(tài)更新.排隊(duì)時(shí)間為當(dāng)前隊(duì)列當(dāng)前I/O前N個(gè)I/O請(qǐng)求等待時(shí)間的算數(shù)平均數(shù):

      (3)

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

      (4)

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

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

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

      (5)

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

      3 NIO實(shí)現(xiàn)

      本工作通過(guò)修改Linux 4.18.20內(nèi)核中的多隊(duì)列塊設(shè)備層(blk-mq)實(shí)現(xiàn)了NIO.

      Fig. 2 The implementation of NIO圖2 NIO的實(shí)現(xiàn)

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

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

      4 實(shí) 驗(yàn)

      本節(jié)將通過(guò)實(shí)驗(yàn)對(duì)比和分析NIO與現(xiàn)有系統(tǒng)的性能差異.首先,通過(guò)對(duì)比NIO與現(xiàn)有系統(tǒng)在不同I/O大小下的性能表現(xiàn)和CPU占用率驗(yàn)證NIO的架構(gòu)和整體設(shè)計(jì).其次,通過(guò)對(duì)比測(cè)試事務(wù)處理下的性能驗(yàn)證事務(wù)感知的I/O收割機(jī)制.最后,通過(guò)動(dòng)態(tài)負(fù)載,分析和驗(yàn)證動(dòng)態(tài)調(diào)整機(jī)制.

      4.1 實(shí)驗(yàn)平臺(tái)和方法

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

      Table 4 NIO Parameters

      本實(shí)驗(yàn)將NIO與基于中斷機(jī)制和輪詢機(jī)制的Linux NVMe存儲(chǔ)系統(tǒng)對(duì)比.本實(shí)驗(yàn)使用性能測(cè)試工具FIO對(duì)整塊存儲(chǔ)設(shè)備區(qū)域進(jìn)行讀寫.為了測(cè)試公平,所有測(cè)試均使用pvsync2接口發(fā)送I/O請(qǐng)求,以控制存儲(chǔ)系統(tǒng)其他部分的影響.整個(gè)測(cè)試過(guò)程開(kāi)啟O_DIRECT標(biāo)志,以繞開(kāi)操作系統(tǒng)緩存直接對(duì)設(shè)備讀寫.如無(wú)特別說(shuō)明,測(cè)試的數(shù)據(jù)量為整個(gè)盤的大小.

      4.2 基準(zhǔn)測(cè)試

      本節(jié)測(cè)試啟動(dòng)單個(gè)線程持續(xù)發(fā)送各種大小的I/O.測(cè)試過(guò)程中io_depth被設(shè)置為1.表5顯示了測(cè)試結(jié)果.I/O大小>64 KB的結(jié)果未顯示,是由于在這之后3個(gè)對(duì)比系統(tǒng)的性能無(wú)明顯差異.從表5中可知,綜合各I/O大小的平均值,NIO的平均延遲為中斷的92.9%,為輪詢的103.6%.這是因?yàn)閷?duì)于小I/O,NIO使用了惰性輪詢機(jī)制,使得絕大部分I/O能消除中斷帶來(lái)的上下文開(kāi)銷.進(jìn)一步分析發(fā)現(xiàn),對(duì)于少部分快速完成的I/O,NIO睡眠時(shí)間過(guò)長(zhǎng)導(dǎo)致總體平均延遲比輪詢I/O的平均延遲高.

      Table 5 Microbenchmark Results (Random Read)

      NIO也能提供更穩(wěn)定的延遲,其延遲標(biāo)準(zhǔn)差為中斷的86.6%,為輪詢的98.8%.相比于中斷,NIO需要額外7%的CPU占用.此外,相比于輪詢,NIO在優(yōu)化I/O延遲的同時(shí)能極大地降低系統(tǒng)的CPU占用率.這是因?yàn)橄啾扔跇O端的輪詢,NIO會(huì)主動(dòng)讓出CPU進(jìn)入睡眠狀態(tài),降低CPU占用率的同時(shí)保留當(dāng)前程序的可用時(shí)間片,從而降低下次CPU周期調(diào)度(10 ms 1次)將該任務(wù)調(diào)度出去的概率.

      4.3 事務(wù)處理測(cè)試

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

      Table 6 Results of Transaction Performance

      4.4 動(dòng)態(tài)負(fù)載測(cè)試

      本節(jié)實(shí)驗(yàn)通過(guò)動(dòng)態(tài)變化測(cè)試過(guò)程中的I/O大小、I/O線程以測(cè)試NIO的動(dòng)態(tài)調(diào)整機(jī)制.實(shí)驗(yàn)過(guò)程分為3個(gè)階段,以分別模擬系統(tǒng)在頻繁小I/O、頻繁大I/O以及高并發(fā)情況下的場(chǎng)景以及這些場(chǎng)景間的切換.每個(gè)階段向測(cè)試設(shè)備上隨機(jī)寫入20 GB的數(shù)據(jù).

      階段1,F(xiàn)IO啟動(dòng)2個(gè)進(jìn)程隨機(jī)寫入I/O大小在4~8 KB的數(shù)據(jù);階段2,測(cè)試進(jìn)程增加為4個(gè),隨機(jī)寫入128 KB~1 MB的數(shù)據(jù);階段3,進(jìn)程數(shù)量進(jìn)一步增加至13個(gè),并向設(shè)備寫入4~8 KB的數(shù)據(jù).測(cè)試結(jié)果如表7所示.從表7可知,寫入等量數(shù)據(jù)時(shí),NIO幾乎能和輪詢同時(shí)間完成,比最慢的中斷時(shí)間縮短約5%.

      Table 7 Results of Dynamic Workloads

      本實(shí)驗(yàn)進(jìn)一步分析了測(cè)試過(guò)程中各階段的平均延遲、歸一化到輪詢的延遲標(biāo)準(zhǔn)差和CPU占用率.在3個(gè)階段,NIO的延遲標(biāo)準(zhǔn)差分別為中斷的7%,100%,9%,為輪詢的105%,143%,142%;NIO的平均CPU占用率分別為中斷的125%,110%,110%,為輪詢的41%,7%,21%.可以看出,NIO在高并發(fā)小I/O場(chǎng)景下(即第3階段)表現(xiàn)尤其優(yōu)異.高并發(fā)小I/O場(chǎng)景不僅考察存儲(chǔ)系統(tǒng)的I/O處理能力,也考驗(yàn)CPU利用效率;NIO能以更小的CPU代價(jià)獲取較低的I/O延遲,故NIO在CPU競(jìng)爭(zhēng)的頻繁小I/O場(chǎng)景下優(yōu)于中斷和輪詢.

      5 相關(guān)工作

      本節(jié)將從I/O收割機(jī)制及低延遲存儲(chǔ)系統(tǒng)2個(gè)方面介紹相關(guān)工作.

      1) I/O收割機(jī)制.傳統(tǒng)存儲(chǔ)系統(tǒng)通過(guò)中斷收割I(lǐng)/O,然而會(huì)引入額外的上下文切換開(kāi)銷.因此,某些存儲(chǔ)系統(tǒng)[2-4]使用輪詢?nèi)〈袛嘁韵舷挛那袚Q,從而獲取低延遲.Linux內(nèi)核進(jìn)一步提出了混合輪詢機(jī)制[9](hybrid polling)以降低輪詢帶來(lái)的CPU開(kāi)銷.混合輪詢與本文提出的惰性輪詢類似,都是先讓線程睡眠等待一段時(shí)間再持續(xù)輪詢.不同之處在于:①混合輪詢不區(qū)分大小I/O均使用同種輪詢策略,使得大I/O的收割效率低下.②混合輪詢不區(qū)分讀寫、不區(qū)分I/O大小,均使用同一睡眠時(shí)間,使得小I/O可能受大I/O的影響睡眠過(guò)長(zhǎng)而效率低下.③混合輪詢?cè)谟?jì)算睡眠時(shí)間時(shí),采用的是自機(jī)器啟動(dòng)以來(lái)所有I/O的平均完成時(shí)間的一半;這種方法會(huì)導(dǎo)致睡眠時(shí)間的不準(zhǔn)確以及破壞NVMe存儲(chǔ)系統(tǒng)的并行性.④混合輪詢無(wú)法動(dòng)態(tài)調(diào)整.以上混合輪詢的種種局限使得其默認(rèn)在Linux內(nèi)核中被禁用;本文提出的NIO可能是內(nèi)核中混合輪詢的一種更高效的替代系統(tǒng).cinterrupt[6]動(dòng)態(tài)地合并中斷請(qǐng)求,從而減少主機(jī)端CPU占用.cinterrupt的設(shè)計(jì)和本文的NIO互補(bǔ),能共同促進(jìn)高效的I/O收割機(jī)制.

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

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

      6 討 論

      高性能固態(tài)存儲(chǔ)支持較大的并發(fā),且硬件控制器可能會(huì)對(duì)并發(fā)I/O進(jìn)行調(diào)度,導(dǎo)致I/O亂序執(zhí)行,從而影響NIO的優(yōu)化效果.I/O亂序會(huì)導(dǎo)致2種結(jié)果:請(qǐng)求提前完成和請(qǐng)求延后完成.對(duì)于請(qǐng)求提前完成的情況,NIO針對(duì)小I/O的惰性輪詢?cè)O(shè)計(jì)可能失效.但由于NIO保留了中斷機(jī)制,NIO仍能準(zhǔn)時(shí)捕獲I/O完成的信號(hào).對(duì)于請(qǐng)求延后完成的情況,NIO針對(duì)小I/O的惰性輪詢?cè)O(shè)計(jì)仍能起作用,但惰性輪詢的睡眠時(shí)間相比于無(wú)亂序場(chǎng)景是次優(yōu)的.

      針對(duì)I/O亂序問(wèn)題,利用白盒、灰盒存儲(chǔ)或機(jī)器學(xué)習(xí)技術(shù),NIO能在將來(lái)被進(jìn)一步優(yōu)化.在白盒和灰盒存儲(chǔ)例如開(kāi)放通道固態(tài)存儲(chǔ)中,主機(jī)端軟件能控制I/O調(diào)度,使得I/O完成時(shí)間能被更準(zhǔn)確地預(yù)測(cè),如文獻(xiàn)[16,25]所述.在黑盒存儲(chǔ)例如商用的標(biāo)準(zhǔn)NVMe SSD中,已有工作[26]利用機(jī)器學(xué)習(xí)模型預(yù)測(cè)I/O請(qǐng)求的完成時(shí)間,此類技術(shù)也可用于確定NIO的睡眠等待時(shí)間.

      7 結(jié) 論

      高性能固態(tài)存儲(chǔ)I/O處理速率越來(lái)越快,其單個(gè)I/O的延遲已低于10 μs.因此,構(gòu)建低延遲存儲(chǔ)引擎具有重要意義.本文提出一種低CPU開(kāi)銷的低延遲存儲(chǔ)引擎NIO.通過(guò)將大小I/O路徑分離并提出事務(wù)感知的I/O收割和動(dòng)態(tài)調(diào)整機(jī)制,NIO以低CPU開(kāi)銷快速探測(cè)并處理存儲(chǔ)設(shè)備完成I/O請(qǐng)求的信號(hào).實(shí)驗(yàn)顯示,相比于傳統(tǒng)的基于中斷或輪詢的存儲(chǔ)引擎,NIO能取得與輪詢接近的延遲并大幅降低CPU占用率.

      作者貢獻(xiàn)聲明:廖曉堅(jiān)進(jìn)行了該論文相關(guān)實(shí)驗(yàn)設(shè)計(jì)、編碼及測(cè)試、論文撰寫等工作;楊者進(jìn)行了前期實(shí)驗(yàn)方案的討論設(shè)計(jì)與論文修改;楊洪章進(jìn)行了論文結(jié)構(gòu)討論和修改;屠要峰進(jìn)行了實(shí)驗(yàn)補(bǔ)充設(shè)計(jì)討論及論文修改;舒繼武進(jìn)行了論文修改以及新型固態(tài)并發(fā)亂序研究討論.

      猜你喜歡
      輪詢存儲(chǔ)系統(tǒng)收割機(jī)
      用履帶收割機(jī)送柴油
      分布式存儲(chǔ)系統(tǒng)在企業(yè)檔案管理中的應(yīng)用
      哈爾濱軸承(2020年2期)2020-11-06 09:22:36
      自走式油葵收割機(jī)研發(fā)成功
      天河超算存儲(chǔ)系統(tǒng)在美創(chuàng)佳績(jī)
      基于等概率的ASON業(yè)務(wù)授權(quán)設(shè)計(jì)?
      未來(lái)的收割機(jī)
      麥?zhǔn)諘r(shí)如何進(jìn)行聯(lián)合收割機(jī)跨區(qū)作業(yè)
      依托站點(diǎn)狀態(tài)的兩級(jí)輪詢控制系統(tǒng)時(shí)延特性分析
      利用時(shí)間輪詢方式操作DDR3實(shí)現(xiàn)多模式下數(shù)據(jù)重排
      華為震撼發(fā)布新一代OceanStor 18000 V3系列高端存儲(chǔ)系統(tǒng)
      朝阳市| 南昌市| 彭州市| 永昌县| 慈利县| 西林县| 巴彦淖尔市| 定结县| 龙泉市| 三台县| 武安市| 山东省| 石渠县| 繁峙县| 南康市| 灵山县| 山阳县| 教育| 化隆| 新邵县| 南川市| 昭通市| 建水县| 陕西省| 灵寿县| 阿克苏市| 南和县| 嘉荫县| 阿尔山市| 买车| 利辛县| 建宁县| 高安市| 凌源市| 通山县| 临安市| 屏边| 昌宁县| 独山县| 余江县| 石台县|