蔡 濤 王 杰 牛德姣 劉佩瑤 陳福麗
(江蘇大學計算機科學與通信工程學院 江蘇鎮(zhèn)江 212013)
存儲系統(tǒng)是當前計算機系統(tǒng)的瓶頸,近年來出現了一系列新興的非易失性存儲器[1-5](non-volatile memory, NVM),如3D-Xpoint,PCM(phase change memory),Battery-backed NVDIMMS,FeRAM(ferroe-lectric RAM)等,這些NVM存儲設備具有接近內存(dynamic RAM, DRAM)的讀寫速度和支持字節(jié)尋址等特性,成為解決存儲系統(tǒng)性能瓶頸的重要方法,但這些特性也給現有的存儲系統(tǒng)管理方法帶來了極大的挑戰(zhàn).
由于傳統(tǒng)存儲設備缺乏處理能力,現有存儲系統(tǒng)需要依賴文件系統(tǒng)利用主機CPU管理訪問請求,并使用鎖機制實現訪問請求之間的互斥;但文件系統(tǒng)無法獲得存儲設備和數據分布的特性,缺乏針對NVM存儲設備的特性的優(yōu)化機制;文件系統(tǒng)的鎖機制是以文件為管理單位,這限制了多個訪問請求的并發(fā)執(zhí)行,無法利用NVM存儲設備內部多個通道的并發(fā)執(zhí)行能力;同時使用鎖機制,需要將相應的進程在阻塞和就緒狀態(tài)之間進行調度,所需的大量時間開銷嚴重影響了NVM存儲系統(tǒng)的IO性能;當前NVM存儲設備還是使用PCIe(peripheral component interconnect express)或SAS(serial attached SCSI)等接口,這些相對NVM存儲器件較慢的接口是影響NVM存儲設備IO性能的瓶頸,但現有存儲系統(tǒng)只能借助主機CPU完成訪問請求的管理任務,并通過存儲設備接口獲取數據狀態(tài),這需要在存儲設備和主機之間頻繁地傳輸數據,從而進一步加重了存儲設備接口對NVM存儲系統(tǒng)IO性能的影響,同時還給主機CPU帶來了很大的計算壓力.總的來說,NVM存儲設備接近DRAM的數據讀寫速度使得現有IO棧(IO stack)成為影響NVM存儲系統(tǒng)IO性能的重要因素,相關研究[6]表明在用于NVM存儲系統(tǒng)時IO系統(tǒng)軟件的開銷占總開銷的94%以上;而NVM存儲設備具有較強的嵌入式處理能力,具備自主完成管理訪問請求的基礎,同時內部擁有多個可以并發(fā)的訪問通道,這給增加執(zhí)行訪問請求并發(fā)度、提高NVM存儲系統(tǒng)吞吐率提供了良好的基礎,但現有存儲系統(tǒng)還缺乏相應的優(yōu)化機制.
首先給出了當前NVM存儲系統(tǒng)相關的研究,分析了提高存儲系統(tǒng)吞吐率的相關策略.接著分析存儲系統(tǒng)中現有基于鎖的訪問請求管理機制,在此基礎上設計了基于沖突檢測的高吞吐NVM存儲系統(tǒng)(HTPM).并在開源的NVM存儲設備模擬器上實現HTPM的原型,使用Filebench和Fio等通用測試工具對HTPM的吞吐率和IO性能進行測試與分析,驗證HTPM的有效性.
本文的主要貢獻如下:
1) 將存儲系統(tǒng)訪問請求管理功能從文件系統(tǒng)遷移到NVM存儲設備中,能利用NVM存儲設備支持字節(jié)訪問和支持多通道讀寫等特性,縮小執(zhí)行不同訪問請求時需要互斥的數據塊粒度,提高訪問請求的并發(fā)執(zhí)行能力.
2) 使用基于存儲設備的沖突檢測方法代替基于鎖的文件系統(tǒng)訪問請求互斥機制,能有效增加存儲系統(tǒng)執(zhí)行訪問請求的并發(fā)度,提高存儲系統(tǒng)的吞吐率.
3) 利用NVM存儲設備的嵌入式處理能力,自主管理訪問請求,減少NVM存儲設備和主機之間傳輸的數據量,緩解NVM存儲設備接口對存儲系統(tǒng)IO性能的影響,減輕主機CPU的負擔.
4) 利用NVM存儲設備內具有能并行訪問的多個通道,增加執(zhí)行訪問請求的并發(fā)度,提高NVM存儲系統(tǒng)的吞吐率.
5) 實現基于沖突檢測的高并發(fā)NVM存儲系統(tǒng)的原型HTPM,使用Filebench中的Webserver,Varmail,Fileserver負載測試吞吐率,使用Fio測試順序讀寫和隨機讀寫的IO性能,結果表明HTPM與PMEM相比最高能提高31.9%的IOPS值和3.2%~21.4%的IO性能.
VM存儲設備具有低延遲、支持字節(jié)讀寫和接近內存的傳輸速度等特性,研究者們針對這些特性開展了大量的研究.下面分別從NVM的新型文件系統(tǒng)和構建NVM與DRAM的混合內存2方面介紹主要的研究工作.
Dulloor等人[7]設計了一種新型的輕量級POSIX(portable operating system interface of UNIX)文件系統(tǒng)PMFS,利用NVM存儲設備的字節(jié)尋址的能力來減少IO棧開銷,使得應用能直接訪問NVM存儲設備.此外,PMFS還利用處理器的分頁和內存排序功能減少日志記錄的粒度并支持更大的頁面,在保證一致性的同時提高內存映射和訪問的效率.Ou等人[8]提出的HiNFS使用寫緩沖策略隱藏NVM較長的寫延遲,并直接從DRAM和NVM存儲設備讀取文件數據,避免關鍵路徑中雙重復制的開銷.Sha等人[9]提出一種基于“文件虛擬地址空間”的新型文件系統(tǒng)SIMFS,充分利用了在文件訪問路徑上內存映射硬件.SIMFS將打開的文件地址空間嵌入到進程的地址空間中,將文件的處理轉交給存儲器映射硬件.通過這樣的方法極大地提高了文件系統(tǒng)的吞吐性能.NOVA文件系統(tǒng)[10-11]通過優(yōu)化日志提高并發(fā)度.它為每一個文件提供一個單獨的日志,在正常操作和恢復期間能有效提高執(zhí)行訪問請求的并發(fā)度;同時利用NVM存儲設備支持字節(jié)讀寫的特性,以鏈表的形式存儲日志,避免了在內存中需要連續(xù)空間存儲日志;對于那些涉及到多個inode的操作,NOVA使用輕量級的日志來減少時間和空間開銷.總的來說,NOVA能有效利用NVM存儲設備的特性提高日志結構文件系統(tǒng)的吞吐率和減少垃圾的開銷.XPMFS[12]提出了一種NVM存儲設備的自管理算法,利用NVM存儲設備中的嵌入式處理器完成存儲系統(tǒng)的管理,減少NVM存儲設備與CPU之間的傳輸,提高元數據管理效率并降低NVM存儲設備的寫放大問題.Zeng和Sha等人[13]設計了一種適用于NVM和塊設備的混合型文件系統(tǒng)NBFS,將單個文件的數據頁分發(fā)到NUMA(non uniform memory access architecture)架構和多個塊設備的多個存儲節(jié)點,還設計了一種基于數據訪問的數據遷移機制和優(yōu)化了塊設備的資源池,減少了額外的存儲開銷.Kannan等人[14]設計的DevFS是一種用戶級直接訪問的文件系統(tǒng),使用按需分配內存的機制,與文件相關聯的數據結構如IO隊列和日志等在文件打開或創(chuàng)建時才分配,直到文件刪除時才被釋放;使用動態(tài)分配的文件IO隊列和內存日志,能根據需求動態(tài)調整大小.Zheng等人[15]提出的Ziggurat能根據應用程序訪問模式、寫入大小以及應用程序在寫入完成之前停止的可能性來管理對NVM,DRAM或磁盤的寫操作.
NVM存儲設備具有接近內存的讀寫速度,研究者考慮將NVM存儲設備和DRAM設備一起構建混合緩存,來解決DRAM容量不足的問題.
Fan等人[16]提出了基于NVM和DRAM的協(xié)作混合高速緩存策略Hibachi,分離讀緩存和寫緩存,設計不同的方式分別管理以提高緩存的命中率;同時,Hibachi能夠動態(tài)地調整clean緩存和dirty緩存的大小,來適應不同的運行負載;此外,Hibachi能夠將隨機寫轉化為順序寫來提高存儲系統(tǒng)的吞吐量.Zuo等人[17]設計了一種基于位置共享的散列沖突解決方法,提出了一種寫入友好的路徑散列算法來減少NVM存儲設備的額外寫入操作.Liu等人[18]提出一種硬件與軟件協(xié)作的緩存機制HSCC,通過維護NVM到DRAM的地址映射,以及對頁表和TLB的擴展來跟蹤NVM頁面的訪問計數;從而簡化了硬件的設計,并為優(yōu)化軟件層中的緩存提供了支撐.Sha等人[19]提出虛擬線性可尋址桶(VLAB)的索引方法,通過建立連續(xù)的虛擬地址空間來提高地址查找的效率.Qureshi等人[20]提出了一種基于PCM的混合主存架構,同時具有DRAM低延遲和PCM大容量等優(yōu)勢;此外還設計了減少混合內存系統(tǒng)寫入操作的方法,能夠顯著延長混合主存中PCM的壽命.文獻[21]設計了NVMain2.0,使用NVM和DRAM構建混合型存儲系統(tǒng),具有用戶接口靈活、IO性能顯著提高和刷新粒度小等特點.Son等人[22]提出了一種日志文件系統(tǒng)中高性能的事務機制,通過分析Ext4JDB2事務傳輸過程中的IO操作以及加鎖機制,采用lock-free的數據結構,設計了以協(xié)作方式并發(fā)執(zhí)行IO操作的方法,提高讀寫數據的效率;但該方法主要從應用層和文件系統(tǒng)層優(yōu)化鎖機制,無法利用NVM存儲設備的嵌入式處理能力,也不能減少NVM存儲設備和主機之間需要傳輸的數據量.Dulloor等人[23]設計了一種基于DRAMNVM的異構存儲架構,使得開發(fā)人員能夠借助其提供的庫快速優(yōu)化存儲系統(tǒng).陳吉等人[24]設計了一種層次化的NVM和DRAM的異構內存系統(tǒng)SSLDC,該系統(tǒng)能在層次化混合內存上支持大頁.SSLDC使用直接映射的方式將NVM映射到DRAM上,并以4 KB的粒度來對數據快進行管理.與此同時,SSLDC還實現了一種DRAM的數據過濾機制來降低了粗粒度打來的內存帶寬的壓力.
當前的研究雖然能夠提高NVM存儲系統(tǒng)的性能,但未改變存儲系統(tǒng)中串行的訪問請求方式,無法利用NVM存儲設備所具有的多通道特性,存在執(zhí)行訪問請求效率低和導致大量數據復制等問題.
Fig. 2 Overall design of high concurrent NVM storage system based on conflict detection圖2 基于沖突檢測高吞吐NVM存儲系統(tǒng)的結構
傳統(tǒng)存儲設備不具備處理能力,只能依賴主機CPU完成訪問請求的組織和管理,需要在主機和存儲設備之間反復傳輸管理訪問請求所需的大量數據,這不僅僅增加了主機CPU的負擔,也使得較慢的存儲設備接口速度這一瓶頸問題更加突出.此外,訪問存儲系統(tǒng)需要給大量不同的應用提供數據存儲與訪問服務,需要保證大量訪問請求之間的互斥,這給存儲系統(tǒng)的IO性能帶來了很大的挑戰(zhàn).
現有基于文件系統(tǒng)的鎖機制一般以文件為單位進行訪問請求的互斥,如圖1所示,訪問請求A在訪問前需要對文件加鎖,但其僅需要訪問其中的少量數據或某一個數據塊;訪問請求B雖然與訪問請求A所訪問區(qū)域不重疊,但由于文件被加鎖機制,需要等待訪問請求A執(zhí)行完成后才能執(zhí)行.這種方式無法利用NVM存儲設備支持字節(jié)讀寫的特性,嚴重影響了執(zhí)行訪問請求的并發(fā)度,使用傳統(tǒng)存儲設備時對存儲系統(tǒng)IO性能的影響較小,但應用于NVM存儲設備時推遲執(zhí)行訪問請求對IO性能的影響很大.
Fig. 1 Traditional lock mechanism access process圖1 現有存儲系統(tǒng)的鎖機制
現有鎖機制會將被鎖訪問請求對應的進程調度到阻塞狀態(tài),等待喚醒后再切換到就緒狀態(tài);進程的調度和狀態(tài)轉換需要大量額外的時間開銷,而現有存儲系統(tǒng)中訪問請求的管理都是由主機CPU完成,這不僅需要反復在主機和NVM存儲設備之間傳輸大量數據,嚴重影響NVM存儲系統(tǒng)的IO性能,還會給主機CPU帶來大量的計算開銷.
NVM存儲設備中存在多個并發(fā)通道,能同時執(zhí)行對NVM存儲設備不同區(qū)域的訪問請求,但現有的訪問請求管理機制和鎖策略缺乏相應的優(yōu)化策略,使得訪問請求在存儲設備中還是以串行方式運行,嚴重影響了NVM存儲系統(tǒng)的吞吐率.
我們首先給出基于沖突檢測高吞吐NVM存儲系統(tǒng)的結構,再給出訪問請求的管理、調度、提交和釋放等方法.
NVM存儲設備具有極高的讀寫速度,傳統(tǒng)的鎖機制會嚴重影響其IO性能;同時NVM存儲設備具有處理能力,能獨立管理訪問請求.因此改造NVM存儲設備,使用訪問請求沖突檢測代替?zhèn)鹘y(tǒng)鎖機制,設計高吞吐的NVM存儲系統(tǒng),其結構如圖2所示.
HTPM在NVM存儲設備中增加了基于二維鏈表的訪問請求管理模塊、基于沖突檢測的訪問請求調度模塊、新訪問請求提交模塊和訪問請求釋放模塊.其中基于二維鏈表的訪問請求管理模塊負責存儲NVM存儲設備中的讀寫訪問請求,減少管理訪問請求的時間開銷;基于沖突檢測的訪問請求調度模塊用于代替基于文件系統(tǒng)的鎖機制,通過檢測訪問請求是否與現有的訪問請求存在沖突,判斷訪問請求能否執(zhí)行;新訪問請求提交模塊負責管理NVM存儲設備所接收的新訪問請求;訪問請求釋放模塊用于在訪問請求執(zhí)行完成后,對與其沖突的訪問請求進行管理.
由此HTPM能利用NVM存儲設備的嵌入式處理能力,自主組織和管理訪問請求,采用檢測訪問請求的方法代替時間開銷大的鎖操作,能減少NVM存儲系統(tǒng)與主機之間通信的數據量,提高NVM存儲系統(tǒng)執(zhí)行訪問請求的并發(fā)度和吞吐率.
存儲系統(tǒng)中讀與寫訪問請求存在很大的差異,讀訪問請求之間可以互相并發(fā),但寫訪問請求之間、讀寫訪問請求之間則可能存在互斥的關系;同時NVM存儲設備存在寫壽命有限的局限,以字節(jié)為單位執(zhí)行寫操作能延遲其使用壽命,而以字節(jié)為單位執(zhí)行讀操作則會給管理訪問請求帶來復雜性;因此將讀寫訪問請求分開,使用不同的數據結構和方法進行管理.首先給出讀和寫訪問請求的組織結構,再給出基于二維鏈表的訪問請求管理方法.
HTPM的讀訪問請求以塊為單位進行管理,如果上層應用提交的讀訪問請求包含多個數據塊,則將讀訪問請求以數據塊為單位拆分為多個讀訪問請求.圖3給出了HTPM中讀訪問請求的結構HtReq_read,使用五元組(Req_id,Block_id,R_in_id,Next_req,Wait_write)表示.其中,Req_id是該讀訪問請求的標識;Block_id表示該讀訪問請求所對應的數據塊標識;R_in_id表示上層讀訪問請求被拆分后對應子讀訪問請求的內部序號,用于在所有子讀訪問請求全部執(zhí)行完之后,再依據R_in_id將這些子讀訪問請求重新組合;Next_req用于保存當前讀訪問請求的下一個讀訪問請求;Wait_write指向與該讀訪問請求存在沖突的寫訪問請求鏈表,也是等待該讀訪問請求的所有寫訪問請求列表.
Fig. 3 Structure of read request圖3 讀訪問請求的結構
HTPM的寫訪問請求以字節(jié)為單位進行管理,在收到上層應用提交的寫訪問請求后,長度大于一個數據塊的寫訪問請求按照HTPM中劃分的數據塊進行拆分.如圖4所示,使用七元組HtReq_write(Req_id,Start_address,Length,W_in_id,Next_req,Wait_write,Wait_read)表示每個寫訪問請求.其中,Req_id是寫訪問請求的標識,Start_address是該寫訪問請求的啟始地址,Length是該寫訪問請求的大小,W_in_id是上層寫訪問請求被拆分后對應子讀訪問請求的內部序號,Wait_write是等待該寫訪問請求的寫訪問請求的鏈表,Wait_read是等待該寫訪問請求的讀訪問請求的鏈表.
Fig. 4 Structure of write request圖4 寫訪問請求的結構
在此基礎上,給出二維結構的訪問請求管理方法.用讀執(zhí)行隊列(read execute queue, REQ)表示可執(zhí)行讀訪問請求管理結構,如圖5所示,REQ是不與其他訪問請求沖突的所有讀訪問請求的鏈表,讀訪問請求之間可以并發(fā),但與寫訪問請求會存在沖突,因此在每個HtReq_read結構中再使用Wait_write鏈接與其存在沖突的寫訪問請求.
Fig. 5 Read access request management structure based on two-dimensional linked list圖5 基于二維鏈表的讀訪問請求管理結構
圖6給出的是可執(zhí)行寫訪問請求管理結構的示意圖,用寫執(zhí)行隊列(write execute queue, WEQ)表示,對應的是當前不與其他訪問請求沖突的所有寫訪問請求鏈表;寫訪問請求與其他讀、寫訪問請求之間均可能存在沖突,因此每個HtReq_write使用2個指針Wait_write和Wait_read鏈接與其存在沖突的寫訪問請求和讀訪問請求.
Fig. 6 Write access request management structure based on two-dimensional linked list圖6 基于二維鏈表的寫訪問請求管理結構
由此,能適應讀寫訪問請求的不同特性,使用不同粒度管理2類訪問請求,為減少訪問請求之間沖突的概率,提高執(zhí)行訪問請求的并發(fā)度提供支撐.
在HTPM基于二維鏈表訪問請求管理結構的基礎上,設計基于沖突檢測的訪問請求調度算法,替代現基于文件系統(tǒng)的鎖機制,減少管理訪問請求時的額外時間開銷.
HTPM收到一個新訪問請求后,依據HtReq_read中保存的Block_id以及HtReq_write中的Start_address和Length,判斷與現有訪問請求對應的數據區(qū)之間是否存在覆蓋,決定新訪問請求與當前的可執(zhí)行訪問請求之間是否沖突.如圖7(a)所示,假設當前只有訪問請求A,判斷新訪問請求B與現有可執(zhí)行訪問請求之間無沖突,則新訪問請求B可以執(zhí)行;如圖7(b)所示,新訪問請求B與現有可執(zhí)行訪問請求之間存在數據區(qū)覆蓋,則判斷訪問請求B與訪問請求A之間存在沖突.
Fig. 7 Conflict detection mechanism圖7 沖突檢測方法
當HTPM檢測新訪問請求與現有訪問請求之間存在沖突時,會出現以下4種情況.
第1種情況:新增讀訪問請求與現有讀訪問請求之間存在沖突.如圖8所示,讀訪問請求之間可以并發(fā)執(zhí)行,雖然新增讀訪問請求與現有讀訪問請求之間存在沖突,但新增讀訪問請求同樣可以執(zhí)行,因此將其加入到REQ的尾部.
Fig. 8 Conflict between the new and current read request圖8 新增讀與現有讀訪問請求之間的沖突
第2種情況:新增寫訪問請求與現有讀訪問請求之間存在沖突.如圖9所示,此時新增寫訪問請求必須等待現有讀訪問請求執(zhí)行完才能執(zhí)行,因此將其加入到現有讀訪問請求中Wait_write所指向的等待隊列中.
Fig. 9 Conflict between the new write and current read request圖9 新增寫與現有讀訪問請求之間的沖突
第3種情況:新增讀訪問請求與現有寫訪問請求之間存在沖突.如圖10所示,此時新增讀訪問請求必須等待現有寫訪問請求執(zhí)行完才能執(zhí)行,因此將其加入到現有寫訪問請求中Wait_read所指向的等待隊列中.
Fig. 10 Conflict between the new read and current write request圖10 新增讀與現有寫訪問請求之間的沖突
第4種情況:新增寫訪問請求與現有寫訪問請求之間存在沖突.如圖11所示,此時新增寫訪問請求必須等待現有寫訪問請求執(zhí)行完才能執(zhí)行,因此將其加入到現有寫訪問請求中Wait_write所指向的等待隊列中.
Fig. 11 Conflict between the new and current write request圖11 新增寫與現有寫訪問請求之間的沖突
由此,使用基于沖突檢測的方法代替基于文件系統(tǒng)鎖機制,配合3.2節(jié)所設計的訪問請求管理方法,能有效降低訪問請求沖突的概率,提高執(zhí)行訪問請求的并發(fā)度;同時將需要訪問請求的互斥管理分散到各個訪問請求中,降低了管理訪問請求的復雜度,也減少了修改訪問請求管理結構時需要封鎖的粒度,通過降低管理訪問請求對應數據結構所需時間開銷,提高NVM存儲系統(tǒng)的性能.
HTPM收到上層應用提交訪問請求后,需要使用基于沖突檢測的訪問請求調度算法分別與REQ和WEQ中可執(zhí)行的讀寫訪問請求進行比較,以判斷新訪問請求能否提交給HTPM執(zhí)行.
新增讀訪問請求向HTPM的提交算法流程為:將一個新增的讀訪問請求提交到HTPM時,因為讀訪問請求之間可以并發(fā)執(zhí)行,僅使用WEQ中可執(zhí)行寫訪問請求hr與新增讀訪問請求hrr進行沖突檢測;如存在沖突,那么就將hrr插入到hr的Wait_read指針所指向的沖突鏈表中,并結束循環(huán).如果hrr和WEQ中所有可執(zhí)行寫訪問請求hr均無沖突,那么就將其插入到REQ的末尾,作為可以執(zhí)行的讀訪問請求,并等待HTPM的執(zhí)行.
算法1.新增讀訪問請求向HTPM的提交算法.
輸入:HTPM中的讀請求hrr.
① for eachhrin WEQ do
② lethr與hrr進行沖突檢測;
③ ifhr與hr存在訪問沖突 then
④ lethrr插入到hr.Wait_read;
⑤ break;
⑥ else
⑦ continue;
⑧ end if
⑨ end for
⑩ lethrr插入到REQ.tail.
新增寫訪問請求向HTPM的提交算法流程為:寫訪問請求與現有可執(zhí)行讀和寫訪問請求均可能存在沖突,所以提交一個新寫訪問請求時,需要將其與REQ和WEQ中可執(zhí)行的訪問請求均進行沖突檢測;首先將新增寫訪問請求hrw分別與REQ和WEQ中的可執(zhí)行訪問請求hr進行沖突檢測.如果存在沖突,那么將hrw插入到REQ和WEQ中可執(zhí)行訪問請求的Wait_write指針指向的沖突鏈表中;否則,將該新增寫訪問請求hrw插入到WEQ的末尾,并提交給HTPM執(zhí)行.
算法2.新增寫訪問請求向HTPM的提交算法.
輸入:HTPM中的讀請求hrr.
① EQ是REQ和WEQ的并集;
② for eachhrin EQ do
③ lethr與hrr進行沖突檢測;
④ ifhrr與hr存在訪問沖突 then
⑤ lethrr插入到hr.Wait_write;
⑥ break;
⑦ else
⑧ continue;
⑨ end if
⑩ end for
HTPM在執(zhí)行完REQ或WEQ中某個訪問請求后,需要釋放REQ或WEQ結構中記錄的存在沖突讀寫訪問請求,但這些讀寫訪問請求還可能會與其他現有可執(zhí)行訪問請求存在沖突.
在訪問請求中保存沖突數或沖突指針等方法,可以用于判斷能否釋放訪問請求,但每次修改沖突計數或沖突指針均需要進行加解鎖操作,帶來了較高的時間開銷,難以適應NVM存儲系統(tǒng)讀寫速度高的特性.
同樣,利用NVM存儲設備的嵌入式處理器檢測等待釋放的訪問請求,代替?zhèn)鹘y(tǒng)的鎖機制,設計已有訪問請求釋放算法,如算法3所示:
算法3.HTPM中請求釋放算法.
輸入:HTPM中的讀請求hrr(hrr已執(zhí)行).
① ifhrr是讀請求 then
② for eachhrinhrr.Wait_write;
③ 使用算法1處理hr;
④ end for
⑤ else ifhrr是寫請求
⑥ letlist=intersection ofhr.Wait_readandhr.Wait_write;
⑦ for eachhrinlistdo
⑧ 使用算法1處理hr;
⑨ end for
⑩ end if
當一個讀訪問請求hr執(zhí)行完成后,遍歷其Wait_write鏈表中的訪問請求,將這些訪問請求作為HTPM的新訪問請求,使用3.3節(jié)和3.4節(jié)中給出的算法進行檢測.當寫訪問請求hr執(zhí)行完成之后,遍歷其Wait_write和Wait_read鏈表中的訪問請求,同樣將這些訪問請求作為HTPM的新訪問請求,使用3.3節(jié)和3.4節(jié)中給出的算法進行檢測.
由此避免了使用鎖機制,便于提高NVM存儲系統(tǒng)執(zhí)行訪問請求的并發(fā)性,從而提高NVM存儲系統(tǒng)的吞吐率.
我們首先給出模擬NVM存儲設備的方法,再給出HTPM原型系統(tǒng)的實現方法.
由于沒有可用的NVM設備,我們采用Intel的基于內存的開源NVM存儲設備模擬器PMEM[25]來模擬NVM存儲設備;同時在Linux內核地址的尾部預留40 GB的空間作為PMEM的存儲地址空間.
PMEM是使用DRAM存儲數據,沒有模擬NVM存儲介質寫速度低于DRAM的特性,我們在PMEM中增加寫入延遲,參考文獻[8,26]中的方法,在每次clflush和mfence指令之后增加200 ns的延遲來模擬NVM存儲介質寫入速度低于DRAM的特性.
首先在開源的PMEM的nd_pmem模塊中,增加了讀寫請求結構HtReq_read和HtReq_write以及讀寫請求執(zhí)行隊列結構REQ和WEQ.接著在PMEM中增加基于二維鏈表的訪問請求管理模塊、基于沖突檢測的訪問請求調度模塊、新訪問請求提交模塊和訪問請求釋放模塊,構建HTPM的原型,修改和增加了約1 000多行代碼.
此外,對4.4.4112版本內核的EXT4文件系統(tǒng)和XFS文件系統(tǒng)模塊進行修改,去除讀寫函數內的加解鎖操作,使訪問請求直接被提交至HTPM,由HTPM統(tǒng)一管理訪問請求、實現多個訪問請求訪問同一數據時的互斥.
使用一臺服務器構建HTPM原型系統(tǒng)的測試環(huán)境,該服務器的配置如表1所示:
Table 1 Configuration of Evaluation表1 原型系統(tǒng)測試環(huán)境的軟硬件配置
分別在HTPM上加載Ext4和XFS這2種文件系統(tǒng),數據塊大小設置為4 KB,首先使用Filebench中的Webserver,Varmail,Fileserver負載,模擬存儲系統(tǒng)的不同運行環(huán)境,測試HTPM的吞吐率,再使用Fio測試順序和隨機讀寫的IO性能,并與PMEM進行比較.
每項均測試10次,并在每次測試之后重啟服務器來和禁用緩存以消除緩存對測試結果的影響,最后取10次測試的平均值作為測試結果.
分別在PMEM和HTPM上加載Ext4和XFS文件系統(tǒng),使用Filebench的Webserver負載,模擬用戶訪問Web服務器的情況,設置測試文件數量為1 000,每個目錄中創(chuàng)建20個文件,每次IO大小為1 MB,IO操作中讀寫訪問請求的比例為10∶1,測試時間為60 s,測試線程數量為2,4,6,8,10,12,14時的吞吐率IOPS(InputOutput operations per second)值,結果如圖12所示.
從圖12可以看出,相比PMEM,HTPM能有效提高Ext4和XFS的IOPS值.當線程數量為2時,IOPS值分別提高了6.1%和6.3%.這是因為Webserver負載中大部分是讀訪問請求,還不能充分體現HTPM中基于沖突檢測的訪問請求調度算法相比傳統(tǒng)鎖機制的優(yōu)勢.隨著線程數增加到8,PMEM上Ext4和XFS的IOPS值達到了最大值,之后隨著線程數的增加,IOPS的值逐漸下降,這是由于隨著線程數的增加,訪問請求之間的鎖操作越來越多,影響了訪問請求執(zhí)行的并發(fā)度;而HTPM在線程數為8時,相比PMEM,Ext4和XFS的IOPS值分別提高了17.2%和17.1%;同時隨著線程數的繼續(xù)增加,HTPM上Ext4和XFS的IOPS值能保持不降低,這是由于HTPM中基于沖突檢測的訪問請求調度算法避免了多線程時鎖機制帶來的額外時間開銷.這些結果表明,HTPM能更好地適應多線程環(huán)境的訪問特性,相比PMEM具有更穩(wěn)定的吞吐率.
Fig. 12 Webserver workload test圖12 使用Webserver負載的測試
使用Filebench的Varmail負載,模擬Email服務器的使用情況.設置文件數量為1 000,每個目錄中創(chuàng)建的文件數量為1 000 000,每次IO大小為1 MB,IO操作中讀寫訪問請求的比例為 1∶1,測試時間為60 s,測試線程數量為2,4,6,8,10,12,14時的吞吐率IOPS值,結果如圖13所示.
從圖13可以發(fā)現,HTPM上Ext4和XFS的IOPS值相比PMEM均有所提高.在線程數小于6時,XFS的IOPS值隨著線程數增加而逐步提高;在線程數為6時,PMEM上XFS的IOPS值達到最大值,此時HTPM上XFS相比PMEM上XFS能提高18.2%的IOPS值;隨著線程數的進一步增加,PMEM上XFS的IOPS值開始逐步下降,而HTPM上XFS的IOPS值則始終保持不變.
Ext4的IOPS值情況類似,PMEM上Ext4的IOPS最大值出現在線程數為14時,此時Ext4在HTPM上的IOPS值要比在PMEM上提升了25.5%.此外,使用Varmail負載時,HTPM上Ext4的IOPS值比XFS的IOPS值高出很多,這是由于Varmail負載中小文件居多,而XFS讀寫小文件的效率低于Ext4.
Fig. 13 Varmail workload test圖13 使用Varmail負載測試的測試
使用Filebench的Fileserver負載,模擬文件服務器中文件共享和讀寫操作等情況.設置文件數量為10 000,每個目錄中創(chuàng)建20個文件,每次IO大小為1 MB,IO操作中讀寫訪問請求的比例為1∶10,測試時間為60 s,測試線程數量為2,4,6,8,10,12,14時的吞吐率IOPS值,結果如圖14所示.
Fig. 14 Fileserver workload test圖14 使用Fileserver負載的測試
從圖14可以發(fā)現,當線程數為2時,HTPM上Ext4和XFS的IOPS值相比PMEM提高了15.2%和17%;隨著進程數量的增加,相比PMEM,HTPM上Ext4和XFS的IOPS值所增加的幅度不斷提高;在線程數為12時,PMEM上Ext4和XFS的IOPS值達到了最大值,此時Ext4和XFS在HTPM上相比PMEM提高了31.9%和30.3%;隨著線程數繼續(xù)增加,PMEM上Ext4和XFS的IOPS值開始下降,而HTPM上Ext4和XFS的IOPS值則保持穩(wěn)定.相較于Webserver和Varmail負載,使用Fileserver負載時,HTPM上Ext4和XFS的IOPS值提高幅度更大.這是因為Fileserver負載中寫訪問請求的比例較高,所導致的鎖操作也更多,從而能更好地體現出基于沖突檢測的訪問請求調度算法相比鎖機制的優(yōu)勢.
Fig. 15 Sequential read test圖15 順序讀的測試
從圖15可以發(fā)現,當線程數為6讀寫塊大小為4 KB,16 KB,256 KB時,HTPM順序讀IO性能相比PMEM分別提升了3.4%,4.3%,5.4%;當線程數為12時,HTPM所提高的IO性能比例更高;這表明HTPM能更好地適應高并發(fā)的運行環(huán)境,發(fā)揮NVM存儲設備的優(yōu)勢,通過增加執(zhí)行訪問請求的并發(fā)度,提高存儲系統(tǒng)的IO性能.
Fig. 16 Sequential write test圖16 順序寫的測試
從圖16可以看出,在線程數為6讀寫塊大小為4 KB,16 KB,256 KB時,HTPM順序寫IO性能相比PMEM分別提升了12.3%,14.7%,17.3%;當線程數為12時,HTPM的順序寫IO性能相比PMEM分別提升了15.6%,18.4%,21.4%;相比順序讀,HTPM相比PMEM在執(zhí)行順序寫操作時所提高的IO性能比例更高,這是因為寫操作會導致更多的鎖操作,從而更好地體現了基于沖突檢測訪問請求調度算法的優(yōu)勢.
NVM存儲設備相比傳統(tǒng)存儲設備隨機讀寫性能更高,但同時也會使得現有IO棧成為影響存儲系統(tǒng)IO性能的瓶頸.再使用Fio測試HTPM隨機讀寫IO性能,首先測試隨機讀的IO性能,選擇Fio中的異步IO引擎libaio,隊列深度設置為32,測試數據的大小為10 GB,測試時間為60 s,使用direct參數跳過緩存,測試線程的數量分別為6和12,讀寫塊大小分別為4 KB,16 KB,256 KB.結果如圖17所示.
Fig. 17 Random read test圖17 隨機讀的測試
從圖17可以看出,在線程數為6讀寫塊大小為4 KB,16 KB,256 KB時,HTPM相比PMEM分別提升了3.2%,4.1%,5.1%的隨機讀IO性能;在線程數為12時,HTPM的隨機讀IO性能相比PMEM分別提升了5.1%,5.4%,5.9%;總的來說,HTPM相比PMEM隨機讀IO性能提高的比例與順序讀接近,這表明HTPM在執(zhí)行隨機讀操作時同樣具有較好的優(yōu)勢.
Fig. 18 Random write test圖18 隨機寫的測試
從圖18可以看出,在線程數為6讀寫塊大小為4 KB,16 KB,256 KB時,HTPM相比PMEM分別提升了11.4%,13.2%,17.1%的隨機寫IO性能.當線程數為12時,HTPM的隨機寫IO性能相比PMEM分別提升了14.5%,17.2%,20.4%.此外與順序讀寫的測試結果類似,HTPM在執(zhí)行隨機寫操作時所提高IO性能的比例高于執(zhí)行隨機讀操作時.
NVM存儲設備能有效解決計算機系統(tǒng)的存儲墻問題,具有接近DRAM的讀寫速度、嵌入式處理能力、內部多通道并發(fā)讀寫能力和較慢速的設備接口等一些列特性,這給現有IO棧帶來了很大的挑戰(zhàn).基于文件系統(tǒng)的鎖機制是影響其構建的NVM存儲系統(tǒng)性能的重要因素.
本文將存儲系統(tǒng)訪問請求的管理嵌入到存儲設備中,使用基于沖突檢測的訪問請求調度算法代替現有基于文件系統(tǒng)的鎖機制,提高NVM存儲系統(tǒng)的吞吐率.首先給出了高吞吐NVM存儲系統(tǒng)的結構;接著給出了基于二維鏈表訪問請求管理方法、基于沖突檢測的訪問請求調度算法、新訪問請求提交和已有訪問請求釋放流程,利用NVM存儲設備的嵌入式處理器自主完成訪問請求的管理,提高訪問請求執(zhí)行并發(fā)度,緩解速度較低的設備接口所帶來的瓶頸問題;最后實現了HTPM的原型系統(tǒng),使用Filebench中的多種負載和Fio測試了HTPM的性能,實驗結果表明,HTPM相比PMEM最大能提高31.9%的IOPS值和21.4%的IO性能.
HTPM還未考慮REQ和WEQ之間的協(xié)調和優(yōu)化隊列管理,也未考慮多核環(huán)境下的優(yōu)化策略,下一步擬從這2方面進行改進,進一步提高NVM存儲系統(tǒng)的性能.