百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

盘点只读压缩文件系统

nanshan 2024-12-10 18:54 11 浏览 0 评论

为什么需要只读压缩文件系统?

在存储容量有限的嵌入式设备上,一般对于系统分区在使用过程中没有数据写入需求,同时希望可以节省存储空间——只读压缩文件系统应运而生。另外,只读压缩文件系统也可用于归档文件。相比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的基本数据解压方式大致步骤如下:

  1. 根据上层要读取范围计算要解压的数据块(这个例子中是0,1,2,3,4)
  2. 分配临时缓存页(可选)存放解压内容(0,1,2),VFS已分配数据页不用再分配
  3. 通过vmap将上述物理页映射为连续虚拟页
  4. 如果有原地I/O占用了VFS分配的数据页,则将数据拷贝到临时页
  5. 解压数据到指定虚拟地址

为优化内存占用,EROFS还提供了缓存解压/滚动解压(预分配一定数量的内存页)、原地解压等策略。另外,通过调度优化和协同解压进一步改善了数据读取性能。理论上,解压的过程增加了CPU计算时间,而压缩数据读取减少了I/O时间(特别是对于顺序读取来说)。所以对于只读压缩文件来说,压缩率达到一定收益后读性能会好于不压缩的文件系统。即CPU时间的增加小于I/O时间的减少,这从EROFS的测试数据也可以看出:当压缩节省空间超过35%以上时,随压缩比提升EROFS的读性能(特别是顺序读)会越来越好于EXT4。

以上就是对只读压缩文件系统的一个简单介绍,可以看出根据应用场景的不同各个只读压缩文件系统在压缩比、压缩/解压效率上各有侧重。EROFS相比其他只读压缩文件系统引入了更多的设计思路,实现细节和一些优化值得肯定。

相关推荐

0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

生产环境starrocks 3.1存算一体集群部署

集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

在CentOS上添加swap虚拟内存并设置优先级

现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

国产深度(deepin)操作系统优化指南

1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

postgresql-15.4 多节点主从(读写分离)

1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

Docker 容器 Java 服务内存与 GC 优化实施方案

一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

虚拟内存设置、解决linux内存不够问题

虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

Elasticsearch性能调优(5):服务器配置选择

在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

Es如何落地

一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

针对Linux内存管理知识学习总结

现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

MySQL进阶之性能优化

概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

Linux Cgroups(Control Groups)原理

LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

linux 常用性能优化参数及理解

1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

如何在 Linux 中使用 Sysctl 命令?

sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

取消回复欢迎 发表评论: