0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

只讀壓縮文件系統(tǒng)EROFS的設(shè)計(jì)與實(shí)現(xiàn)

SSDFans ? 來(lái)源:上海交通大學(xué)/華為陳海波 ? 2023-08-31 15:09 ? 次閱讀

本工作來(lái)自上海交通大學(xué)/華為陳海波老師團(tuán)隊(duì),發(fā)表于ATC 2019。

01動(dòng)機(jī)及背景

EROFS是一個(gè)針對(duì)移動(dòng)設(shè)備的只讀壓縮文件系統(tǒng)。作者觀察到,當(dāng)前手機(jī)配備的存儲(chǔ)空間不大,而安卓系統(tǒng)的系統(tǒng)分區(qū)、各種app占用的空間越來(lái)越大。導(dǎo)致用戶的實(shí)際可支配空間越來(lái)越小。如圖所示,安卓系統(tǒng)的/system分區(qū)從2.3.6的184MB增長(zhǎng)到了9.0.0的1.9GB。為了盡可能增加用戶的可用空間,對(duì)系統(tǒng)分區(qū)使用壓縮文件系統(tǒng)是最優(yōu)解。

a5e959fa-47c1-11ee-97a6-92fbcf53809c.png

文章對(duì)比了兩個(gè)最常見(jiàn)的壓縮文件系統(tǒng),Btrfs和Squashfs。其中,Btrfs是一個(gè)B樹(shù)文件系統(tǒng),在使能壓縮功能后,文件數(shù)據(jù)每128KB進(jìn)行壓縮存儲(chǔ),由于Btrfs是一個(gè)通用文件系統(tǒng),同時(shí)支持讀寫(xiě)功能,因此為數(shù)據(jù)修改效率妥協(xié)了數(shù)據(jù)壓縮率,且在數(shù)據(jù)解壓時(shí)會(huì)占用大量的內(nèi)存空間。

Squashfs是一個(gè)只讀壓縮文件系統(tǒng),壓縮塊大小4KB-1MB可調(diào),由于安卓的/system分區(qū)幾乎不需要修改的特性,只讀文件系統(tǒng)比Btrfs更合適。然而,Squashfs同樣存在嚴(yán)重的問(wèn)題,在解壓過(guò)程中squashfs會(huì)產(chǎn)生大量的CPU和內(nèi)存開(kāi)銷(xiāo),在資源緊張的移動(dòng)設(shè)備上性能下降嚴(yán)重。

為了研究squashfs性能下降的原因,文章進(jìn)行了進(jìn)一步分析。第一個(gè)原因是壓縮輸入塊大小固定,導(dǎo)致了的壓縮輸出數(shù)據(jù)大小不同,因此導(dǎo)致了可觀的讀放大,如下圖所示,以128K壓縮輸入大小為例,壓縮后數(shù)據(jù)存放在SSD的blk1-blk7中,若要讀取4KB數(shù)據(jù),則需要首先讀取blk1-blk7共7塊,解壓得到128K原始數(shù)據(jù)后,只取其中4KB所需數(shù)據(jù),這就導(dǎo)致了7倍的讀放大。

第二個(gè)原因是在解壓過(guò)程中大量的內(nèi)存占用和數(shù)據(jù)搬運(yùn)開(kāi)銷(xiāo),在解壓過(guò)程中,squashfs需要大量的臨時(shí)內(nèi)存用于解壓,另外,解壓過(guò)程中,數(shù)據(jù)需要多次搬運(yùn),造成大量的CPU開(kāi)銷(xiāo)。

這兩個(gè)缺陷引出了兩個(gè)關(guān)鍵思考:如何在減小讀放大的同時(shí)盡可能少的降低壓縮率?如何在解壓過(guò)程中盡可能少占用內(nèi)存?

a5fb0916-47c1-11ee-97a6-92fbcf53809c.png

02EROFS的設(shè)計(jì)與實(shí)現(xiàn)

固定壓縮輸出塊大小

為了產(chǎn)生固定大小的壓縮輸出塊,EROFS在生成鏡像時(shí)使用滑動(dòng)窗口法調(diào)整壓縮算法輸入的原始數(shù)據(jù)大小。固定輸出塊大小具有多種優(yōu)點(diǎn)。首先,固定輸出塊大小壓縮率更高;第二,讀取數(shù)據(jù)時(shí)僅需要讀取包含目標(biāo)數(shù)據(jù)的塊,也就是說(shuō)一塊數(shù)據(jù)最多僅需要兩次讀操作,相較squashfs,讀放大顯著縮小。

靈活的原始數(shù)據(jù)存儲(chǔ)

在實(shí)際解壓前,EROFS可以使用兩種方式存放原始?jí)嚎s數(shù)據(jù)。當(dāng)數(shù)據(jù)僅部分解壓時(shí),EROFS使用緩存式IO,即在發(fā)送讀請(qǐng)求前為申請(qǐng)一塊特殊inode的頁(yè)緩存,并將原始?jí)嚎s數(shù)據(jù)讀入這一塊緩存中,當(dāng)再次觸發(fā)讀請(qǐng)求并且讀區(qū)域正好落入當(dāng)前壓縮塊時(shí),即可省去一次IO。若壓縮數(shù)據(jù)需要全部解壓,EROFS則使用在位IO方式,即將原始?jí)嚎s數(shù)據(jù)直接讀入VFS分配的存放解壓后數(shù)據(jù)的頁(yè)緩存中。

多種解壓策略結(jié)合

EROFS設(shè)計(jì)了四種解壓后數(shù)據(jù)的存放方式。

1.Vmap存放,即使用vmap方法將申請(qǐng)的臨時(shí)緩存和VFS分配的緩存作為連續(xù)的虛擬地址作為解壓的目標(biāo)地址。這種方式有兩個(gè)缺點(diǎn):第一需要?jiǎng)討B(tài)申請(qǐng)內(nèi)存,增加內(nèi)存壓力;第二每次解壓都使用vmap和vunmap效率低下。

2. Per-CPU緩沖存放,即使用提前為每個(gè)CPU分配的緩存作為解壓數(shù)據(jù)的存放地址,這種解壓方式僅在解壓數(shù)據(jù)小于4頁(yè)時(shí)使用。

3.滾動(dòng)存放,即使用EROFS預(yù)先申請(qǐng)的16物理頁(yè)內(nèi)存存放解壓數(shù)據(jù),當(dāng)解壓數(shù)據(jù)超出16頁(yè)時(shí),則滾動(dòng)回第0頁(yè)覆蓋其數(shù)據(jù)繼續(xù)解壓。

4.在位解壓,即解壓后的數(shù)據(jù)和原始?jí)嚎s數(shù)據(jù)放置在同一段內(nèi)存空間,這種解壓方式僅在確定解壓過(guò)程中不會(huì)出現(xiàn)解壓后數(shù)據(jù)覆蓋還未解壓數(shù)據(jù)時(shí)才可以使用(在mkfs時(shí)會(huì)判斷是否會(huì)覆蓋,并記錄在inode中)。

根據(jù)四種不同解壓后數(shù)據(jù)存放方式的特點(diǎn),設(shè)計(jì)解壓策略如下圖所示。

a60b33f4-47c1-11ee-97a6-92fbcf53809c.png

03優(yōu)化

索引優(yōu)化:一個(gè)壓縮塊中可能存在數(shù)百頁(yè)原始數(shù)據(jù),在解壓時(shí)這些頁(yè)的索引會(huì)占據(jù)大量?jī)?nèi)存,因此若VFS分配的頁(yè)中存在多余的可重用頁(yè),則將壓縮塊存儲(chǔ)在可重用頁(yè),這樣可以避免重復(fù)讀取,同時(shí)減少內(nèi)存占用。

調(diào)度優(yōu)化:傳統(tǒng)壓縮文件系統(tǒng)如Btrfs使用一個(gè)獨(dú)立的解壓線程進(jìn)行數(shù)據(jù)解壓,這樣會(huì)帶來(lái)調(diào)度開(kāi)銷(xiāo),EROFS將解壓工作放在讀者線程執(zhí)行,以避免解壓線程的調(diào)度開(kāi)銷(xiāo)。

協(xié)同解壓:若多個(gè)線程的讀取落入同一個(gè)壓縮塊內(nèi),則僅由一個(gè)線程解壓一次,其余線程共用數(shù)據(jù),避免重復(fù)解壓。

鏡像補(bǔ)?。菏褂迷隽垦a(bǔ)丁方式,EROFS可以支持少量補(bǔ)丁存在。在文件讀取時(shí),EROFS先讀取鏡像內(nèi)文件原本內(nèi)容,再讀取補(bǔ)丁中覆蓋內(nèi)容進(jìn)行更新。

04評(píng)估

評(píng)估平臺(tái)使用了hikey960開(kāi)發(fā)板。評(píng)估方式采用了fio和enwik9數(shù)據(jù)集,fio分別執(zhí)行順序讀取、隨機(jī)讀取、條帶讀?。?28KB讀取4KB)進(jìn)行基準(zhǔn)測(cè)試。

測(cè)試結(jié)果如下圖所示,在壓縮文件系統(tǒng)中,btrfs表現(xiàn)最差,在每次讀取無(wú)法落入緩沖的條帶讀取測(cè)試中,squashfs-128K下降明顯,而EROFS的性能與squashfs-4K類(lèi)似,接近非壓縮的ext4和f2fs。

a61a7008-47c1-11ee-97a6-92fbcf53809c.png

壓縮率、內(nèi)存占用測(cè)試

使用enwik9和silesia.tar兩個(gè)數(shù)據(jù)集測(cè)試幾個(gè)文件系統(tǒng)的壓縮率。測(cè)試結(jié)果如圖所示??梢钥闯?,EROFS壓縮率和squashfs-16K接近,低于squashfs-128K,壓縮率接近0.5,可以節(jié)省接近一半的空間。

a6494e82-47c1-11ee-97a6-92fbcf53809c.png

內(nèi)存壓縮測(cè)試方式為:開(kāi)機(jī)、掛載文件系統(tǒng),讀取整個(gè)測(cè)試文件,查看內(nèi)存占用情況。測(cè)試結(jié)果如下圖所示。可以看出,EROFS的內(nèi)存占用僅略高于非壓縮文件系統(tǒng)的ext4,遠(yuǎn)低于squashfs。

a65e2d70-47c1-11ee-97a6-92fbcf53809c.png

實(shí)際環(huán)境測(cè)試

將安卓系統(tǒng)的/system;/vendor;/odm分區(qū)使用erofs,分別節(jié)省了30%-35%的空間,開(kāi)機(jī)時(shí)間縮短2.3%。測(cè)試打開(kāi)相機(jī)應(yīng)用花費(fèi)時(shí)間,92次測(cè)試?yán)塾?jì)分布如圖所示??梢钥闯?,EROFS的應(yīng)用開(kāi)啟時(shí)間和ext4基本相同,甚至略優(yōu)于ext4。

a6923750-47c1-11ee-97a6-92fbcf53809c.png

總結(jié)

EROFS作為一個(gè)為資源有限的移動(dòng)設(shè)備設(shè)計(jì)的只讀壓縮文件系統(tǒng),在保證較高壓縮率的同時(shí)提供了高性能讀取、低內(nèi)存占用。在測(cè)試中,開(kāi)啟時(shí)間甚至略快于ext4。目前EROFS已并入linux主線內(nèi)核,并且大規(guī)模部署在智能手機(jī)上。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10863

    瀏覽量

    211782
  • 壓縮
    +關(guān)注

    關(guān)注

    2

    文章

    102

    瀏覽量

    19379
  • 文件系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    284

    瀏覽量

    19911

原文標(biāo)題:聊聊只讀壓縮文件系統(tǒng)

文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何在Linux使用unzip命令在終端解壓縮文件

    ZIP是最廣泛使用的存檔文件格式,支持無(wú)損數(shù)據(jù)壓縮。ZIP文件是一個(gè)數(shù)據(jù)容器,其中包含一個(gè)或多個(gè)壓縮文件或目錄。
    發(fā)表于 12-08 16:52 ?4808次閱讀

    winrar壓縮文件圖標(biāo)丟失(不見(jiàn)了)怎么辦? 不能顯示壓縮文件

    如上過(guò)程,文件關(guān)聯(lián)全部    選擇,并確定2 按住shift用鼠標(biāo)右鍵點(diǎn)擊一個(gè)壓縮文件夾,選擇“打開(kāi)方式”中的RAR程序,并選中“始終用這個(gè)   程序”打開(kāi)就OK了。3  徹底刪除WinRAR軟件,用系統(tǒng)自帶
    發(fā)表于 11-12 12:17

    文件系統(tǒng)

    直接運(yùn)行文件系統(tǒng),這樣可以在系統(tǒng)運(yùn)行時(shí)節(jié)省許多RAM空間。Cramfs是針對(duì)Linux內(nèi)核2.4之后的版本所設(shè)計(jì)的一種新型文件系統(tǒng),也是壓縮只讀
    發(fā)表于 06-02 09:29

    壓縮文件可以使用pdf壓縮器嗎

    `  壓縮文件可以使用pdf壓縮器嗎?現(xiàn)在很多辦公人員都會(huì)編輯各種文檔格式的文件,也都掌握了將其它可編輯格式轉(zhuǎn)換為PDF文件格式的方法,但是有時(shí)候PDF
    發(fā)表于 10-27 14:03

    樹(shù)莓派壓縮文件

    請(qǐng)問(wèn)各位,怎么用樹(shù)莓派壓縮文件夾?
    發(fā)表于 09-13 10:03

    在 Linux 上壓縮文件的 5 種方法

    容易地傳輸?shù)搅硪粋€(gè)系統(tǒng),或者將文件作為一個(gè)相關(guān)的組進(jìn)行備份。它也提供壓縮的功能,這就很有意義了,附加一個(gè) z 壓縮選項(xiàng)能夠實(shí)現(xiàn)
    發(fā)表于 05-07 15:25

    在 Linux 上壓縮文件的 5 種方法

    作為一個(gè)相關(guān)的組進(jìn)行備份。它也提供壓縮的功能,這就很有意義了,附加一個(gè) z 壓縮選項(xiàng)能夠實(shí)現(xiàn)壓縮文件。當(dāng)使用 z 選項(xiàng)為 tar 命令附加壓縮
    發(fā)表于 05-13 15:45

    Linux如何壓縮文件?

    在Linux上壓縮文件的5種方法
    發(fā)表于 12-30 08:00

    【ELT.ZIP】OpenHarmony啃論文俱樂(lè)部—見(jiàn)證文件壓縮系統(tǒng)EROFS

    的在線多粒度蒸餾圖像壓縮文件傳輸壓縮快速隨機(jī)訪問(wèn)字符串壓縮高通量并行無(wú)損壓縮增強(qiáng)只讀文件系統(tǒng)開(kāi)源
    發(fā)表于 07-30 09:10

    【學(xué)習(xí)打卡】【ELT.ZIP】OpenHarmony啃論文俱樂(lè)部—見(jiàn)證文件壓縮系統(tǒng)EROFS

    的在線多粒度蒸餾圖像壓縮文件傳輸壓縮快速隨機(jī)訪問(wèn)字符串壓縮高通量并行無(wú)損壓縮增強(qiáng)只讀文件系統(tǒng)開(kāi)源
    發(fā)表于 07-30 09:19

    嵌入式Linux上JFFS文件系統(tǒng)實(shí)現(xiàn)方法

    我們使用的uClinux系統(tǒng)采用ROMFS作為根文件系統(tǒng),它相對(duì)于一般的EXT2文件系統(tǒng),具有節(jié)約空間的優(yōu)勢(shì)。但是ROMFS是一種只讀文件系統(tǒng)
    發(fā)表于 05-14 10:35 ?1307次閱讀
    嵌入式Linux上JFFS<b class='flag-5'>文件系統(tǒng)</b>的<b class='flag-5'>實(shí)現(xiàn)</b>方法

    壓縮文件管理器WinRAR安裝程序下載

    壓縮文件管理器WinRAR安裝程序下載
    發(fā)表于 08-31 10:45 ?15次下載

    鈦金系列壓縮與非壓縮文件多鏡像問(wèn)題

    根據(jù)客戶的反饋和需求,我們做了一個(gè)Ti60壓縮與非壓縮文件的多鏡像與加載時(shí)間的驗(yàn)證。
    的頭像 發(fā)表于 12-01 10:16 ?857次閱讀
    鈦金系列<b class='flag-5'>壓縮</b>與非<b class='flag-5'>壓縮文件</b>多鏡像問(wèn)題

    如何在Linux上使用Pigz來(lái)更快地壓縮文件

    Pigz是一款快速壓縮文件的工具,它能夠使用多個(gè)CPU核心進(jìn)行壓縮,使得壓縮速度得到了極大的提升。在本文中,我們將介紹如何在Linux上使用Pigz來(lái)更快地壓縮文件。
    的頭像 發(fā)表于 05-12 16:42 ?2202次閱讀
    如何在Linux上使用Pigz來(lái)更快地<b class='flag-5'>壓縮文件</b>

    java中的壓縮文件是如何解壓與壓縮

    (String name):表示壓縮文件中的一個(gè)文件或者目錄 void putNextEntry(ZipEntry e):寫(xiě)入新的壓縮文件或者目錄 ZipIutputStream:是一種
    的頭像 發(fā)表于 10-10 15:49 ?950次閱讀