張偉東,董振興,朱 巖,安軍社
(1.中國科學院復雜航天系統電子信息技術重點實驗室(中國科學院國家空間科學中心),北京 100190; 2.中國科學院大學,北京 100190)
隨著國內航天事業的高速發展,衛星搭載的有效載荷種類和數量日益增多,對星上數據存儲管理提出了更高要求.星載固態存儲系統作為衛星的數據中心,承載著有效載荷數據的存儲與發送[1].NAND FLASH因其存儲密度高、非易失等特點已成為當前星上數據的主要存儲介質.
固態存儲系統一般由主機、閃存轉換層及FLASH芯片組成.閃存轉換層是位于主機和FLASH芯片間的中間軟件層,目前針對FTL的研究大多集中在商用FLASH存儲系統中,對于航天環境下固態存儲算法的研究成果較少.基于商用FLASH系統設計的FLT算法管理復雜、處理器性能要求高、接口速率存在瓶頸,不適用于航天任務[2];傳統星載FTL算法[3-5]大多采用頁級地址映射方式和固定分區的文件管理模式,其優點是實現簡單、可靠性高,但存在主機占用率高、系統響應時間長以及沒有充分考慮FLASH芯片的磨損均衡等問題.因此,基于衛星型號任務實際應用,提出一種適用于星載固態存儲系統數據驅動的自適應超級塊FTL(Data-driven adaptive superblock FTL ,DASFTL)算法,以解決傳統星載存儲系統存在的主機占用率高、系統響應時間慢以及FLASH芯片磨損不均衡等問題.
星載固態存儲系統采用NAND FLASH作為主存儲器介質,現場可編程邏輯陣列(Field Programmable Gate Array, FPGA)作為FLASH控制器,并配備中央處理器(Central Processing Unit, CPU)單元負責地址管理和系統維護.一種典型星載固態存儲系統結構見圖1.

圖1 典型星載固態存儲系統結構框圖
衛星有效載荷產生的數據首先進入合路輸入模塊,數據按格式打包后送入存儲控制單元,同時存儲控制單元向主控CPU單元請求寫數據頁地址.FLASH控制模塊收到源包數據后,進行RS編碼(Reed-solomon codes),并送入隨機存取存儲器(Random Access Memory, RAM)中進行緩存.當RAM緩存的數據達到FLASH一頁大小時,將緩存數據寫入主控CPU單元預分配的頁地址.回放數據時,主控CPU單元向存儲控制單元發送回放塊地址和回放指令,存儲控制單元在收到回放指令和地址后,將數據從存儲區讀出并解碼,最后將數據加載至復接輸出單元[6].
閃存轉換層作為中間軟件層位于主控CPU單元中,完成地址映射、垃圾回收和負載均衡等功能[7].地址映射將主控CPU單元中應用的邏輯地址轉換為FLASH芯片中的物理地址.垃圾回收為當收到數據寫入請求時,FTL尋找一個空頁用于寫入數據,若不存在空頁或空余頁余量不足,將會觸發垃圾回收并選擇一個完整的塊作為回收對象.垃圾回收通過擦除過時的數據塊來釋放存儲空間.負載均衡是在FLASH芯片的使用過程中,使其內部塊的磨損程度盡可能均衡.
頁級FTL[8]、塊級FTL[9]和頁塊混合級FTL[10]是目前FTL設計中三種主要映射方案.頁級FTL以頁為單位將一個邏輯地址映射到一個物理地址,其優點為轉換效率高,但存儲在RAM中的地址映射表較大.塊級FTL以塊為單位進行邏輯地址到物理地址的映射,其基本思想是邏輯塊中的邏輯頁偏移量與物理塊中物理頁的偏移量相同.相比之下,塊級FTL的映射表要比頁級FTL映射表小得多,但塊級FTL的轉換效率較低.頁塊混合級FTL使用塊級映射技術來獲得相應的物理塊地址,使用頁級映射技術來定位可用的物理頁,頁塊混合級FTL在較長時間的極限工況下表現出較好的地址轉換效率[11].
Jung等最先提出基于超級塊的閃存轉換層算法[12],其比塊級FTL算法更進一步,它將多個連續的邏輯塊組合成一個超級塊.例如,超級塊的大小為4,那么邏輯塊編號為0,1,2,3的4個邏輯塊構成了超級塊0.雖然超級塊閃存轉換層算法能在塊級FTL算法上進一步減少RAM的占用空間,但其只是由幾個連續的邏輯塊組合而成,無法根據實際系統中數據的運行特點進行調整.因此,提出了一種數據驅動的自適應超級塊FTL算法(DASFTL),其地址映射機制見圖2.

圖2 DASFTL地址映射機制
超級塊映射表SMT和頁地址映射表PMT組成兩級映射,其中超級塊映射表SMT為一級映射,頁地址映射表為二級映射.超級塊映射表SMT由超級塊號SBN進行索引,每個超級映射表項由邏輯塊號LBN、頁映射表PMT和邏輯塊權重WRecy組成.與Superblock FTL不同,在DASFTL中,超級塊不是由幾個連續的邏輯塊簡單組合而成,而是根據系統中數據運行的特點動態組合而成.每個超級塊中所擁有的邏輯塊數為K,K的取值范圍從0到存儲系統中所有有效物理塊的個數.這K個邏輯塊可以是連續的邏輯塊也可以是不連續的,并且不同超級塊的K值可能不同.具體哪些邏輯塊組合成為一個超級塊由塊回收權重WRecy決定.在超級塊內部采用頁級映射,超級塊中每一個映射表項都可以映射至其對應的實際物理頁上.PMT被分為S個頁映射子表(PMST1、PMST2、…、PMSTs),由頁映射表索引PMTI進行索引.頁映射表索引的內容為物理頁碼,頁映射子表的內容由物理頁碼PPN和頁熱度Hpage兩部分組成,其中S的值可由OOB區的大小和邏輯塊數計算得到.假設每個物理塊包含α個物理頁,每個OOB區可以存儲m(0 LBN=LPN÷α, (1) PMToffset=α×SBO+LPN%α. (2) 式中:LBN為邏輯塊號,LPN為邏輯頁號,α為每物理塊中的物理頁數,SBO為超級塊偏移量,PMToffset為頁地址映射表偏移量. 每個FLASH塊中含有的物理頁數α是固定的,因此邏輯塊號可以由邏輯頁號LPN除以物理頁數計算得到.之后查找超級塊映射表可以得到其所在的超級塊號SBN和此超級塊偏移量SBO,利用式(1)~(2)就可以計算得到該邏輯頁號在所對應的頁地址映射表偏移量PMToffset.根據得到的PMToffset查找頁地址映射表PMT就可以得到相應的物理頁地址.在DASFTL算法中,每個頁映射子表PMST都將在FLASH寫操作過程中,寫入到最新分配的物理頁OOB區.在邏輯地址轉換物理地址的過程中,可以通過讀取PMTI所指示物理頁的OOB區來直接獲得PMST.這種分級映射方式通過維護兩個短的映射鏈表來實現地址轉換,避免了維護一個很長的地址鏈表所造成的搜索時間長和RAM占用率高等缺點,從而提高系統的響應速度并減少主機的占用,適用于RAM空間有限和實時性強的嵌入式系統. 星載固態存儲系統主要工作在連續讀/寫模式下.傳統星載存儲系統大都采用頁級FTL映射方案,其中每次讀/寫操作都需向主機請求地址,當存儲系統連續寫入數據時會造成存儲系統大量占用主機資源,并且隨著讀寫請求的不斷累積系統響應時間將會變長.為此,DASFTL算法將超級塊作為讀/寫操作的最小單位,當存儲控制單元接收到數據并向主控CPU單元產生寫請求時,主控CPU單元會一次性將塊回收權重WRecy最小的超級塊地址分配給存儲控制單元,若一次寫請求將整個超級塊地址都分配之后仍未完成則向主控CPU單元請求新的超級塊,若還有部分地址未分配則該超級塊的地址分配信息存儲在存儲控制單元中待下次寫請求繼續使用. 對給定超級塊的第一個寫請求是由該超級塊的第一個空閑邏輯塊來提供服務.當一個物理塊被選中分配給該邏輯塊之后,物理塊中的頁將按順序執行寫操作.當其中一個物理頁被分配之后,首先從該頁的OOB區讀出其相對應的頁映射子表,將頁映射子表中的PPN更新為將寫入的新頁面的PPN.然后將新的PMST寫入到OOB區域、數據寫入到DATA區域.寫操作響應Twr時間為 Twr=Twrask+Trdoob+Twrpg. (3) 式中:Twrask為發出寫請求到主機返回寫地址的系統響應時間,Trdoob為讀取OOB中舊PMST的時間,Twrpg為寫入一頁數據和更新OOB區PMST的時間. 對于讀操作,主控CPU單元會給定起始邏輯頁LPN,然后LPN被翻譯成邏輯塊號LBN和超級塊偏移量SBO.通過LBN和SBO可以計算得到此邏輯頁所對應的頁映射子表PMST及其所在的物理塊號,之后讀取PMST可以得到其所對應的物理頁碼.讀操作響應時間Trd為 Trd=Trdask+Trdoob+Trdpg. (4) 式中:Trdask為發出讀請求到主機返回讀地址的系統響應時間,Trdoob為讀取OOB中舊PMST的時間,Trdpg為讀取一頁數據的時間. 當存儲系統沒有足夠的空閑塊來響應寫請求時,將會觸發垃圾回收.衛星處于地面接收站的范圍內時,會將存儲系統內的數據下傳至地面,隨后數據就會被標記為“冷數據”.當觸發垃圾回收機制時將優先回收冷數據塊.星載存儲系統中,對于冷數據的回收只執行擦除操作.傳統星載存儲系統大都基于固定分區的文件管理策略[5],分區內部采用順序回收機制.由于不同分區的數據熱度和輸入速率不同,會導致某些物理塊的擦寫次數不斷攀升,直到該塊的擦寫次數到達上限變為無效塊.為此,DASFTL算法不采用分區的文件管理策略,而將所有文件進行動態管理,其中超級塊作為擦除的最小單位.在超級塊內部,同一分區的邏輯地址是連續的但是其對應的物理地址不一定是連續的. 在DASFTL中,為兼顧存儲系統的性能和使用壽命,引入數據頁熱度Hpage和物理塊擦除次數Nearse來作為目標擦除塊的選擇因素.Hpage由式(5)計算得到.其中,f為一段時間內回放次數,fk+1-fk為第k次及第k+1次觸發垃圾回收時該頁的回放次數.頁回放次數越多則該頁的熱度越大. (5) (6) (7) 在DASFTL算法中,塊回收權重WRecy將作為超級塊組成單位的度量單位.存儲系統初次使用時,每個邏輯塊的初始塊回收權重都為0.隨著存儲系統的運行,超級塊映射表SMT會計算并保存每個邏輯塊的塊回收權重.塊回收權重WRecy相同的邏輯塊將被組合成為一個超級塊,即使這些邏輯塊所對應的物理塊地址是離散的.圖3為DASFTL算法垃圾回收流程圖.當超級塊映射表SMT中沒有足夠的空閑塊來響應寫操作時將觸發垃圾回收.與響應寫操作相同,主控CPU單元在響應垃圾回收操作時,將塊回收權重最大的整個超級塊下發給存儲控制單元.存儲控制單元會按照順序依次回收超級塊內的邏輯塊.在完成一次回收之后超級塊映射表SMT將更新塊回收權重和新的映射索引. 圖3 DASFTL垃圾回收流程圖 為評估本文提出的DASFTL算法,設計并搭建了星載固態存儲系統硬件測試平臺,見圖4. 圖4 星載固態存儲系統測試平臺 測試平臺選用龍芯1E作為主控CPU,龍芯1E是以WH1770為核心的高性能應用處理器.軟件工作在內嵌的VxWorks操作系統上,用于存儲系統的任務管理與調度、中斷與異常管理以及閃存轉換層算法.CPU內存采用三片ISSI公司IS45S163型支持EDAC的SDRAM,容量為3 Gb.CPU程序存儲器選用復旦微電子生產的JFM29LV64型號NOR FLASH,容量為64 Mb.FPGA選用Microsemi公司M2GL150T FPGA芯片,完成大容量固態存儲管理、數據接收、復接及部分邏輯粘合功能.大容量固態存儲器采用兩片珠海歐比特公司VDNF64G08型NAND FLASH,單片容量64 Gb,總容量為128 Gb.FLASH芯片參數和內部編程時間見表1. 基于測試平臺,對DASFTL算法與傳統星載FTL算法在主機占用率、讀/寫響應時間和FLASH塊擦除次數進行測試.在主機占用率測試中,共進行300 000次I/O請求,其中0~ 100 000次存儲系統只進行寫數據操作;之后對存儲區數據進行全擦除,將存儲系統設置在寫數據與讀數據同時工作模式下,進行100 000次I/O請求實驗;最后重置存儲區,工作模式設置為最大工況,存儲系統同時進行寫、讀、擦操作.記錄每次I/O操作時主機占用率,為排除系統其它部分占用主機資源對實驗造成干擾,屏蔽系統內其他功能并以每25 000次I/O為一組計算主機占用率的平均值,實驗結果見圖5. 表1 FLASH芯片參數及編程時間 圖5 傳統星載FTL算法與DASFTL算法主機占用率 Fig.5 Host occupancy rate of traditional spaceborne FTL and DASFTL algorithms 系統上電后,主控CPU單元會遍歷整個存儲區并建立索引表,此時兩者主機占用率都在80%左右.當進行寫操作時,DASFTL主機占用率迅速下降并維持在31.2%左右,而傳統星載FTL算法維持在60.5%左右.當同時進行讀寫操作時,DASFTL算法的主機占用率維持在39.7%左右,傳統星載FTL算法上升至75.0%左右.最大工況下,DASFTL算法占用率穩定在44.8%左右,傳統星載FTL算法則上升至86.1%.綜上,采用超級塊地址映射機制的DASFTL算法相比于傳統星載FTL算法在主機占用率上平均降低51.7%. 分別獨立進行100 000次讀、寫操作實驗,通過龍芯CPU記錄每次收到讀/寫請求至返回讀/寫地址的系統響應時間(Twrask/Trdask),通過式(3)~(4),計算得每次讀、寫操作的響應時間Trd和Twr.對Trd和Twr進行累和求均值,測試結果見圖6. 傳統星載FTL算法讀/寫操作平均響應時間分別為206 μs和408 μs,其中系統響應時間Trdask為90 μs、Twrask為115 μs.DASFTL算法讀/寫操作平均響應時間分別為159 μs和344 μs,其中系統響應時間Trdask為43 μs、Twrask為51 μs,相比于傳統星載FTL算法讀/寫操作的系統響應時間下降了46.1%. 模擬衛星工作模式,設置三路輸入數據分別為文件1、文件2和文件3.文件1數據輸入速率為100 Mbps,文件2輸入速率為150 Mbps,文件3輸入速率為50 Mbps.實驗剔除75塊初始無效塊,實際有效物理塊為32 693塊.設置實驗運行時間為當存儲控制單元共執行326 930次擦除操作時停止.實驗結果見圖7. 圖6 傳統星載FTL算法與DASFTL算法讀/寫響應時間 Fig.6 Read/Write response time of traditional spaceborne FTL and DASFTL algorithms 圖7 傳統星載FTL算法與DASFTL算法物理塊擦除次數分布 Fig.7 Distribution of physical block erasure times of traditional spaceborne FTL and DASFTL algorithms 基于固定分區的傳統星載FTL算法因各文件輸入速率的差異,造成不同物理塊的擦除次數呈現顯著差異,文件2分區的物理塊擦除次數高于文件1和文件3分區.DASFTL算法的擦除塊選擇策略只與當前塊的熱度和擦除次數相關,相同實驗條件下,DASFTL算法的各物理塊擦除次數相比于傳統星載FTL算法更加均衡,有效避免了部分物理塊過早磨損. 綜上,DASFTL算法相比于傳統星載FTL算法在主機占用率、系統響應時間以及FLASH磨損均衡等方面均有明顯的性能提升.DASFTL算法的實際測試結果與預期結果吻合,證明了該算法的可行性和實用性. 針對傳統星載閃存轉換層算法存在的問題,提出了一種數據驅動的自適應超級塊FTL算法,采用了基于超級塊的地址映射策略,并引入動態塊回收權重作為目標回收塊選擇的標準.實驗結果表明,DASFTL算法相比于傳統星載FTL算法在主機資源占用率由81.4%下降至44.8%、系統讀/寫響應時間由206 us/408 us提升至159 us/344 us,響應時間提升46.1%.FLASH芯片磨損均衡性能方面DASFTL算法在長時間工作下,各物理塊擦除次數更加均衡,可有效避免部分物理塊的過早磨損,提升FLASH芯片的使用壽命.但DASFTL算法仍存在代碼實現復雜、后期維護困難等問題.2.2 讀寫地址管理
2.3 垃圾回收



3 實驗結果與分析
3.1 實驗平臺搭建

3.2 實驗結果與分析




4 結 論