0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

只读压缩文件系统EROFS的设计与实现

SSDFans 来源:上海交通大学/华为陈海波 2023-08-31 15:09 次阅读

本工作来自上海交通大学/华为陈海波老师团队,发表于ATC 2019。

01动机及背景

EROFS是一个针对移动设备的只读压缩文件系统。作者观察到,当前手机配备的存储空间不大,而安卓系统的系统分区、各种app占用的空间越来越大。导致用户的实际可支配空间越来越小。如图所示,安卓系统的/system分区从2.3.6的184MB增长到了9.0.0的1.9GB。为了尽可能增加用户的可用空间,对系统分区使用压缩文件系统是最优解。

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

文章对比了两个最常见的压缩文件系统,Btrfs和Squashfs。其中,Btrfs是一个B树文件系统,在使能压缩功能后,文件数据每128KB进行压缩存储,由于Btrfs是一个通用文件系统,同时支持读写功能,因此为数据修改效率妥协了数据压缩率,且在数据解压时会占用大量的内存空间。

Squashfs是一个只读压缩文件系统,压缩块大小4KB-1MB可调,由于安卓的/system分区几乎不需要修改的特性,只读文件系统比Btrfs更合适。然而,Squashfs同样存在严重的问题,在解压过程中squashfs会产生大量的CPU和内存开销,在资源紧张的移动设备上性能下降严重。

为了研究squashfs性能下降的原因,文章进行了进一步分析。第一个原因是压缩输入块大小固定,导致了的压缩输出数据大小不同,因此导致了可观的读放大,如下图所示,以128K压缩输入大小为例,压缩后数据存放在SSD的blk1-blk7中,若要读取4KB数据,则需要首先读取blk1-blk7共7块,解压得到128K原始数据后,只取其中4KB所需数据,这就导致了7倍的读放大。

第二个原因是在解压过程中大量的内存占用和数据搬运开销,在解压过程中,squashfs需要大量的临时内存用于解压,另外,解压过程中,数据需要多次搬运,造成大量的CPU开销。

这两个缺陷引出了两个关键思考:如何在减小读放大的同时尽可能少的降低压缩率?如何在解压过程中尽可能少占用内存?

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

02EROFS的设计与实现

固定压缩输出块大小

为了产生固定大小的压缩输出块,EROFS在生成镜像时使用滑动窗口法调整压缩算法输入的原始数据大小。固定输出块大小具有多种优点。首先,固定输出块大小压缩率更高;第二,读取数据时仅需要读取包含目标数据的块,也就是说一块数据最多仅需要两次读操作,相较squashfs,读放大显著缩小。

灵活的原始数据存储

在实际解压前,EROFS可以使用两种方式存放原始压缩数据。当数据仅部分解压时,EROFS使用缓存式IO,即在发送读请求前为申请一块特殊inode的页缓存,并将原始压缩数据读入这一块缓存中,当再次触发读请求并且读区域正好落入当前压缩块时,即可省去一次IO。若压缩数据需要全部解压,EROFS则使用在位IO方式,即将原始压缩数据直接读入VFS分配的存放解压后数据的页缓存中。

多种解压策略结合

EROFS设计了四种解压后数据的存放方式。

1.Vmap存放,即使用vmap方法将申请的临时缓存和VFS分配的缓存作为连续的虚拟地址作为解压的目标地址。这种方式有两个缺点:第一需要动态申请内存,增加内存压力;第二每次解压都使用vmap和vunmap效率低下。

2. Per-CPU缓冲存放,即使用提前为每个CPU分配的缓存作为解压数据的存放地址,这种解压方式仅在解压数据小于4页时使用。

3.滚动存放,即使用EROFS预先申请的16物理页内存存放解压数据,当解压数据超出16页时,则滚动回第0页覆盖其数据继续解压。

4.在位解压,即解压后的数据和原始压缩数据放置在同一段内存空间,这种解压方式仅在确定解压过程中不会出现解压后数据覆盖还未解压数据时才可以使用(在mkfs时会判断是否会覆盖,并记录在inode中)。

根据四种不同解压后数据存放方式的特点,设计解压策略如下图所示。

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

03优化

索引优化:一个压缩块中可能存在数百页原始数据,在解压时这些页的索引会占据大量内存,因此若VFS分配的页中存在多余的可重用页,则将压缩块存储在可重用页,这样可以避免重复读取,同时减少内存占用。

调度优化:传统压缩文件系统如Btrfs使用一个独立的解压线程进行数据解压,这样会带来调度开销,EROFS将解压工作放在读者线程执行,以避免解压线程的调度开销。

协同解压:若多个线程的读取落入同一个压缩块内,则仅由一个线程解压一次,其余线程共用数据,避免重复解压。

镜像补丁:使用增量补丁方式,EROFS可以支持少量补丁存在。在文件读取时,EROFS先读取镜像内文件原本内容,再读取补丁中覆盖内容进行更新。

04评估

评估平台使用了hikey960开发板。评估方式采用了fio和enwik9数据集,fio分别执行顺序读取、随机读取、条带读取(每128KB读取4KB)进行基准测试。

测试结果如下图所示,在压缩文件系统中,btrfs表现最差,在每次读取无法落入缓冲的条带读取测试中,squashfs-128K下降明显,而EROFS的性能与squashfs-4K类似,接近非压缩的ext4和f2fs。

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

压缩率、内存占用测试

使用enwik9和silesia.tar两个数据集测试几个文件系统的压缩率。测试结果如图所示。可以看出,EROFS压缩率和squashfs-16K接近,低于squashfs-128K,压缩率接近0.5,可以节省接近一半的空间。

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

内存压缩测试方式为:开机、挂载文件系统,读取整个测试文件,查看内存占用情况。测试结果如下图所示。可以看出,EROFS的内存占用仅略高于非压缩文件系统的ext4,远低于squashfs。

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

实际环境测试

将安卓系统的/system;/vendor;/odm分区使用erofs,分别节省了30%-35%的空间,开机时间缩短2.3%。测试打开相机应用花费时间,92次测试累计分布如图所示。可以看出,EROFS的应用开启时间和ext4基本相同,甚至略优于ext4。

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

总结

EROFS作为一个为资源有限的移动设备设计的只读压缩文件系统,在保证较高压缩率的同时提供了高性能读取、低内存占用。在测试中,开启时间甚至略快于ext4。目前EROFS已并入linux主线内核,并且大规模部署在智能手机上。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206560
  • 压缩
    +关注

    关注

    2

    文章

    99

    浏览量

    19259
  • 文件系统
    +关注

    关注

    0

    文章

    273

    浏览量

    19676

原文标题:聊聊只读压缩文件系统

文章出处:【微信号:SSDFans,微信公众号:SSDFans】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Linux使用unzip命令在终端解压缩文件

    ZIP是最广泛使用的存档文件格式,支持无损数据压缩。ZIP文件是一个数据容器,其中包含一个或多个压缩文件或目录。
    发表于 12-08 16:52 4015次阅读

    winrar压缩文件图标丢失(不见了)怎么办? 不能显示压缩文件

    如上过程,文件关联全部    选择,并确定2 按住shift用鼠标右键点击一个压缩文件夹,选择“打开方式”中的RAR程序,并选中“始终用这个   程序”打开就OK了。3  彻底删除WinRAR软件,用系统自带
    发表于 11-12 12:17

    文件系统

    直接运行文件系统,这样可以在系统运行时节省许多RAM空间。Cramfs是针对Linux内核2.4之后的版本所设计的一种新型文件系统,也是压缩只读
    发表于 06-02 09:29

    压缩文件可以使用pdf压缩器吗

    `  压缩文件可以使用pdf压缩器吗?现在很多办公人员都会编辑各种文档格式的文件,也都掌握了将其它可编辑格式转换为PDF文件格式的方法,但是有时候PDF
    发表于 10-27 14:03

    树莓派压缩文件

    请问各位,怎么用树莓派压缩文件夹?
    发表于 09-13 10:03

    在 Linux 上压缩文件的 5 种方法

    容易地传输到另一个系统,或者将文件作为一个相关的组进行备份。它也提供压缩的功能,这就很有意义了,附加一个 z 压缩选项能够实现
    发表于 05-07 15:25

    Linux如何压缩文件

    在Linux上压缩文件的5种方法
    发表于 12-30 08:00

    【ELT.ZIP】OpenHarmony啃论文俱乐部—见证文件压缩系统EROFS

    的在线多粒度蒸馏图像压缩文件传输压缩快速随机访问字符串压缩高通量并行无损压缩增强只读文件系统开源
    发表于 07-30 09:10

    【学习打卡】【ELT.ZIP】OpenHarmony啃论文俱乐部—见证文件压缩系统EROFS

    的在线多粒度蒸馏图像压缩文件传输压缩快速随机访问字符串压缩高通量并行无损压缩增强只读文件系统开源
    发表于 07-30 09:19

    uClinux 下JFFS2 文件系统实现

    uClinu x默认的根文件系统ROMFS是一个只读文件系统, 不支持动态擦写保存。虽然对于需要系统动态保存的数据可以采用虚拟RAM盘的方法,但系统
    发表于 05-16 13:21 9次下载

    Linux嵌入式文件系统如何构建

    的,都是采用目录树的结构。在嵌入式系统中常见的文件系统有cramfs、romfs、jffs、yaffs等,这里就以制作cramfs文件系统为例进行讲解。cramfs文件系统是一种经过
    发表于 06-18 09:23 876次阅读

    压缩文件管理器WinRAR安装程序下载

    压缩文件管理器WinRAR安装程序下载
    发表于 08-31 10:45 15次下载

    钛金系列压缩与非压缩文件多镜像问题

    根据客户的反馈和需求,我们做了一个Ti60压缩与非压缩文件的多镜像与加载时间的验证。
    的头像 发表于 12-01 10:16 581次阅读
    钛金系列<b class='flag-5'>压缩</b>与非<b class='flag-5'>压缩文件</b>多镜像问题

    如何在Linux上使用Pigz来更快地压缩文件

    Pigz是一款快速压缩文件的工具,它能够使用多个CPU核心进行压缩,使得压缩速度得到了极大的提升。在本文中,我们将介绍如何在Linux上使用Pigz来更快地压缩文件
    的头像 发表于 05-12 16:42 1902次阅读
    如何在Linux上使用Pigz来更快地<b class='flag-5'>压缩文件</b>

    java中的压缩文件是如何解压与压缩

    (String name):表示压缩文件中的一个文件或者目录 void putNextEntry(ZipEntry e):写入新的压缩文件或者目录 ZipIutputStream:是一种
    的头像 发表于 10-10 15:49 409次阅读