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

你可能感兴趣的:(ubuntu,linux,服务器)