亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向存儲網(wǎng)絡(luò)的融合I/O模擬器設(shè)計與實現(xiàn)①

        2020-11-06 00:46:02黎斐南霍志剛孫凝暉
        高技術(shù)通訊 2020年10期
        關(guān)鍵詞:存儲設(shè)備模擬器隊列

        魏 征 黎斐南 邢 晶 霍志剛 孫凝暉

        (*中國科學(xué)院大學(xué) 北京 100089)(**計算機體系結(jié)構(gòu)國家重點實驗室 北京 100089)(***中國科學(xué)院計算技術(shù)研究所 北京 100089)

        0 引 言

        存儲設(shè)備在過去很長一段時間都被視為高延遲的慢速設(shè)備,隨著新材料和設(shè)備的研制,存儲設(shè)備的性能有了很大改善,I/O延遲大大下降。然而目前的大部分軟硬件的設(shè)計還是建立在慢速設(shè)備的假設(shè)上,這種設(shè)計無法充分發(fā)揮新式存儲設(shè)備的性能,因而仍存在讀寫延遲高的問題。

        機械硬盤(hard disk drive, HDD)[1]作為主要的廉價存儲設(shè)備,從最初的3.75 MB到現(xiàn)在的14 TB,HDD的容量增加了373萬倍。但是,HDD的訪問延遲從600 ms下降到了2 ms,只減少到了原來的1/300。HDD數(shù)據(jù)存儲在盤片上,受機械結(jié)構(gòu)的限制,碟片的旋轉(zhuǎn)速度不能無限提高。HDD的平均延遲基本都是毫秒級的。固態(tài)硬盤(solid state drive, SSD)使用集成電路作為存儲介質(zhì),受益于半導(dǎo)體工藝的發(fā)展,延遲可以達到微秒的量級[2]?,F(xiàn)在的NVMe SSD可以達到幾十微秒的延遲?;?D XPoint材料的存儲設(shè)備擁有更低的延遲,填補了SSD和內(nèi)存之間的差距,其延遲達到微秒級[2]。

        傳統(tǒng)的跨節(jié)點數(shù)據(jù)通路中,數(shù)據(jù)傳輸都要經(jīng)過內(nèi)存。數(shù)據(jù)一開始在遠程主機的內(nèi)存中,中央處理器(central processing unit, CPU)設(shè)置網(wǎng)絡(luò)接口控制器(network interface controller, NIC)的直接存儲器訪問(direct memory access, DMA),由DMA把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。本地的NIC從網(wǎng)絡(luò)收到數(shù)據(jù),數(shù)據(jù)經(jīng)過DMA的搬運,保存到內(nèi)存中。然后CPU再控制存儲設(shè)備的DMA,把數(shù)據(jù)寫入本地的存儲設(shè)備。隨著存儲技術(shù)的發(fā)展,存儲設(shè)備的延遲已經(jīng)從原來的毫秒級變?yōu)榱爽F(xiàn)在的微秒級,數(shù)據(jù)在數(shù)據(jù)通路上延遲在整個傳輸延遲中的占比會大大增加,原來的傳輸路徑可能會導(dǎo)致額外的傳輸開銷。

        NoR技術(shù)(NVMe over RDMA)[3]通過改變傳統(tǒng)的數(shù)據(jù)傳輸通路優(yōu)化延遲。本地網(wǎng)卡從遠程主機接收到的數(shù)據(jù)不再寫入內(nèi)存,直接通過PCIe[4]總線寫入本地的PCIe SSD。通信路徑的改變使得傳輸延遲從12 μs縮減到了7 μs??s短后的通信路徑繞過了CPU,但也失去了對數(shù)據(jù)的處理能力。數(shù)據(jù)直接寫入存儲只能滿足應(yīng)用,很多其他應(yīng)用都需要對數(shù)據(jù)進行一些處理,NoR技術(shù)即使是很簡單的處理都無法完成。而且,只有存儲設(shè)備是非易失性隨機訪問存儲器(non-volatile random access memory, NVRAM)或隨機存取存儲器(random access memory, RAM)時,遠程直接數(shù)據(jù)存取(remote direct memory access, RDMA)網(wǎng)卡才能直接給存儲設(shè)備寫入數(shù)據(jù)。NVRAM存儲設(shè)備雖然擁有接近RAM的性能,同時造價成本也很高,而性價比較高的且真正大量使用的SSD采用的是NAND Flash介質(zhì),屬于塊設(shè)備,無法通過RDMA協(xié)議直接寫入數(shù)據(jù)。如果希望能寫入塊設(shè)備,那么數(shù)據(jù)就需要經(jīng)過閃存轉(zhuǎn)換層(flash translation layer, FTL)的處理。

        由于機械硬盤的高性價比,目前依然作為主流的存儲設(shè)備使用。然而機械硬盤的隨機延遲很高,為了充分發(fā)揮機械硬盤的性能,將隨機讀寫組織成順序讀寫作為主要優(yōu)化方式。但是大數(shù)據(jù)的數(shù)據(jù)形式多樣,數(shù)據(jù)的組織有可能很復(fù)雜,難以組織成順序的讀寫。RAMCloud[5](內(nèi)存云存儲)把大數(shù)據(jù)應(yīng)用所需求的數(shù)據(jù)全部存放在內(nèi)存中,完全可以滿足大數(shù)據(jù)分析的需求。但是RAMCloud的成本高昂,且由于持久化問題,還需要額外的成本和機制用于保障可靠性。機械硬盤和RAMCloud之間的性能和成本落差太大,SSD具有介于內(nèi)存和機械硬盤之間的性能和成本。隨著3D XPoint技術(shù)的推出,SSD擁有更高的存儲密度和對隨機高并發(fā)的支持。如果SSD的性能可以滿足大數(shù)據(jù)分析的要求,可以有遠小于RAMCloud的成本以及集群規(guī)模。

        NoSQL數(shù)據(jù)庫在大數(shù)據(jù)應(yīng)用中有著很重要的地位,根據(jù)用戶需求,弱化了SQL數(shù)據(jù)庫的一些要求以滿足大數(shù)據(jù)應(yīng)用的場景。key-value存儲是NoSQL數(shù)據(jù)庫的一種典型案例,只保存最簡單的key和value之間的映射。Redis[6]和Amazon的Dynamo[7]都是key-value存儲系統(tǒng)的著名實例。本文的另一個重點就是嘗試將SSD應(yīng)用于大數(shù)據(jù)應(yīng)用,為大數(shù)據(jù)應(yīng)用提供一種存儲解決方案。

        本文設(shè)計了面向網(wǎng)絡(luò)與存儲的融合設(shè)備模型用戶級融合I/O(unity I/O in user space, UIO),并加入輔助計算功能擴展其適用場景。本文的主要工作和貢獻包括:

        (1) 提出了一種融合存儲和網(wǎng)絡(luò)功能的UIO設(shè)備模型。UIO設(shè)備在同一種設(shè)備中融合了存儲和網(wǎng)絡(luò)功能,通過讓多個功能模塊共享設(shè)備中的內(nèi)存和數(shù)據(jù)通路以簡化數(shù)據(jù)的傳輸路徑,降低數(shù)據(jù)的傳輸延遲。

        (2) 設(shè)計了基于UIO設(shè)備模型的輔助計算模塊。通過在設(shè)備中加入輔助計算功能實現(xiàn)數(shù)據(jù)處理,并把輔助計算模塊分為處理設(shè)備間數(shù)據(jù)分布和存儲介質(zhì)格式轉(zhuǎn)換2個部分。通過與可編程硬件的結(jié)合,可以讓用戶定制輔助計算模塊,提高UIO設(shè)備的處理效率,擴展其應(yīng)用場景。

        (3) 實現(xiàn)了與key-value存儲系統(tǒng)相結(jié)合的UIO設(shè)備模擬器。參照key-value存儲系統(tǒng)設(shè)計了UTL和GME等各個模塊,讓用戶可以通過put、get指令操作設(shè)備。在最終測試中與傳統(tǒng)數(shù)據(jù)通路相比,遠程put減少8.2%延遲,遠程get減少11%延遲,本地put增加0.9%延遲,本地get增加2.7%延遲的效果。

        1 相關(guān)研究

        1.1 相關(guān)硬件技術(shù)

        隨著硬件技術(shù)的發(fā)展,已經(jīng)有了高速低延遲的存儲設(shè)備NVMe SSD。這種具有低延遲特性的存儲設(shè)備的出現(xiàn),使得傳統(tǒng)的硬件結(jié)構(gòu)不再適合所有場景,反而成為了系統(tǒng)性能進步提升的瓶頸。

        1.1.1 SSD

        SSD使用半導(dǎo)體作為存儲介質(zhì),包括DRAM、NOR Flash、NAND Flash等?,F(xiàn)在比較常用的是NAND Flash作為存儲介質(zhì)的SSD。NAND Flash的數(shù)據(jù)由浮柵單元存儲,每個單元根據(jù)存儲介質(zhì)的不同(SLC, MLC, TLC)可以存儲1、2或3個bits。由浮柵單元組成邏輯頁,邏輯頁組成邏輯塊。一個頁由4 kB數(shù)據(jù)存儲空間和128BECC校驗數(shù)據(jù)的存儲空間組成,64個頁又組成了一個塊。頁是NAND Flash中最小的讀寫尋址單元,塊是NANDFlash中最小的可擦除單元??梢噪S意讀取頁中的數(shù)據(jù)或者向空白的頁寫入數(shù)據(jù),但是不能改寫已經(jīng)寫入頁中的數(shù)據(jù),如果改寫需要將整個塊的數(shù)據(jù)擦除,然后才能重新寫入新的數(shù)據(jù)。

        NAND Flash[8]的這種讀寫機制導(dǎo)致其讀寫接口不能使用常見的讀(Read)和寫(Write)接口,在讀、寫之外還需要加入擦除(Erase)功能。在Flash和傳統(tǒng)接口之間需要添加一個轉(zhuǎn)換層FTL[9,10],位于SSD的Host Interface和NAND Interface之間,負責(zé)2種接口之間的轉(zhuǎn)換。FTL主要負責(zé)的功能有地址映射、磨損均衡、垃圾回收、壞塊管理等。地址映射為主機使用邏輯地址定位數(shù)據(jù),由FTL完成從邏輯地址到物理地址的映射。當數(shù)據(jù)修改時,把數(shù)據(jù)寫到一個新的頁上并修改FTL中記錄的地址映射,以避免多余的數(shù)據(jù)讀寫。磨損均衡為Flash中每個存儲單元的可寫入次數(shù)是有限的,為了延長整個設(shè)備的使用壽命,盡量保證每個單元的寫入次數(shù)均勻。FTL記錄各個塊的剩余壽命,盡量使用壽命長的塊。同時,也會把一些存儲在剩余壽命比較長的塊中但是不經(jīng)常改動的數(shù)據(jù)搬移到剩余壽命較短的塊中。垃圾回收是在NAND Flash中,以塊為單位擦除,失效的頁空間不會立刻釋放。而垃圾回收負責(zé)釋放失效的頁,保證空間利用率。它會把一個塊中還有效的頁復(fù)制到其他塊中,然后擦除整個塊。壞塊管理會記錄下已經(jīng)無法使用的塊,在寫入數(shù)據(jù)時避開。

        1.1.2 NVMe協(xié)議

        SSD中除了存儲介質(zhì)和控制器還有一個關(guān)鍵的組成部分就是主機接口。以Intel為代表的廠商聯(lián)合推出了專為PCIe SSD設(shè)計的協(xié)議NVMe[11]。NVMe協(xié)議專為SSD設(shè)計,最大支持64 k個隊列,每個隊列可以容納64 k條指令,使用多隊列和doorbell的方式讀寫指令,不需要對隊列加鎖,可以充分發(fā)揮高性能SSD設(shè)備的性能。PCIe接口解決了SSD主機接口的硬件通路瓶頸問題,NVMe協(xié)議解決了SSD主機接口的軟件協(xié)議瓶頸問題。

        NVMe協(xié)議中的隊列分為Admin Queue和I/O Queue。每類隊列又分為提交隊列(submission queue,SQ)和完成隊列(completion queue,CQ)。Admin Queue負責(zé)對設(shè)備的管理,完成創(chuàng)建刪除隊列、設(shè)置參數(shù)、查詢?nèi)罩镜裙ぷ?,I/O Queue負責(zé)具體的傳輸指令,完成Read、Write、刷回(Flush)等操作。SQ用于主機向設(shè)備發(fā)送指令,CQ用于設(shè)備向主機發(fā)送指令的返回結(jié)果。一個CQ可以匹配多個SQ,通過SQ和CQ的配合完成對設(shè)備的操作。

        1.1.3 RDMA網(wǎng)卡

        以太網(wǎng)網(wǎng)卡在接收數(shù)據(jù)時,數(shù)據(jù)必須經(jīng)過系統(tǒng)的處理才能提供給需要這個數(shù)據(jù)的應(yīng)用。這種處理增加數(shù)據(jù)傳輸延遲的同時也增加了CPU的負擔(dān),在網(wǎng)卡的性能越來越高的同時,對CPU的性能也提出了挑戰(zhàn)。

        基于解決數(shù)據(jù)在內(nèi)存和設(shè)備之間的數(shù)據(jù)傳輸,并減輕CPU負擔(dān)的DMA機制,RDMA被提出并用于解決網(wǎng)絡(luò)傳輸?shù)膯栴}[12-17]。RDMA通過網(wǎng)絡(luò)直接把數(shù)據(jù)傳入主機的用戶空間,不再需要內(nèi)核參與,提高了網(wǎng)絡(luò)傳輸性能,降低了CPU的處理負擔(dān)。在RDMA的Infiniband網(wǎng)卡中,具有和NVMe協(xié)議中類似的隊列結(jié)構(gòu),其中有Send Queue,Receive Queue和Completion Queue。Infiniband網(wǎng)卡的設(shè)計目的就是為了提高網(wǎng)絡(luò)性能降低傳輸延遲,使用的場景通常也是對網(wǎng)絡(luò)有著很高要求的應(yīng)用,同時也需要高性能的隊列結(jié)構(gòu)避免在處理I/O請求時成為瓶頸。

        1.2 設(shè)備融合

        數(shù)據(jù)在不同設(shè)備之間傳輸所消耗的時間一直是研究者們盡力減少的,如果一種設(shè)備可以同時完成2種工作,那么數(shù)據(jù)只要在設(shè)備內(nèi)部流動,不需要跨設(shè)備的傳輸。針對不同的設(shè)備類型和不同的使用場景,已經(jīng)有了一些通過設(shè)備融合優(yōu)化系統(tǒng)性能的研究。

        1.2.1 存儲和計算的融合

        XSD(accelerator SSD)[18]通過在SSD中加入嵌入式圖形處理器(graphics processing unit, GPU)以提供計算功能,并為用戶提供了易用的Map-Reduce[19]接口。XSD在SSD中插入了嵌入式GPU,和SSD原有的嵌入式CPU共享內(nèi)存空間。XSD通過流水化來避免數(shù)據(jù)拷貝時間的浪費。由于Flash控制器和GPU是共享內(nèi)存的,F(xiàn)lash向動態(tài)隨機存取存儲器(dynamic random access memory, DRAM)寫入數(shù)據(jù)的同時GPU也在從DRAM中復(fù)制數(shù)據(jù)進行計算再把數(shù)據(jù)寫回DRAM。XSD通過流水化避免了GPU對數(shù)據(jù)的等待問題,充分利用了GPU。XSD通過在SSD內(nèi)使用嵌入式GPU加速計算,通過計算的流水化充分利用了SSD和GPU的性能,通過采用Map-Reduce編程框架提供簡單高效的設(shè)備使用接口。雖然在SSD中加入計算設(shè)備可以有效減少設(shè)備等待數(shù)據(jù)傳輸?shù)拈_銷,但是因為嵌入式設(shè)備自身性能問題,其性能提升能力還是有所不足的。

        1.2.2 存儲、網(wǎng)絡(luò)和計算設(shè)備的融合

        BlueDBM[20]是具有Flash存儲系統(tǒng)、存儲端計算引擎和網(wǎng)絡(luò)功能的PCIe設(shè)備。其中,F(xiàn)lash存儲系統(tǒng)直接開放原始的flash接口(也就是不使用FTL層),由系統(tǒng)層管理數(shù)據(jù)。BlueDBM通過提供多種軟件接口(文件系統(tǒng)接口、塊設(shè)備接口和加速器接口)以方便用戶對設(shè)備的使用。BlueDBM在圖遍歷測試的性能(ISP-F)雖然比使用DRAM的方案(H-DRAM)要差,但是當數(shù)據(jù)只能部分裝入內(nèi)存時(50%F,30%F),BlueDBM的性能已經(jīng)足以替代DRAM。BlueDBM通過對Flash存儲介質(zhì)的直接控制和存儲端的計算能力在多個測試中取得了優(yōu)秀的結(jié)果。但是BlueDBM采用了使用固定配置文件的方式,不具有擴展能力。雖然提供了多種Flash存儲的操作接口,但沒有提供操作設(shè)備的存儲、網(wǎng)絡(luò)和計算功能的統(tǒng)一接口,用戶需要十分了解BlueDBM的結(jié)構(gòu)才能使用。

        1.2.3 存儲和網(wǎng)絡(luò)的融合

        NVMe over Fabric[3]就是一種在共享NVMe SSD資源的同時盡量減少額外開銷的方案。資源池化,可以讓多臺計算機共享存儲資源,提升擴展性和資源的利用率,降低成本。NVMe over Fabric分離了NVMe設(shè)備的前后端,前后端之間通過RDMA網(wǎng)絡(luò)傳輸。前端可以把internet小型計算機接口(internet small computer interface, iSCSI)協(xié)議轉(zhuǎn)換為NVMe的協(xié)議,讓系統(tǒng)統(tǒng)一可以使用NVMe over Fabric。通過網(wǎng)絡(luò)可以很容易地擴展存儲,想要更大存儲容量時只要添加存儲設(shè)備,不需要擴展機群規(guī)模。同時,因為RDMA網(wǎng)絡(luò)有著低延遲,NVMe over Fabric對數(shù)據(jù)傳輸延遲的影響很小。測試表明,通過NVMe over Fabirc使用遠程NVMe設(shè)備時,讀寫的IOPS(input/output operations per second)幾乎不受影響,傳輸延遲的增加也低于8 μs。但是NVMe over Fabric只是對NVMe存儲的擴展,缺少計算能力。NVMe over Fabric雖然可以改善主機讀寫遠程存儲時的延遲,但是在數(shù)據(jù)需要處理時仍然無法改善數(shù)據(jù)路徑冗余導(dǎo)致的浪費。

        2 UIO設(shè)備模型

        在傳統(tǒng)計算機硬件中,存儲和網(wǎng)絡(luò)設(shè)備往往是獨立的2種設(shè)備,而且數(shù)據(jù)無法直接在這2種設(shè)備之間傳輸,必須經(jīng)過CPU和內(nèi)存。隨著硬件技術(shù)的發(fā)展,存儲設(shè)備和網(wǎng)絡(luò)設(shè)備的延遲越來越低,數(shù)據(jù)無法在設(shè)備之間直接傳輸導(dǎo)致的額外延遲在傳輸延遲中的占比也越來越高,這導(dǎo)致新式I/O設(shè)備無法充分發(fā)揮其性能。通過設(shè)備融合,讓同一設(shè)備具有存儲和網(wǎng)絡(luò)功能,設(shè)備內(nèi)部的存儲和網(wǎng)絡(luò)模塊可以直接通信,避免數(shù)據(jù)在通路上的性能損失,減少通信的延遲開銷,改善系統(tǒng)整體性能。

        2.1 UIO設(shè)備結(jié)構(gòu)

        如圖1所示,UIO設(shè)備是插于PCIe卡槽的I/O設(shè)備,同時具有存儲設(shè)備和網(wǎng)絡(luò)設(shè)備的功能,為了提供一定的數(shù)據(jù)處理能力,UIO設(shè)備還具有輔助計算功能。與SSD和網(wǎng)卡一樣,UIO設(shè)備需要系統(tǒng)中的驅(qū)動程序支持,由驅(qū)動程序負責(zé)與設(shè)備的通信。

        圖1 UIO設(shè)備在系統(tǒng)中的位置

        如圖2所示,UIO設(shè)備中具有指令隊列、指令處理、DMA、DRAM、存儲模塊、輔助計算模塊和網(wǎng)絡(luò)模塊。

        圖2 UIO設(shè)備模塊設(shè)計

        指令隊列結(jié)構(gòu)NVMe SSD和RDMA網(wǎng)卡都是具有高吞吐量和低延遲的高性能I/O設(shè)備,這2種設(shè)備都使用了高性能的I/O指令隊列作為主機接口。UIO設(shè)備的設(shè)計目標是解決高性能I/O設(shè)備的傳輸延遲問題,為了支撐設(shè)備的高性能,采用了隊列結(jié)構(gòu)?;诓l(fā)性考慮,管理隊列為每個應(yīng)用建立獨立的指令隊列。管理隊列為不同的程序創(chuàng)建完隊列并分配好權(quán)限后,應(yīng)用有讀寫需求時只需要向自己的隊列中寫入指令即可。設(shè)備會從指令隊列的空間讀取指令,因為I/O隊列的權(quán)限已經(jīng)由管理隊列設(shè)置好,可以由設(shè)備檢查指令是否符合該指令隊列的權(quán)限,而不需要內(nèi)核的處理。這為用戶級I/O和虛擬化提供了方便。

        指令處理指令處理要完成2部分工作,一個是指令仲裁,一個是指令解析。UIO設(shè)備具有多對指令隊列,不同進程使用設(shè)備時不必給隊列加鎖,每個進程都可以自由地給設(shè)備發(fā)送指令。設(shè)備上有相應(yīng)的模塊來處理多個指令隊列之間的協(xié)調(diào)調(diào)度問題,這個功能就是指令仲裁。指令仲裁會決定設(shè)備執(zhí)行的下一條指令是什么。執(zhí)行的順序通常由隊列的優(yōu)先級決定。指令解析會把指令翻譯成設(shè)備內(nèi)部模塊的控制信息,而設(shè)備的其余模塊才是真正完成數(shù)據(jù)傳輸工作的部分。

        DMA設(shè)備在解析完指令后,執(zhí)行對應(yīng)的數(shù)據(jù)傳輸,即主機和設(shè)備之間的數(shù)據(jù)傳輸。UIO中DMA主要負責(zé)把主機中數(shù)據(jù)傳輸?shù)紻RAM中,而數(shù)據(jù)從設(shè)備到主機的傳輸會根據(jù)實際情況由不同的模塊完成。

        DRAMUIO中的DRAM有2個作用,一個是保存設(shè)備運行時必要的信息,一個是作為數(shù)據(jù)傳輸?shù)木彺婧途彌_。一般的存儲設(shè)備,讀寫速度和延遲都是不一致的,F(xiàn)lash介質(zhì)的存儲設(shè)備還存在寫放大的問題,F(xiàn)TL正在執(zhí)行的一些任務(wù)(例如靜態(tài)磨損均衡和垃圾回收)也會導(dǎo)致讀寫時間出現(xiàn)較大波動。為了提供更好的設(shè)備性能,設(shè)備中的DRAM可以作為讀寫的緩存。UIO中網(wǎng)絡(luò)傳輸?shù)皆O(shè)備中的數(shù)據(jù),也需要一些內(nèi)存空間進行緩沖,平衡存儲模塊和網(wǎng)絡(luò)模塊讀寫速度的差異。

        2.2 可編程模塊

        在UIO設(shè)備中,需要具備存儲、網(wǎng)絡(luò)和輔助計算3種功能,如何使用這3種模塊是提供高性能的關(guān)鍵問題。

        2.2.1 模型分析

        基于獨立設(shè)備接口的指令接口用戶需要控制各個模塊對數(shù)據(jù)的處理,以及數(shù)據(jù)在各個模塊之間的傳輸。用戶使用設(shè)備的自由度高,通過精心設(shè)計的指令可以充分發(fā)揮設(shè)備的性能。但是,這種方案在實際使用中會有很大的局限。首先,處理器的性能受功耗限制,在I/O設(shè)備中嵌入的處理器性能有限。如果向用戶提供全功能的通用計算處理器,處理器的性能可能無法匹配高速I/O設(shè)備的性能,反而成為性能瓶頸,帶來過多的性能損失。其次是I/O設(shè)備的接口復(fù)雜性。對Flash的讀寫不能使用傳統(tǒng)的Read和Write原語,而要使用編程(Program)、Read和Erase的原語進行讀寫。SSD中通常用FTL層進行這2種接口的轉(zhuǎn)換。如果向用戶開放Flash的原始接口,那么FTL負責(zé)的功能都需要用戶來完成。這會極大提高用戶的使用難度,用戶除了要熟悉Flash的接口還要進行復(fù)雜的性能優(yōu)化,難以發(fā)揮高性能存儲的能力[21-27]。

        基于需求抽象分析的統(tǒng)一指令接口UIO設(shè)備采用的方案是抽象出用戶需求,根據(jù)用戶需求設(shè)計專用設(shè)備,向用戶提供統(tǒng)一的指令接口,用戶通過使用統(tǒng)一的指令就可以完成對設(shè)備全部功能的操作。這種方案的缺點顯而易見,設(shè)備的功能受限,只能在特定場景下使用。但是這一缺點可以通過抽象用戶需求彌補。可以通過分析用戶使用較多的場景,把某一類用戶的需求提取出來,然后制作設(shè)備專門用于滿足這類用戶的需求。雖然無法滿足所有用戶的需求,但是通過抽象出多種用戶的需求也足以覆蓋大部分用戶。

        統(tǒng)一的用戶指令使用簡單,通過抽象用戶需求,可以向用戶提供具有高級語義的接口,完全屏蔽設(shè)備實現(xiàn)的具體細節(jié)。甚至可以根據(jù)為用戶提供的功能深度定制底層模塊的邏輯。如圖3所示,移除了原有設(shè)計中的輔助計算模塊,改為統(tǒng)一轉(zhuǎn)換層(unity translation layer, UTL)模塊和全局信息管理引擎(global management engine, GME)模塊。UTL模塊和GME模塊都是可編程模塊,可以根據(jù)用戶需求寫入不同的處理邏輯。其中,UTL模塊負責(zé)讀寫存儲介質(zhì),GME負責(zé)分離本地和遠程的傳輸。

        圖3 UIO模塊設(shè)計專用方案

        2.2.2 UTL模塊

        UTL模塊用于取代SSD中的FTL模塊,負責(zé)實際的存儲介質(zhì)的讀寫。UTL把用戶對設(shè)備的操作接口轉(zhuǎn)換為對Flash介質(zhì)的Program、Read和Erase接口,UTL提供可編程的接口。UIO針對抽象出來的用戶需求,完成特定類型的操作,針對Flash存儲介質(zhì)的特點,完成用戶定義接口到flash介質(zhì)接口的高效轉(zhuǎn)換。

        2.2.3 GME模塊

        GME模塊負責(zé)多個設(shè)備之間的通信,通過增加設(shè)備的數(shù)量進行擴展,通過多個UIO設(shè)備的協(xié)同工作,共享存儲空間,擴展各UIO設(shè)備的性能。

        如圖4所示,把多個設(shè)備映射到一個全局空間中。用戶通過本地設(shè)備的接口就可以透明地操作全局空間,而不必感知到其他設(shè)備的存在。當系統(tǒng)中增加設(shè)備時,用戶看到的是全局空間的擴展。GME控制數(shù)據(jù)的分布,并根據(jù)數(shù)據(jù)的分布規(guī)則把數(shù)據(jù)發(fā)送到相應(yīng)的設(shè)備。如果是本地的數(shù)據(jù)就交給UTL模塊處理,由UTL模塊寫入本地的存儲介質(zhì);如果是遠程的數(shù)據(jù)就通過網(wǎng)絡(luò)模塊發(fā)送到目標設(shè)備,由目標設(shè)備寫入存儲。

        圖4 UIO設(shè)備多機模型

        2.3 基于UIO的應(yīng)用示例

        2.3.1 key-value存儲

        在key-value數(shù)據(jù)庫中,哈希存儲方式把KV對組成的記錄順序?qū)懭氪鎯橘|(zhì),在內(nèi)存中建立從key到記錄地址的映射。在讀取時就根據(jù)映射地址讀取;修改時寫入一條新的記錄,然后修改內(nèi)存中映射的地址;刪除時并不刪除實際的記錄,而是寫入一條代表已刪除的記錄。為了支持更好的擴展性和并發(fā)性,在UIO中,可以進行2次哈希存儲,一次由GME進行,把數(shù)據(jù)分布到不同的設(shè)備上,一次由UTL快速定位數(shù)據(jù)在存儲介質(zhì)中的位置。哈希存儲雖然實現(xiàn)簡單,查找效率高,但是只能查找單條記錄,如果想查找一個范圍內(nèi)的數(shù)據(jù)效果比較差,此時需要考慮順序分布的存儲方式。

        如圖5所示,順序分布把key分為多個范圍,不同范圍的數(shù)據(jù)組成不同的子表,Root表記錄每個子表存儲在哪個節(jié)點中。在UIO設(shè)備中,可以由GME記錄每個子表的數(shù)據(jù)范圍和節(jié)點信息,在查找范圍時由GME把大的范圍轉(zhuǎn)換為對多個子表的查詢,UTL則負責(zé)一個子表,根據(jù)查詢返回結(jié)果。

        圖5 順序分布

        2.3.2 圖片檢索

        圖片檢索功能就是向UIO設(shè)備發(fā)送圖片后,UIO設(shè)備從存儲中檢索出相似的圖片并發(fā)送給主機。其中,GME模塊負責(zé)把圖片分發(fā)給本地UTL模塊和其他遠程設(shè)備。所有UIO設(shè)備中的UTL模塊收到圖片后就會讀出存儲中的圖片,并進行比對,并把相似的圖片發(fā)送給源設(shè)備。源設(shè)備收到圖片后會發(fā)送到主機。與傳統(tǒng)方案中數(shù)據(jù)需要在存儲設(shè)備和CPU或GPU通信相比,由專用的硬件模塊處理圖像可以取得更高的運算效率。在存儲設(shè)備中的比對使得大部分數(shù)據(jù)都不需要從設(shè)備傳輸?shù)街鳈C,只需要傳輸比對后相似度高的圖片,設(shè)備和主機間的帶寬可以用來傳輸遠程設(shè)備傳輸過來的圖片,避免了帶寬的浪費。

        2.3.3 kNN算法

        最鄰近結(jié)點(k-nearest neighbor,kNN)算法是一種常用的機器學(xué)習(xí)算法,通過計算未知數(shù)據(jù)和已知數(shù)據(jù)的“距離”來預(yù)測未知數(shù)據(jù)的類別。kNN算法在預(yù)測時會取出已知數(shù)據(jù)中和待預(yù)測數(shù)據(jù)最接近的前k項數(shù)據(jù)作為預(yù)測的樣本,這也是kNN算法中k的含義。UIO在處理kNN算法時,存儲介質(zhì)中存儲所有的樣本。在主機向設(shè)備發(fā)送待預(yù)測樣本后,GME模塊把樣本發(fā)送給所有設(shè)備。所有設(shè)備的UTL模塊接收到樣本后,會讀出存儲介質(zhì)中的樣本并計算距離值,在計算的過程中保存最接近的前k個值。全部的值比對完成后設(shè)備會把前k個最接近的結(jié)果發(fā)送給源設(shè)備,源設(shè)備的GME模塊在收集到所有設(shè)備的返回結(jié)果后會進行排序并選出其中的前k個值預(yù)測分類,再把分類結(jié)果發(fā)送給主機。

        3 UIO模擬器實現(xiàn)

        為了驗證UIO設(shè)備的設(shè)計是否有效,并為將來UIO設(shè)備的相關(guān)研究提供驗證平臺,本文將實現(xiàn)UIO設(shè)備的模擬器。

        3.1 整體架構(gòu)

        如圖6所示,UIO設(shè)備模擬器的結(jié)構(gòu)依照UIO設(shè)備的基本結(jié)構(gòu)而設(shè)計。由指令隊列和控制寄存器共同組成設(shè)備接口。其中指令隊列分為Admin Queue和I/O Queue,每種Queue又由SQ和CQ組成。除了指令隊列,主機還需要一些寄存器為設(shè)備進行初始化以及保持狀態(tài)信息。在實際UIO設(shè)備模擬器的實現(xiàn)中,本文選擇的目標是實現(xiàn)采用key-value接口,使用put/get指令,GME模塊和FTL模塊都采用哈希分布。

        圖6 UIO設(shè)備結(jié)構(gòu)圖

        UIO設(shè)備模擬器是用戶態(tài)功能級的模擬器,目標是驗證UIO設(shè)備的模型是否有效。在UIO模擬器的設(shè)計中,首先進行初始化工作,然后創(chuàng)建2個線程,一個模擬主機端,一個模擬設(shè)備端。主機端會接收來自控制臺的命令,并把用戶的命令轉(zhuǎn)換為相應(yīng)指令寫入設(shè)備端的控制結(jié)構(gòu)。設(shè)備端則是根據(jù)控制結(jié)構(gòu)中的指令執(zhí)行實際的操作,從主機端復(fù)制數(shù)據(jù)或者向主機端寫入數(shù)據(jù)并根據(jù)指令執(zhí)行情況提供返回結(jié)果。設(shè)備端啟動后會創(chuàng)建出指令處理、DMA、GME、UTL和網(wǎng)絡(luò)通信(network communication, NET)一系列線程用于模擬UIO設(shè)備中的各個模塊。考慮各個模塊的運行都是并行的,采用多線程來盡量接近真實的設(shè)備特性。

        3.2 UIO設(shè)備接口設(shè)計與實現(xiàn)

        UIO的設(shè)備結(jié)構(gòu)主要借鑒了NVMe的設(shè)備接口設(shè)計,并根據(jù)UIO設(shè)備的特性進行了修改。

        3.2.1 指令設(shè)計

        在UIO中,本文設(shè)計了2種指令,Admin Command和IO Command。出于簡化設(shè)計突出原理的目的,只設(shè)計了實現(xiàn)UIO最核心功能的指令。Admin Queue的4種操作就是創(chuàng)建和刪除SQ和CQ。需要注意的是,在創(chuàng)建SQ前應(yīng)該先創(chuàng)建SQ所對應(yīng)的CQ。如果先創(chuàng)建了SQ又向隊列中寫入了指令,設(shè)備在處理完指令后找不到應(yīng)該寫入返回結(jié)果的CQ就會導(dǎo)致未知的結(jié)果。IO Command只有put和get 2條。put提供key和value,表示把key的值更新為value。get提供key,表示讀出key存儲的值。

        如表1所示,每一條指令有64個字節(jié)組成。其中,opcode用于指明要執(zhí)行的是哪條指令;cid是指令的表示,使用隊列的id加cid可以確定唯一的一條指令;nsid用于指明該條指令用于操作哪個namespace,為不同用戶和應(yīng)用的操作系統(tǒng)硬件級的隔離(在改版UIO中尚未實現(xiàn),只是預(yù)留接口);其余部分會根據(jù)指令的不同有不同含義或者是保留字段。

        表1 指令格式

        例如在Create IO Submission Queue的指令中,adr2用于保存隊列的起始地址;cdw10用于保存隊列大小和隊列id;cdw11中保存SQ對應(yīng)的用于放置返回結(jié)果的CQ的隊列id以及該SQ的優(yōu)先級。

        而在put和get指令中,adr1用于存放key的地址,len1存放key的長度,adr2用于存放value的地址,len2用于存放value的長度(get指令中實際上是主機為get的返回值創(chuàng)建的緩沖區(qū)的地址以及緩沖區(qū)長度)。

        表2所示是CQ中返回項的格式。Command Specific是指令的返回結(jié)果,根據(jù)指令的不同也有所不同;SQ Identifier是發(fā)送該指令的SQ的id,SQ Head Pointer指明返回該指令時,設(shè)備中維護的SQ的Head Doorbell指向的位置(在主機讀取到時設(shè)備中該值可能已被更新);Status Field返回指令執(zhí)行的基本信息,例如是否成功,是否可以繼續(xù)嘗試;P是Phase Tag,Phase Tag只有1位,用于指明該返回項是否已經(jīng)填寫完成;Command Identifier就是該返回項對應(yīng)的指令的id,前面提到隊列id加指令id的

        表2 CQ返回項格式

        組合可以確定一條指令,也就是說,主機根據(jù)這2個id就可以知道完成的是哪條指令了。

        3.2.2 BAR寄存器

        基地址寄存器(base address register, BAR)解決的是最基本的主機與設(shè)備通信的問題。主機所看到的BAR寄存器是內(nèi)存中的一段空間,主機通過讀寫其中的數(shù)據(jù)實現(xiàn)對設(shè)備的控制。UIO設(shè)備的BAR寄存器參照了NVMe的設(shè)計,主要使用了其中關(guān)于Admin Queue的AQA、ASQ、ACQ以及Doorbell部分的寄存器,如表3所示。

        雖然主機和UIO設(shè)備的主要通信方式是通過指令隊列,但是這就需要知道指令隊列的地址。IO Queue的地址空間是由主機在內(nèi)存中申請并通過Admin Queue指令把地址提供給設(shè)備,由設(shè)備自行從主機內(nèi)存中獲取指令。這就需要主機和設(shè)備都統(tǒng)一預(yù)先知道Admin Queue的地址。而這個地址就是由BAR寄存器提供的。BAR寄存器中的ASQ和ACQ分別提供了Admin Submission Queue和Admin Completion Queue的起始地址。AQA則提供了Admin Queue的大小。之后的CQ0TDBL和CQ0HDBL等寄存器則分別提供了SQ的Tail Doorbell和CQ的Head Doorbell。Head和Tail Doorbell是2個指針,分別指出了指令隊列中存放有數(shù)據(jù)部分的起始和結(jié)束。

        基于Queue的起始地址(Admin Queue的在BAR寄存器指出,IO Queue的由主機和設(shè)備分別自己維護)和Doorbell,主機就可以完成對設(shè)備的控制,設(shè)備就可以獲得主機的指令,完成自己的工作了。

        表3 Bar寄存器定義

        3.3 UIO設(shè)備模擬器控制結(jié)構(gòu)的實現(xiàn)

        3.3.1 指令仲裁

        由于指令優(yōu)先級和UIO模擬器要驗證的原理關(guān)聯(lián)不大,UIO模擬器中的指令隊列只使用了1級優(yōu)先級,指令仲裁使用輪詢的方式從隊列中取指。

        UIO中會為所有隊列建立一個鏈表,維護每個隊列的Head和Tail,每當隊列創(chuàng)建時就加入該鏈表,隊列刪除時就從中釋放。指令仲裁通過檢查Head和Tail判斷隊列是否為空,如果隊列不為空就從隊列中取出Head所指向的指令并交給指令解釋器執(zhí)行。在取出一定條數(shù)的指令后,或者隊列為空時,就通過next指針找到下一個隊列。

        3.3.2 指令解釋器

        指令解釋器首先根據(jù)取指的隊列id判斷是Admin Command還是IO Command。然后從指令中取出opcode字段,根據(jù)opcode判斷是哪條指令并根據(jù)該指令的字段解析其中有用的信息,并把這些信息發(fā)送給數(shù)據(jù)處理模塊。

        在處理Admin Command的時候,因為不涉及數(shù)據(jù)的傳輸,由指令解釋器執(zhí)行具體的指令。在創(chuàng)建隊列時,指令解釋器會創(chuàng)建圖7中的隊列輪詢控制結(jié)構(gòu),并指向指令中給出的地址;而在刪除隊列時,指令解釋器會釋放隊列的控制結(jié)構(gòu)。

        圖7 UIO隊列輪詢結(jié)構(gòu)

        3.4 數(shù)據(jù)處理模塊

        UIO模擬器采用消息隊列模擬模塊間的通信,包括指令解釋器模塊向數(shù)據(jù)處理模塊發(fā)送的請求和數(shù)據(jù)處理模塊之間發(fā)送的請求。模塊間消息隊列只有請求項不設(shè)返回值,當模塊處理指令成功或者失敗時,會根據(jù)處理情況向Completion Queue填寫返回信息以完成對指令的處理。

        3.4.1 DMA模塊

        在UIO模擬器中,DMA負責(zé)把數(shù)據(jù)從主機內(nèi)存中復(fù)制到設(shè)備的內(nèi)存中,以供后續(xù)其他模塊處理。當指令是put時,DMA會復(fù)制key和value;當指令是get時,DMA會復(fù)制key。

        DMA將數(shù)據(jù)組織成如表4所示的記錄形式,以方便傳輸或者寫入Flash顆粒。校驗碼是由數(shù)據(jù)內(nèi)容計算出來的固定長度的字段。因為Flash存儲技術(shù)自身的缺陷,存儲單元中的數(shù)據(jù)過一段時間后可能會失效或者改變,通過錯誤檢查和糾正(error correcting code, ECC)保證數(shù)據(jù)可以完整正確地讀出。在網(wǎng)絡(luò)傳輸和key-value數(shù)據(jù)庫中,一般也會加入校驗字段來驗證數(shù)據(jù)的有效性。

        表4 記錄結(jié)構(gòu)示意圖

        UIO模擬器中的DMA只負責(zé)從主機端讀取數(shù)據(jù)到設(shè)備DRAM中,從設(shè)備中讀取數(shù)據(jù)到主機端的工作則交給其他模塊完成。存儲介質(zhì)的寫入速度或者向遠程設(shè)備發(fā)送數(shù)據(jù)的速度都低于寫入DRAM的速度,用DRAM作為緩存提高效率。但是從設(shè)備中讀取數(shù)據(jù)時,可以由設(shè)備內(nèi)模塊直接向主機內(nèi)存?zhèn)鬏敗?/p>

        3.4.2 GME模塊

        GME負責(zé)把數(shù)據(jù)的讀寫請求根據(jù)key把指令分配到不同的設(shè)備上。如圖8所示,GME模塊收到請求后會讀出其中的key,然后計算key的哈希值,并在映射表中查找該哈希值對應(yīng)的目標服務(wù)器id。如果指令目標是本地設(shè)備,就交給UTL模塊處理,如果指令目標是遠程設(shè)備就交給NET模塊處理。GME模塊中的映射表可以通過分布式協(xié)議獲取,也可以通過配置文件寫入,UIO模擬器中是通過函數(shù)計算哈希值和目標設(shè)備id之間的關(guān)系。

        圖8 GME模塊原理示意圖

        3.4.3 UTL模塊

        在UIO模擬器中通過建立Flash顆粒的塊和頁2級來模擬Flash介質(zhì)的基本性質(zhì)。Flash顆粒中,頁只能被寫入不能改寫,修改引起的拷貝復(fù)制導(dǎo)致寫放大問題。如圖9所示, UIO模擬器借鑒了鍵值存儲系統(tǒng)的處理方式,創(chuàng)建1條新的記錄,順序?qū)懙浆F(xiàn)在記錄的尾端把原有記錄視為失效。當1個頁完整寫入后只讀取不再改動。塊是由頁組成的,當1個塊中所有頁都被寫入后會成為固定塊,不再發(fā)生改動。

        UIO提供key-value接口,UIO接收的指令不包含地址,UIO仿照FTL實現(xiàn)key到物理地址的映射。UTL會在DRAM中建立哈希映射表,哈希表通過key來索引value保存的具體位置,其中包括block id、page id、value位置和長度。當發(fā)生寫請求時,UTL就把記錄順序?qū)懭隖lash中,然后根據(jù)寫入時的地址更新內(nèi)存中的哈希表;當發(fā)生讀請求時,先從哈希表中查詢到value的地址,然后再從Flash中定位并讀出數(shù)據(jù)。當請求是來自本地時,UTL就可以直接把返回結(jié)果寫入本地設(shè)備的Completion Queue并把數(shù)據(jù)寫入主機內(nèi)存。當請求是來自遠程時,UTL就把數(shù)據(jù)暫存在設(shè)備的內(nèi)存中,并給NET模塊發(fā)送請求,由NET模塊處理。

        UTL對塊進行定期掃描,進行垃圾回收,提高空間利用率。UTL從頭到尾掃描塊,從中讀出每一條記錄的key,并把記錄地址和該key在哈希表中指向的地址進行對比。如果是同一個地址說明該記錄是有效的,UTL就把該記錄寫入到活動塊中繼續(xù)保留;如果該記錄的地址和哈希表中的不一致,說明該記錄已經(jīng)失效,直接跳過即可,掃描完整個塊,該塊就可以擦除回收了。

        圖9 UTL哈希表示意圖

        3.4.4 NET模塊

        NET模塊由2部分組成,分別負責(zé)發(fā)送、接收網(wǎng)絡(luò)請求。Send流程中會有4種情況,遠程put請求、遠程get請求、遠程put回復(fù)、遠程get回復(fù)。其中,遠程put和get請求是來自GME的指令,GME根據(jù)key判斷指令目標是遠程設(shè)備時,會向NET模塊發(fā)送指令并告知目標設(shè)備id,由NET模塊負責(zé)發(fā)送。其中,put請求需要向遠程設(shè)備發(fā)送key和value,get請求需要發(fā)送key。

        遠程put、get請求的接收,都接收到設(shè)備內(nèi)存中,由UTL模塊處理。遠程設(shè)備把put和get請求處理完后會發(fā)送回復(fù),對于put的回復(fù)只要知道put指令執(zhí)行的狀態(tài)即可,獲得結(jié)果后向CQ填寫返回結(jié)果這條指令就完成了。而遠程get指令是有查詢結(jié)果的,設(shè)備接收到結(jié)果后還要復(fù)制給主機,等復(fù)制結(jié)束后就可以填寫返回結(jié)果了。

        3.5 指令整體流程

        在主機寫入指令后,指令仲裁把指令從指令隊列中取出并送入指令解釋器,指令解釋器解析指令后給DMA發(fā)送控制信號,然后就由數(shù)據(jù)通路模塊執(zhí)行。

        3.5.1 put指令

        put指令,主機會提供key和value的地址和長度,DMA根據(jù)地址和長度分別從主機內(nèi)存中復(fù)制key和value的值到設(shè)備內(nèi)存中,并存儲成記錄的格式,然后向GME模塊發(fā)送信號。GME模塊會從設(shè)備內(nèi)存中讀出key,并計算key的哈希值,根據(jù)哈希值在內(nèi)存中的映射表查找目標設(shè)備的id。

        如果目標設(shè)備是本地設(shè)備,那么GME模塊就向UTL模塊發(fā)送請求,UTL在收到請求后從設(shè)備內(nèi)存中讀出記錄并寫入介質(zhì),并把寫入到介質(zhì)中的地址存到設(shè)備內(nèi)存中的映射表。完成寫入后,UTL模塊會向CQ填寫完成信息。如果目標設(shè)備是遠程設(shè)備,則由NET模塊負責(zé)處理。NET模塊收到控制信號后會把內(nèi)存中的記錄分解為多個包并填寫元數(shù)據(jù)以便于傳輸,然后向目標設(shè)備依次發(fā)送數(shù)據(jù)包。目標設(shè)備的NET模塊收到數(shù)據(jù)包會讀取數(shù)據(jù)包的opcode,如果判斷出是put請求就會依次接收包并重新組成記錄的格式,然后向UTL模塊發(fā)送信號。UTL模塊接收到信號后會把內(nèi)存中的記錄寫入存儲介質(zhì)并修改內(nèi)存中的映射表,然后向NET模塊返回完成信息。NET收到完成信息后會發(fā)送到源設(shè)備,源設(shè)備的NET模塊收到完成信息后會向CQ填寫完成信息。

        3.5.2 get指令

        get指令的過程和put指令的過程大體相似,這里只介紹其中有區(qū)別的部分。DMA在執(zhí)行g(shù)et指令時只會從內(nèi)存中復(fù)制key(因為指令中傳遞的value地址是應(yīng)用申請好的緩沖區(qū)地址和長度)。

        UTL在收到信號后會先從映射表中查找key所對應(yīng)value在存儲介質(zhì)中的地址,根據(jù)這個地址找到value并復(fù)制到主機內(nèi)存(因為主機內(nèi)存的帶寬和延遲一般都優(yōu)于存儲設(shè)備,所以直接復(fù)制也不會有性能問題還可以減少開銷),然后填寫返回信息。NET模塊在向遠程設(shè)備發(fā)送信息時發(fā)送的只有key,遠程設(shè)備在返回完成信息時還要發(fā)送查詢到的value的值。同樣,本地設(shè)備的NET模塊在接收到value的值后會直接復(fù)制到主機內(nèi)存中。

        4 測評與分析

        4.1 測試環(huán)境與測試方案

        4.1.1 測試環(huán)境

        UIO模擬器的測試是在一臺服務(wù)器上完成。服務(wù)器的配置如表5所示。UIO的測試采用在單臺服務(wù)器上運行多個模擬器程序。由于程序之間通過Linux系統(tǒng)提供的消息隊列進行通信,使用內(nèi)存模擬存儲介質(zhì),硬件只用到了CPU和內(nèi)存。

        表5 測試環(huán)境參數(shù)表

        4.1.2 測試方案

        UIO的設(shè)計目的是減少遠程數(shù)據(jù)傳輸在設(shè)備和內(nèi)存之間傳輸導(dǎo)致的額外延遲。為了進行對比測試,在UIO模擬器添加了一種模式,讓UIO模擬器模擬傳統(tǒng)的數(shù)據(jù)通路,在接收到數(shù)據(jù)后復(fù)制到主機內(nèi)存中,再從主機內(nèi)存重新讀入設(shè)備,寫入存儲介質(zhì)。除此之外,UIO模擬器在處理指令時會有一些額外開銷。例如GME模塊會驗證指令是發(fā)往本地還是遠程,傳統(tǒng)存儲設(shè)備中所有指令都是寫入本地存儲,并沒有此項開銷。所以用UIO模擬器模擬數(shù)據(jù)無需經(jīng)過GME模塊直接讀寫UTL模塊的場景,測試UIO模擬器在本地模式下的額外開銷。

        4.2 數(shù)據(jù)傳輸延遲測試

        在具體的測試中,會使用多種value長度(從4B到16 kB)的指令,其中的key和value都會使用英文字母填充。

        4.2.1 UIO模擬器與傳統(tǒng)數(shù)據(jù)通路對比

        在圖10和圖11中,可以看出傳統(tǒng)通路的指令執(zhí)行延遲都高于UIO設(shè)備,根據(jù)指令長度的不同會多出10~30 μs。延遲的增加主要是因為數(shù)據(jù)復(fù)制和設(shè)備間的數(shù)據(jù)包導(dǎo)致,而傳統(tǒng)通路的數(shù)據(jù)復(fù)制次數(shù)多于UIO設(shè)備,所增加的延遲也高于UIO設(shè)備。put指令中,value的長度越長執(zhí)行延遲越長與UIO模擬器的實現(xiàn)方式有關(guān),在使用put指令時因為需要向設(shè)備寫入數(shù)據(jù),模擬器在實際運行時需要向系統(tǒng)申請空間,所以越長的指令執(zhí)行時間也越長。但是這部分時間的增量在2種通路都是存在的,并不會影響結(jié)論。測試結(jié)果表明,UIO設(shè)備路徑與傳統(tǒng)數(shù)據(jù)通路相比,遠程put減少8.2%延遲,遠程get減少11%延遲。

        圖10 UIO設(shè)備與傳統(tǒng)通路遠程put指令延遲對比

        圖11 UIO設(shè)備與傳統(tǒng)通路遠程get指令延遲對比

        4.2.2 UIO模擬器與本地數(shù)據(jù)通路對比

        對于本地put指令,可以看到有的指令是UIO的延遲更長,有的是UIO的延遲更短。大多數(shù)的數(shù)據(jù)差距都在2~3 μs內(nèi),差距在于UIO設(shè)備中需要額外經(jīng)過GME模塊計算目標設(shè)備id,對于3 μs左右的延遲這種隨機波動影響很大,因此UIO設(shè)備和傳統(tǒng)設(shè)備在運行本地put指令時開銷基本相當。對于本地get指令,可以看到UIO設(shè)備的執(zhí)行延遲基本超過傳統(tǒng)通路,但是超過的幅度很小,基本在10 μs左右。如圖12和圖13所示,測試結(jié)果表明,UIO設(shè)備路徑與傳統(tǒng)數(shù)據(jù)通路相比,本地指令的差距基本不隨value的長度變化,這是因為GME的操作是從設(shè)備內(nèi)存中讀取key,并計算key的Hash值,沒有復(fù)制數(shù)據(jù)的操作。在實際使用中key的長度較小,所以Hash值的計算開銷也不高,開銷的變化通常也不大。

        4.3 數(shù)據(jù)分析

        從4.2節(jié)中可以看出,UIO設(shè)備在執(zhí)行遠程指令時延遲小于傳統(tǒng)通路,而在執(zhí)行本地指令時略微高于傳統(tǒng)通路。

        圖12 UIO設(shè)備與傳統(tǒng)通路本地put指令延遲對比

        對于遠程指令,傳統(tǒng)通路中需要把指令從設(shè)備復(fù)制到主機中再從主機復(fù)制到設(shè)備中,相比UIO設(shè)備各個模塊可以共用內(nèi)存相比,增加了數(shù)據(jù)復(fù)制的開銷,這部分開銷造成了傳統(tǒng)通路的額外延遲。而對于本地指令,UIO設(shè)備相比傳統(tǒng)通路增加了GME計算指令的目標設(shè)備是本地設(shè)備還是遠程設(shè)備的開銷,這部分計算主要是使用哈希函數(shù)計算哈希值,再根據(jù)哈希值查表,都是開銷比較小的計算,所以相比傳統(tǒng)通路時間延遲增加并不顯著。

        如果設(shè)UIO設(shè)備減少的遠程指令開銷比例是a,增加的本地指令開銷比例是b,UIO設(shè)備有N塊,設(shè)備的能力都是相同的,哈希函數(shù)可以把數(shù)據(jù)均勻分布到N塊設(shè)備上,那么用戶的數(shù)據(jù)會有1/N在本地設(shè)備,(N-1)/N在遠程設(shè)備,UIO設(shè)備相比傳統(tǒng)通路的開銷比值是

        (1)

        5 結(jié) 論

        現(xiàn)有系統(tǒng)中,數(shù)據(jù)發(fā)往遠程計算機存儲設(shè)備的數(shù)據(jù)通路經(jīng)過本地網(wǎng)卡、遠程網(wǎng)卡、遠程內(nèi)存最終到達遠程存儲。數(shù)據(jù)無法直接在網(wǎng)卡和存儲設(shè)備之間傳輸,導(dǎo)致了額外的傳輸延遲。新型高速存儲介質(zhì)的出現(xiàn),存儲設(shè)備的訪問延遲大幅下降,使得這段延遲在整個傳輸過程的延遲中占比大大增加。為了降低數(shù)據(jù)傳輸延遲,充分利用新式存儲設(shè)備的性能,本文設(shè)計了面向網(wǎng)絡(luò)與存儲的融合設(shè)備模型,提出了融合存儲、網(wǎng)絡(luò)和輔助計算功能的融合I/O設(shè)備。通過在同一設(shè)備中融合存儲和網(wǎng)絡(luò)功能,使得設(shè)備內(nèi)的網(wǎng)絡(luò)模塊可以直接與設(shè)備內(nèi)的存儲模塊通信,簡化了數(shù)據(jù)的傳輸路徑,降低了數(shù)據(jù)的傳輸延遲。實現(xiàn)了與key-value存儲系統(tǒng)相結(jié)合的UIO設(shè)備模擬器。在最終測試中與傳統(tǒng)數(shù)據(jù)通路相比,遠程put減少8.2%延遲,遠程get減少11%延遲,本地put增加0.9%延遲,本地get增加2.7%延遲的效果。

        猜你喜歡
        存儲設(shè)備模擬器隊列
        了不起的安檢模擬器
        盲盒模擬器
        劃船模擬器
        隊列里的小秘密
        基于多隊列切換的SDN擁塞控制*
        軟件(2020年3期)2020-04-20 00:58:44
        在隊列里
        豐田加速駛?cè)胱詣玉{駛隊列
        Windows 7下USB存儲設(shè)備接入痕跡的證據(jù)提取
        基于Flash芯片的新型存儲設(shè)備數(shù)據(jù)恢復(fù)技術(shù)研究
        動態(tài)飛行模擬器及其發(fā)展概述
        蜜桃视频中文在线观看| 欧美大肥婆大肥bbbbb| 无码人妻一区二区三区免费| 高清高速无码一区二区| 日本黄色一区二区三区| 国产精品久免费的黄网站| 成人精品综合免费视频| 97久久综合区小说区图片专区| 亚洲天堂av在线观看免费| 欲求不満の人妻松下纱荣子| 黑人巨大白妞出浆| 欧美激情国产亚州一区二区| 国产av一区二区网站| 凹凸国产熟女精品视频app| 日本乱子人伦在线视频| 国产成人精品a视频一区| 成全视频高清免费| AV在线毛片| 一区二区三区在线视频观看| 玩中年熟妇让你爽视频| 国产精品片211在线观看| 亚洲av高清在线一区二区三区| 久久99精品久久久久麻豆| 国产97在线 | 免费| 精品无码成人片一区二区| 在线视频观看一区二区| 蜜桃一区二区三区| 亚洲国产精品自拍一区| 69精品人妻一区二区| 少妇无码av无码专线区大牛影院| 国产全肉乱妇杂乱视频| 一本一道波多野结衣av中文| 色婷婷精久久品蜜臀av蜜桃| 伊人久久精品无码av一区| 国产乱子伦视频大全| 激情文学人妻中文字幕| 熟女中文字幕一区二区三区| 中文成人无码精品久久久不卡 | 中文字幕久区久久中文字幕 | 天天爽夜夜爽人人爽曰喷水| 久久综合老鸭窝色综合久久|