此前,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 压缩》邮件开始阅读。