張 陌, 張云舟, 謝 剛, 張 剛
(1. 太原理工大學(xué) 信息工程學(xué)院, 山西 太原 030024; 2. 三亞中科遙感研究中心, 海南 三亞 572029;3. 太原科技大學(xué), 山西 太原 030027)
個人存儲裝備PSE(Personal Storage Equipment)與個人計算機(jī)一同問世, 起初特指計算機(jī)內(nèi)存和外部存儲裝置, 這里指主機(jī)文件系統(tǒng)可直接訪問的任何存儲系統(tǒng). 在存儲容量和訪問速度兩個方面, 大數(shù)據(jù)處理對PSE的要求極為苛刻[1]. 云存儲管理大批低造價、 小規(guī)模、 低性能的存儲資源, 低成本提供大規(guī)模、 高性能的存儲服務(wù)[2], 利用Map/Reduce將一個龐大的訪問分解成眾多微小讀寫, 通過并行處理獲得資源越多訪問速度越快的優(yōu)勢[3]. 但云存儲不是一個裝備, 而是部署在網(wǎng)絡(luò)上的服務(wù)體系, 它在網(wǎng)絡(luò)帶寬、 安全和可移動上先天不足[4]. 目前云存儲的映射/規(guī)約機(jī)制尚未覆蓋存儲陣列內(nèi)部, PSE內(nèi)部的上百硬盤不具備資源越多訪問速度越快的特點, 將Map/Reduce遷移到PSE內(nèi)部使其覆蓋每一個硬盤, 是一項極富創(chuàng)新的挑戰(zhàn)[5].
文件系統(tǒng)的一個邏輯單元包括若干連續(xù)物理扇區(qū)[6], 例如Linux的邏輯塊為2~8個扇區(qū)[7], Windows的簇最多64扇區(qū). 邏輯單元和物理扇區(qū)的地址轉(zhuǎn)換消耗大量內(nèi)存和計算負(fù)載, 制約著大數(shù)據(jù)的訪問效率. 如果PSE物理尋址粒度與文件系統(tǒng)邏輯單元尺寸相同則無需地址轉(zhuǎn)換, 但后果是: PSE的物理尋址粒度必須支持現(xiàn)場定制, 以便適配加載不同文件系統(tǒng). 為此本文提出超扇區(qū)SS(Super Sector)的概念, 設(shè)計了矩型陣列RA(Rectangle Array)硬盤組結(jié)構(gòu)實現(xiàn)可伸縮的物理尋址粒度, 形成一個基本RA陣列的PSE樣機(jī). 基于SS, 云存儲的Map/Reduce可以遷移到RA陣列實現(xiàn)為一種硬件, 多個RA陣列堆疊連接, 在擴(kuò)容的同時可實現(xiàn)提速, 是一種用于大數(shù)據(jù)處理的粒度可伸縮的物理尋址模式[8].
目前大數(shù)據(jù)的存儲規(guī)??蛇_(dá)PB級, 扇區(qū)作為物理尋址粒度已不合時宜, 尺寸可伸縮的物理尋址粒度有利于擴(kuò)展. 本節(jié)討論超扇區(qū)SS的解決方案.
傳統(tǒng)PSE基于級聯(lián)擴(kuò)展芯片, 是樹型陣列架構(gòu)[9], 其葉子節(jié)點是單獨(dú)硬盤[10], 或是1行×p列的RAID陣列, 如圖 1 所示[11].
圖 1 樹型結(jié)構(gòu)的磁盤級聯(lián)擴(kuò)展Fig.1 Tree-type architecture of disks extension
這種級聯(lián)樹型陣列不支持多個扇區(qū)的點對多點并行讀寫, 只能依據(jù)物理扇區(qū)地址先建立一個訪問路由, 然后執(zhí)行一個扇區(qū)流的點對單點順序讀寫. 一種類似云存儲的訪問模式是建立邏輯空間到物理扇區(qū)的映射規(guī)約機(jī)制, 部署多個獨(dú)立引擎并行讀寫一個邏輯單元的連續(xù)n個扇區(qū). 為此圖 1 的級聯(lián)樹型結(jié)構(gòu)必須拋棄, 采用一種q行p列的矩型RA陣列, 如圖 2 所示. RA陣列有p個通道, 每通道有q個磁盤, 可部署q×p個讀寫引擎并行讀寫多個扇區(qū).
圖 2 q×p矩型陣列結(jié)構(gòu)Fig.2 Rectangle-type architecture of q×p disks array
在圖 2 的RA陣列的q×p個硬盤中, 起始地址相同的r(r≥1)個連續(xù)扇區(qū)組成了一個尺寸為n個扇區(qū)的存儲區(qū)域, 這里
n=r×p×q.(1)
本文將式(1)規(guī)定的存儲區(qū)域定義為一個超扇區(qū)SS, RA陣列Disk00磁盤的r個扇區(qū)的起始地址作為SS的地址, 其內(nèi)部任何一個扇區(qū)損壞則該SS損壞. 這種超扇區(qū)建立在文件系統(tǒng)初始化之前, 是一種物理存儲單元. 通過調(diào)整參數(shù)r,p和q, 可使SS尺寸與文件系統(tǒng)邏輯單元相同, 由此獲得可伸縮的物理尋址粒度.
RA陣列p個通道可進(jìn)一步表示成m組子通道, 第i個子通道組的物理通道數(shù)目為pi(i=0,…,m-1), 那么
p=p0+p1+…+pm-1.(2)
劃分m個子通道組有利于堆疊連接多個基本RA陣列, 進(jìn)一步擴(kuò)大SS尺寸的伸縮范圍, 組成規(guī)模更大的PSE. 也可設(shè)置專門通道存放校驗信息或設(shè)置鏡像通道組.q×p個引擎可以并行讀寫一個SS的n個扇區(qū), 每個引擎讀寫r個扇區(qū). 這里讀寫引擎是主機(jī)端模式,q×p個磁盤是設(shè)備端. 此外, RA陣列作為一個PSE以設(shè)備端模式工作, 須為SS建立一種消息結(jié)構(gòu), 記作邏輯尋址結(jié)構(gòu)LAS(Logical Addressing Structure). 基于LAS定義主機(jī)訪問RA陣列的通信協(xié)議, 實現(xiàn)主機(jī)訪問RA陣列的設(shè)備驅(qū)動.
與傳統(tǒng)PSE的樹形結(jié)構(gòu)相比, RA陣列的q×p個引擎并行讀寫, 有利于硬件實現(xiàn)映射規(guī)約機(jī)制, 本節(jié)討論實現(xiàn)方案.
選用一片Xilinx的XC7K325T作陣列控制器RAC(RA Controller)[12], 用多片Marvell的端口復(fù)用芯片88SM9705作存儲擴(kuò)展[13], 設(shè)計了一個q×p磁盤的基本RA陣列, 其整體方案如圖 3 所示.
圖 3 基本RA陣列原理圖Fig.3 Schedule of a basic RA
K7-325內(nèi)部資源包括PCIe 2.0硬核, PCIe 3.0軟核以及16條12.5 G的高速GTX通道, 其中8條GTX建立一個40 G帶寬的PCIe 2.0×8總線, 另外8條GTX各自接入一個Marvell的PM芯片88SM9705, 其內(nèi)嵌的64MB高速緩存可無阻塞實施1-to-5的SATA3.0端口擴(kuò)展, 總計提供最多40個6G帶寬的SATA3.0盤位.
圖 3 的RAC內(nèi)部包括報文處理器MP(Message Processer)、 超扇區(qū)控制器SSC(SS Controller)和通道管理器CM(Channel Manager). 其中MP負(fù)責(zé)解析PCIe通道的LAS報文, 以及將訪問結(jié)果封裝成LAS消息提交到PCIe通道.
由于SS的尺寸與文件系統(tǒng)邏輯單元一致, 無需地址轉(zhuǎn)換SSC可直接讀寫RA陣列, 其流程: 先將SS的n=r×p×q個扇區(qū)映射到p個通道, 每通道讀寫r×q個扇區(qū); 再由各個通道的讀寫引擎CM將r×q個扇區(qū)依次讀寫到q個磁盤, 每磁盤訪問r個連續(xù)扇區(qū), 這樣硬件實現(xiàn)的映射規(guī)約機(jī)制與云存儲的MapReduce相當(dāng). 通道管理器CM負(fù)責(zé)生成訪問SATA磁盤的FIS并提交給PM芯片, 由9705實施物理扇區(qū)的讀寫.
文件系統(tǒng)設(shè)備驅(qū)動由HD(High Driver)和LD(Low Driver)兩部分組成. 其中HD負(fù)責(zé)生成邏輯空間的塊IO流, 而LD負(fù)責(zé)將邏輯空間的一個塊IO映射為物理扇區(qū)IO的流[14]. 由于SS既是文件系統(tǒng)的邏輯單元也是RA陣列的物理單元, RAC內(nèi)部的CM負(fù)責(zé)扇區(qū)IO讀寫, 所以RA陣列只需HD驅(qū)動, 其任務(wù): ① 定義訪問SS的消息格式LAS, 實現(xiàn)報文處理模塊MP; ② 在通道管理器CM中實現(xiàn)低端驅(qū)動LD.
LAS報文格式是文件系統(tǒng)訪問RA陣列的通信協(xié)議, 本質(zhì)上是超扇區(qū)版本的FIS協(xié)議, 相對比較簡單. 需要在初始化之前確定LAS的邏輯尋址粒度缺省值, 即一個SS擁有的扇區(qū)數(shù). 對于本例RA陣列的8個通道, Linux的邏輯塊為8扇區(qū), 參數(shù)可初始化為r=q=1. 而Windows的簇為64扇區(qū), 參數(shù)初始化為r=2, 4或8, 而q=4, 2或1. 針對初始化參數(shù)的各種組合設(shè)計VHDL程序, 初始化時根據(jù)需要選擇相應(yīng)目標(biāo)代碼裝入K7-325, 生成不同的RAC硬件.
在陣列控制器RAC內(nèi)部有一個地址寄存器, 用來指定RA陣列在邏輯存儲空間的起始和終止地址. 以Linux的EXT4為例, 邏輯塊尺寸為8扇區(qū)[15], 1EB的邏輯空間尋址248個邏輯塊[16]. 這里定義連續(xù)230個塊為1個邏輯節(jié)點N(Node, 4TB). RA地址寄存器包括1個18位的起始節(jié)點地址, 即在EXT4邏輯存儲空間, 該RA陣列起始塊地址的高18位, 指向該RA陣列的首個節(jié)點. 還包括1個8位的節(jié)點偏移, 指向該RA陣列的最后一個節(jié)點. 在LAS消息格式中有一個目的地址字段, 其值若超出此地址寄存器限定的范圍, 該LAS消息將被忽略, RAC不予處理. 初始化時分別計算并設(shè)置各個基本RA陣列的起始和終止地址, 運(yùn)行時RAC的消息處理模塊解析來自PCIe的LAS報文, 提取LAS中目的地址字段, 并與本地RAC地址寄存器比較, 判斷是否忽略該消息, 僅處理目的地址命中的訪問.
通過設(shè)置各自內(nèi)部地址寄存器, 圖3的多個基本RA陣列可堆疊連接構(gòu)成規(guī)模更大的PSE[8]. 這與以太網(wǎng)的IP地址極為相似, 屬于一種云存儲的訪問模式[5].
測試基于Linux系統(tǒng)進(jìn)行, 1個RA陣列有40個1TB的SATA3.0硬盤即10個4TB的邏輯節(jié)點, 其樣機(jī)已經(jīng)測試通過.
CMi表示第i個通道管理器, 它接收來自SSC的一個以r×q扇區(qū)為單元的數(shù)據(jù)流, 生成并輸出相應(yīng)的FIS流. SATA3.0的FIS協(xié)議支持端口復(fù)用器PM[17], 依靠FIS流可以在CM與PM芯片之間交換數(shù)據(jù)和控制信息, 其原理見圖 4.
圖 4 CM內(nèi)部模塊Fig.4 CM internal modules
圖 4 的虛框是通道管理器CM, 其中父子緩沖區(qū)P/O是一個乒乓緩存, 以扇區(qū)為單元與外部交換數(shù)據(jù), 原理見圖 5.
P/O含有2個512B的雙端口RAM, 由扇區(qū)計數(shù)最低位及其取反信號crc_bit組合控制, 使得任何時刻一個RAM執(zhí)行寫入, 另一個讀出. 地址計數(shù)器的8位由0順序增加至FF再歸0, 扇區(qū)計數(shù)器增1, 觸發(fā)父子緩沖區(qū)的RAM交換讀/寫角色. 寫入地址可與讀出地址共享, 也可用一個隨機(jī)數(shù)發(fā)生器實施寫入地址亂序加擾. 保存隨機(jī)數(shù)發(fā)生器的種子可正常讀出數(shù)據(jù), 而非正常離開系統(tǒng)的存儲介質(zhì)只能讀出亂序數(shù)據(jù). 調(diào)整隨機(jī)數(shù)生成算法可避免雷同的亂序效果, 父/子緩沖的測試結(jié)果見圖 6.
圖 5 父代子代緩存Fig.5 Parent and offspring buffer
圖 6 父/子緩存測試結(jié)果Fig.6 Test result of parent and offspring buffer
由圖 6, 最初p_eni = 1數(shù)據(jù)寫入父代緩沖區(qū). 寫滿1個扇區(qū)后p_eni = 0, 父代緩沖區(qū)從寫入操作轉(zhuǎn)為讀出, 而o_eni = 1激活子代緩沖區(qū)寫使能, 后續(xù)數(shù)據(jù)寫入子緩存. 讀出操作與寫入同步執(zhí)行, 這里不再詳述. 每個通道有2組P/O緩存, 分別部署在2個方向: PCIe→PM、 PM→PCIe.
端口控制器PC負(fù)責(zé)初始化PM芯片, 并與父/子緩沖區(qū)組合生成訪問PM的FIS流, 充當(dāng)?shù)投蓑?qū)動LD角色. 廠商提供了PM芯片9705的C驅(qū)動, 這里將其改寫為VHDL代碼并測試通過. 通過設(shè)置FIS的端口號, PC可以訪問PM不同端口上的SATA設(shè)備. SATA3.0協(xié)議的讀命令為25 h, 寫命令為34h, 收到讀寫命令后設(shè)備回復(fù)一個DMA Acitve的FIS, 建立DMA通信后發(fā)送數(shù)據(jù)FIS. PC將發(fā)送緩存的2個扇區(qū), 連續(xù)寫入PM的2個不同端口的相同位置, 圖 7 是邏輯分析儀抓取的測試結(jié)果. 可以看出, 每當(dāng)設(shè)備完成一個寫數(shù)據(jù)就會返回一個R_OK原語, 表示數(shù)據(jù)寫入成功.
圖 8 表示PC發(fā)送一個讀命令FIS, 端口1提交的數(shù)據(jù)FIS, 其中第一個雙字內(nèi)容為0x00000146, 表示數(shù)據(jù)來自PM端口1.
圖 7 和圖 8 的測試結(jié)果說明通道管理器CM可以正常實現(xiàn)SATA3.0的端口復(fù)用訪問功能. RA陣列的8個通道完全相同, 這里不再一一敘述.
這樣組成40盤位的RA陣列, 其RAC參數(shù)初始化為r=q=1. RAC的報文處理器MP從LAS消息中提取出1個超扇區(qū)SS的IO訪問請求, 由超扇區(qū)控制器SSC映射為8個扇區(qū)IO的訪問請求, 分別交付到8個通道處理. 反過來也一樣, SSC將8個通道讀取的扇區(qū)數(shù)據(jù)匯聚(規(guī)約)成超扇區(qū)SS, 再由MP經(jīng)PCIe總線交付主機(jī).
圖 7 寫PM的不同硬盤Fig.7 Writing different hard disks of PM
圖 8 PC讀取PM端口1的數(shù)據(jù)FISFig.8 PC readout a data FIS of port 1
與圖1傳統(tǒng)陣列使用單獨(dú)讀寫引擎的順序訪問模式不同, 本文的RA陣列每個通道都部署了獨(dú)立的讀寫引擎, 同時讀寫p個通道可實現(xiàn)p倍提速. 本例中的RA陣列有8個6G帶寬的SATA3.0通道, 理論上匯聚帶寬可達(dá)48G, 此即云存儲“資源越多速度越快”的特點.
額外增加一個校驗通道容易實現(xiàn)各種RAID算法. 引入超扇區(qū)的附帶好處是可大大緩解過度集中訪問個別存儲介質(zhì)的風(fēng)險, 使系統(tǒng)負(fù)載均衡算法更加簡單. 端口復(fù)用芯片PM內(nèi)部擁有64MB緩沖區(qū), 平滑了RA陣列不同存儲介質(zhì)之間的電氣特性差異, 同步讀寫訪問. 但應(yīng)使每個通道的存儲介質(zhì)容量相同, 否則富余容量無法組成超扇區(qū)造成空間浪費(fèi).
Windows邏輯尋址單元為64扇區(qū), 設(shè)置RAC初始化參數(shù)r=8可使上述RA陣列支持Windows環(huán)境. 也可利用RA陣列的可堆疊特性建立一個堆疊控制器RASC(RA Stacked Controller), 堆疊多個RA陣列形成一個更高匯聚帶寬的大數(shù)據(jù)PSE. 例如, 定義超扇區(qū)SS尺寸為64扇區(qū), 并建立相應(yīng)的堆疊控制器RASC, 它相當(dāng)于一個PCIe總線的智能交換陣列. 該RASC接入端為PCIe 3.0×32(320G), 另有8個設(shè)備堆疊端口, 每端口部署一個PCIe 2.0×8總線用來連接上節(jié)描述的基本RA陣列. 由于每個基本RA陣列擁有8個6G帶寬的SATA3.0通道, 該RASC總計擁有64個SATA3.0通道. RASC內(nèi)部硬件實現(xiàn)云存儲的Map/Reduce機(jī)制, 負(fù)責(zé)將1個Windows簇的64個扇區(qū), 分別映射到8個子通道組的64個SATA3.0通道, 從而將320G帶寬卸載到64個6G的SATA3.0通道, 形成一個帶寬320G的大數(shù)據(jù)PSE.
為消除邏輯存儲空間和物理存儲空間尋址粒度差異, 本文提出超扇區(qū)SS的概念, 設(shè)計了基于SS訪問的矩型陣列結(jié)構(gòu)RA, 硬件實現(xiàn)了邏輯存儲空間與物理扇區(qū)的映射規(guī)約, 使云存儲的Mapreduce覆蓋陣列的每個硬盤, 擴(kuò)容的同時實現(xiàn)訪問提速.
利用FPGA和SATA端口復(fù)用芯片設(shè)計實現(xiàn)了RA陣列, 基于Linux測試了樣機(jī), 結(jié)果表明RA陣列可實現(xiàn)端口的帶寬卸載和匯聚. 該RA樣機(jī)不依賴網(wǎng)絡(luò), 可由主機(jī)通過文件系統(tǒng)直接讀寫訪問, 是一種個人存儲裝備PSE, 其3個優(yōu)勢勝過同類產(chǎn)品:
1) 擁有云存儲的Map/Reduce機(jī)制, 資源越多訪問速度越快.
2) 支持堆疊連接便于擴(kuò)容.
3) 由主機(jī)直接訪問, 尤其適合軍事、 安全、 金融以及超算設(shè)備, 特別地, PSE亦可作為云存儲資源節(jié)點.
尚需解決的問題是: ① 實現(xiàn)RASC堆疊控制器, 提升PSE的帶寬卸載/匯聚能力; ② 修改文件系統(tǒng)代碼實現(xiàn)軟件定義存儲, 適配PSE大容量、 高速度和可堆疊特征.
特別指出, PSE對存儲介質(zhì)無特殊要求, 可用SSD甚至DDR存儲器獲得更高的系統(tǒng)性能.