為什么需要只讀壓縮檔案系統?
在存盤容量有限的嵌入式設備上,一般對于系統磁區在使用程序中沒有資料寫入需求,同時希望可以節省存盤空間——只讀壓縮檔案系統應運而生,另外,只讀壓縮檔案系統也可用于歸檔檔案,相比tar,zip等壓縮軟體,只讀壓縮檔案系統的性能和靈活性都更好,Linux早期的只讀檔案系統有CramFS和SquashFS,以及參考了上述兩個檔案系統設計的用戶態只讀壓縮檔案系統CromFS,另外,最近兩年在Android平臺上實作商用的EROFS也值得關注,EROFS針對手機使用場景,對讀放大和記憶體占用過多從設計理念上帶來了一些新的優化,
CramFS,SquashFS,CromFS橫評
CramFS被設計成用于存盤空間很小的嵌入式設備上,傾向于極致簡單、極其節省空間,在使用上存在諸多限制,如:單個檔案大小不能超過16MB、檔案系統大小略大于256MB(最后一個檔案允許超過256MB空間范圍,即檔案系統總大小不超過272MB),CramFS的gid只保存8位,mkcramfs會簡單的將gid截斷保留最后8位(有一些安全風險),CramFS支持硬鏈接,但是被硬鏈接的檔案參考計數不會增加,CramFS檔案沒有時間戳,所有檔案的創建/訪問時間戳都是1970年1月1日 0:00:00 GMT,(最近訪問過的檔案可能會被更新時間戳,但只在記憶體中保存,)CramFS的鏡像只支持被同樣位元組對齊方式的機器創建和掛載使用,頁面大小只支持4KB,
SquashFS的出現替代了CramFS,但CramFS通過支持XIP(Execution In Place)有了新的用武之地,SquashFS設計上相比CramFS去掉了大部分限制因素:其會保存完整的uid/gid(32位)、檔案創建時間,單檔案最大支持16 EB,檔案系統最大大小也是16 EB,壓縮后的inode平均消耗8位元組,根據檔案型別不同(檔案、目錄、符號鏈接等)inode大小有所變化,對于壓縮檔案系統,壓縮輸入的資料塊大小(chunk size)決定了壓縮率收益和潛在的讀放大開銷,SquashFS 2.x版本的chunk size最大為64KB, SquashFS 3.x版本的chunk size最大可達1MB,SquashFS 3.x版本默認的chunk size是128KB,相比4KB大小的chunk size壓縮率有明顯提升,SquashFS還支持fragment block,即多個小檔案存入一個block,極大的提升了壓縮率,SquashFS支持大端和小端對齊方式,可以在不同的位元組序機器上創建和掛載,
CromFS的主要設計目標是高壓縮率,性能和記憶體使用量不是它關心的方面,CromFS是一個用戶態檔案系統,通過塊級別去冗和高壓縮率演算法實作壓縮收益最大化,同CramFS和SquashFS的詳細特性對比如下表:
EROFS帶來哪些新變化?
EROFS的全稱是Enhanced Read-Only File System,相比前述只讀壓縮檔案系統最大的不同是壓縮思路和解壓方式的改變,不同于以往固定輸入長度(Fixed Sized Input)的壓縮形式,EROFS采用固定輸出長度(Fixed Sized Output)的壓縮思路,這解決了固定輸入長度的壓縮帶來的讀放大問題,4KB的固定輸出長度壓縮就可達到128KB的固定輸入長度壓縮的壓縮率,對于SquashFS來說,達到同樣的壓縮收益可能需要比EROFS多讀幾倍的資料塊,另外,SquashFS在運行時記憶體使用方面也遠遠多于EROFS的原地解壓策略,這在系統處于低記憶體狀態時會導致讀性能大幅下降,為了更好的解壓速度同時保證一定的壓縮率,EROFS使用的壓縮演算法為LZ4,默認壓縮輸出塊大小為4KB,其他特性支持上均對標SquashFS,這里不再一一贅述,
定長輸出和定長輸入的示意如下圖所示,EROFS會通過多次嘗試不同長度的輸入資料將其壓縮到固定大小(4KB)的輸出塊上,SquashFS則是根據預先配置好的輸入長度(Chunk Size)壓縮資料并寫到輸出塊上(可能跨多個資料塊),當EROFS的固定輸出長度設為存盤設備的塊大小(如:4KB)時,可以認為沒有讀放大,因為無論要讀的內容是哪一部分以及大小,對于塊設備來說都至少要讀取一個資料塊,
在記憶體分配上,EROFS根據上層希望讀取的內容是否需要將盤上讀出資料全部解壓會選擇不同的策略,對于需全部解壓的情況,EROFS會使用VFS已分配的Page Cache記憶體頁,這樣節省了記憶體的占用;對于需部分解壓的情況,EROFS則會獨立分配快取頁以便后續讀取相同壓縮塊時避免產生新的I/O,當壓縮資料塊已被讀入記憶體后,以下圖中讀取資料塊3,4為例,EROFS的基本資料解壓方式大致步驟如下:
-
根據上層要讀取范圍計算要解壓的資料塊(這個例子中是0,1,2,3,4)
-
分配臨時快取頁(可選)存放解壓內容(0,1,2),VFS已分配資料頁不用再分配
-
通過vmap將上述物理頁映射為連續虛擬頁
-
如果有原地I/O占用了VFS分配的資料頁,則將資料拷貝到臨時頁
-
解壓資料到指定虛擬地址
為優化記憶體占用,EROFS還提供了快取解壓/滾動解壓(預分配一定數量的記憶體頁)、原地解壓等策略,另外,通過調度優化和協同解壓進一步改善了資料讀取性能,理論上,解壓的程序增加了CPU計算時間,而壓縮資料讀取減少了I/O時間(特別是對于順序讀取來說),所以對于只讀壓縮檔案來說,壓縮率達到一定收益后讀性能會好于不壓縮的檔案系統,即CPU時間的增加小于I/O時間的減少,這從EROFS的測驗資料也可以看出:當壓縮節省空間超過35%以上時,隨壓縮比提升EROFS的讀性能(特別是順序讀)會越來越好于EXT4,
以上就是對只讀壓縮檔案系統的一個簡單介紹,可以看出根據應用場景的不同各個只讀壓縮檔案系統在壓縮比、壓縮/解壓效率上各有側重,EROFS相比其他只讀壓縮檔案系統引入了更多的設計思路,實作細節和一些優化值得肯定,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/187607.html
標籤:其他
