Ubuntu 将重新设计 Initram 虚拟文件系统的压缩策略
此前,Ubuntu 将其 Initramfs 的压缩算法从 LZ4-9 (LZ4 压缩算法最高等级)改成了 Zstd -19 (Zstd 压缩算法最高等级)。然而 12月9日,Canonical 公司的 Julian Andres Klode 提出,Zstd -19 压缩等级导致 Initramfs 出现非常严重的解压时间和内存消耗问题,目前他正在努力进行测试,以为 Ubuntu 重新设计恰当的 initramfs 压缩策略。
Initramfs 全称 init ram filesystem ——是 Linux 一种基于内存的虚拟文件系统:先把目标 root 目录以压缩的 cpio 格式存放。然后 Linux 系统启动时会把 Initramfs 文件解压缩,根据解压出来的文件类型/目录来加载真实的文件系统。一些 Linux 系统如果因非正常关机造成文件系统损坏,则再次开机时会停留 Initramfs 的解压阶段,不能正常启动图形化界面。
关于 Initramfs 我们介绍到这,既然 Initramfs 涉及到压缩和解压缩,那压缩算法对它的加载速度影响就非常大。Ubuntu 将压缩算法改成 Zstd-19 后出现解压速度慢和内存消耗大的问题,对低端设备或者嵌入式硬件非常不友好,比如只有 512MB RAM 的 Raspberry Pi Zero(树莓派-zero),就老是崩溃。
为了搞清楚不同压缩等级所需的时间/内存,Canonical 公司的 Julian Andres Klode 做了不同压缩等级的测试。
在 ThinkPad T480s 桌面:
压缩等级 | 用户态时间 | 实耗时间 | 内存消耗 | 压缩文件大小 |
lz4-9 | 9.65s | 11.09s | 12M | 64M |
Zstd-1 | 5.69s | 6.99s | 24M | 57M |
Zstd-6 | 12.59s | 8.58s | 99M | 47M |
Zstd-12 | 19.85s | 10.85s | 249M | 41M |
Zstd-19 | 71.29s | 26.95s | 519M | 35M |
在 树莓派 Pi 4 (arm64)的测试:
压缩等级 | 用户态时间 | 实耗时间 | 内存消耗 | 压缩文件大小 |
lz4-9 | 21.10s | 64.85s | 21M | 29M |
Zstd-1 | 13.73s | 44.55s | 21M | 27M |
Zstd-6 | 26.07s | 49.09s | 91M | 24M |
Zstd-12 | 48.18s | 54.67s | 203M | 22M |
Zstd-19 | 130.07s | 92.80s | 350M | 20M |
从测试结果的时间和内存消耗来看,即使是最低级的 Zstd-1,也比最高等级的 lz4 算法要优秀得多,因此选择 Zstd 算法肯定是对的,问题就出在最高级的 Zstd-19 ,它对压缩效果的提升并不大,所需的时间和内存却大幅增加。
基于此测试结果,Julian Andres Klode 提出自适应压缩级别的思路:在 512 MB 及以下内存的硬件使用 Zstd-1 ,在 2 GB 及以下内存的设备上使用 Zstd-6,其余设备则使用 Zstd-12。如此一来,所有搭载 Unbuntu 设备的 Initramfs 都只会占用 5% 左右的内存,降低压缩级别还能让有快速 I/O 的硬件开机时间减少几分之一秒,岂不美哉?
新的 Initramfs 压缩策略最晚应该会在 Ubuntu 22.04 发布,22.04 是一个长期支持的版本(LTS),大概在明年 2 月冻结新特性,3 月底发测试版。
后续更新:
- 在 Julian Andres Klode 提出“按内存决定压缩等级”的想法后,同属 Canonical 公司的 Heinrich Schuchardt 作了一些回应:设备内存只是问题之一,还要考虑 Cpu 性能等其他因素,比如 SiFive 的 Unmatched 和树莓派 4 这两款板子,虽然有 8G 内存,但是 CPU 性能拉跨,这种设备也应该使用低级的压缩算法。
- ...后面有很多人参与讨论,涉及到对 I/O 的速度、开销,压缩算法边际收益等等的讨论,俺就不一一列举了,感兴趣的话可以从 Julian 的《重新评估默认的 initramfs 压缩》邮件开始阅读。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
CMake 3.22.1 发布,开源构建系统
CMake 是一个跨平台的自动化构建系统,它使用一个名为 CMakeLists.txt 的文件来描述构建过程,可以产生标准的构建文件,如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces 。文件 CMakeLists.txt 需要手工编写,也可以通过编写脚本进行半自动的生成。 CMake 3.22.1 发布,更新内容如下: gitlab-ci:修复comment typo gitlab-ci:缩短job prefixes ci:在 Debian 基础镜像中加入 gmock try_compile:不要使用 CMAKE_BUILD_TYPE 或 CMAKE_CONFIGURATION_TYPES 环境变量 Help:记录更多CMAKE_POLICY_DEFAULT_CMPNNN的使用情况 gitlab-ci:更新 macOS jobs 以使用 Xcode 13.1 CompilerId:通过避免 C++风格的注释来恢复对 classic C 的支持 file(RPATH):如果新的 RPATH 为空,则恢复未知格式的容忍...
- 下一篇
Netty 4.1.71.Final 发布,异步事件驱动的网络应用框架
Netty 4.1.71.Final 已经发布。Netty 是一个异步事件驱动的网络应用框架,主要用于可维护的高性能协议服务器和客户端的快速开发。 主要更新内容 HTTP 无法针对标头名称中的控制字符进行验证,这可能会导致错误的 HTTP 请求 (CVE-2021-43797) JdkZlibEncoder 可以将池化堆缓冲区用于 deflater 输入 确保始终运行本地库的注册任务 重写并简化 Recycler 不允许第三方提供 Netty 的原生库 修复 SslHandler 中可能导致 IllegalReferenceCountException 的重入错误 在写入 ByteBuf 期间返回 -1 时正确处理 InputStream.read() 详情请查看更新公告。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- CentOS6,CentOS7官方镜像安装Oracle11G
- Linux系统CentOS6、CentOS7手动修改IP地址
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7设置SWAP分区,小内存服务器的救世主