linux内核|盘点只读压缩文件系统( 二 )


linux内核|盘点只读压缩文件系统
文章图片
在内存分配上 , EROFS根据上层希望读取的内容是否需要将盘上读出数据全部解压会选择不同的策略 。 对于需全部解压的情况 , EROFS会使用VFS已分配的PageCache内存页 , 这样节省了内存的占用;对于需部分解压的情况 , EROFS则会独立分配缓存页以便后续读取相同压缩块时避免产生新的I/O 。 当压缩数据块已被读入内存后 , 以下图中读取数据块3 , 4为例 , EROFS的基本数据解压方式大致步骤如下:
根据上层要读取范围计算要解压的数据块(这个例子中是0 , 1 , 2 , 3 , 4)
分配临时缓存页(可选)存放解压内容(0 , 1 , 2) , VFS已分配数据页不用再分配
通过vmap将上述物理页映射为连续虚拟页
如果有原地I/O占用了VFS分配的数据页 , 则将数据拷贝到临时页
解压数据到指定虚拟地址
linux内核|盘点只读压缩文件系统
文章图片
为优化内存占用 , EROFS还提供了缓存解压/滚动解压(预分配一定数量的内存页)、原地解压等策略 。 另外 , 通过调度优化和协同解压进一步改善了数据读取性能 。 理论上 , 解压的过程增加了CPU计算时间 , 而压缩数据读取减少了I/O时间(特别是对于顺序读取来说) 。 所以对于只读压缩文件来说 , 压缩率达到一定收益后读性能会好于不压缩的文件系统 。 即CPU时间的增加小于I/O时间的减少 , 这从EROFS的测试数据也可以看出:当压缩节省空间超过35%以上时 , 随压缩比提升EROFS的读性能(特别是顺序读)会越来越好于EXT4 。
以上就是对只读压缩文件系统的一个简单介绍 , 可以看出根据应用场景的不同各个只读压缩文件系统在压缩比、压缩/解压效率上各有侧重 。 EROFS相比其他只读压缩文件系统引入了更多的设计思路 , 实现细节和一些优化值得肯定 。


推荐阅读