Centos8系统启动时间优化

前言

因需要,对Centos8操作系统的启动时间进行优化。

初始化系统

Centos8使用了systemd作为系统和服务管理器。systemd是现代Linux发行版中普遍采用的初始化系统,它负责在启动时初始化系统环境并管理系统服务。我们在分析操作系统的启动过程时可以使用systemdsystemctl相关的命令。

启动阶段

首先查看操作系统启动过程中各阶段的耗时信息:

systemd-analyze

显示

Startup finished in 4.401s (firmware) + 10.322s (loader) + 1.121s (kernel) + 5.921s (initrd) + 36.591s (userspace) = 58.357s

我们可以看到系统启动分为了五个阶段:

  • firmware(固件):这个阶段包括BIOS或UEFI启动之前的时间。这是硬件自检和准备启动操作系统之前的时间。
  • loader(加载器):这是引导加载器的时间,例如GRUB。这个阶段是从BIOS传递到引导加载器,再从引导加载器开始加载操作系统。
  • kernel(内核):这代表Linux内核的加载和初始化时间。内核配置和硬件驱动加载都发生在这个阶段。
  • initrd(初始RAM磁盘):这是初始内存文件系统的加载和执行时间。它通常包含一些必要的驱动和系统文件,用来帮助内核挂载真实的根文件系统。
  • userspace(用户空间):这是启动所有用户空间服务的时间。这个阶段的时间取决于你的系统上有哪些服务和程序被配置为启动。

下面来按阶段分析可能的优化手段

firmware(固件)

优化固件启动时间通常比较麻烦,因为设计到硬件级别的操作:调整BIOS或UEFI的设置等。以下是一些可以尝试的方法:

  • 禁用不必要的启动选项:在BIOS/UEFI设置中,你可以禁用一些不常用的设备启动选项,比如网络启动(PXE Boot)或其他外部设备。这样可以减少固件搜索和初始化设备的时间。
  • 快速启动:许多现代BIOS/UEFI提供了“快速启动”(Fast Boot)或“快速启动”(Quick Boot)选项。启用这些选项可以让固件跳过某些自检程序(POST),从而缩短启动时间。
  • 更新固件:硬件制造商有时会发布更新以改善性能和减少启动时间。
  • 启动顺序:调整启动顺序,首选从主硬盘启动,而不是像usb这样的外部设备。这样可以减少固件在尝试从未使用设备启动时花费的时间。
  • 优化安全设置:安全启动(Secure Boot)和其他安全检查可能会增加启动时间。如果不需要这些额外的安全措施,可以考虑禁用它们。

对于我的设备,在firmware阶段可做的优化选择很少而且收益不高,因此我在此阶段没有做相关的优化。

loader(加载器)

优化loader阶段的启动时间主要涉及配置和优化引导加载程序。以下是一些可以减少loader阶段启动时间的方法:

  • 优化GRUB:编辑GRUB配置文件(/etc/default/grub),减少启动菜单的等待时间(默认为5秒)。例如,将GRUB_TIMEOUT设置为更短的时间(如1秒),甚至设置为0以直接跳过菜单。修改完毕后使用grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg使更改生效

对于我的设备,每天都要进行上电自启动,而且上电后是无人操作的,所以可以在此阶段优化启动时间。我设置的等待时间为1秒,相较于默认的5秒,缩短了4秒。

kernel(内核)

优化Linux系统中kernel阶段的启动时间主要涉及减少内核加载和初始化所需时间。这可以通过精简内核、优化内核配置和调整启动参数等来实现:

  • 编译定制内核:如果默认的内核包含很多不需要的驱动和模块,可以考虑自己编译一个精简版的内核。只包括必要的驱动和模块可以显著减少内核的启动时间。
  • 使用内核启动参数:通过修改GRUB中的内核启动参数来优化启动过程。例如,添加quiet参数可以减少启动时的日志输出,profile=2可以在系统启动后重新生成读取文件的优化列表,从而加速后续的启动。
  • 禁用不必要的内核功能:通过内核配置,禁用不需要的功能如调试功能、不使用的文件系统类型、不必要的硬件支持等。
  • 内核启动剖析:使用内核启动剖析工具,如printk时间戳和initcall_debug内核参数,来监控和识别内核启动过程中的延迟瓶颈。

对于我的设备,在kernel阶段优化的收益不高,因此我在此阶段没有做相关的优化。

initrd(初始RAM磁盘)

优化Linux系统中的initrd(初始内存盘)阶段的启动时间可以通过减少initrd的大小、精简其内容,以及优化其加载过程来实现:

  • 精简initrd内容:initrd包含了系统启动所需的最小集合的驱动和文件系统工具。如果initrd中包含了不必要的驱动或模块,可以在构建initrd时移这些模块。
  • 压缩initrd:initrd通常使用压缩来减少其在磁盘上的大小,从而提高加载速度。适当选择如gzip、xz或lz4等压缩算法,可以提高启动速度。

对于这一阶段不太了解,故没有选择针对此阶段进行优化。

userspace(用户空间)

优化Linux系统中的用户空间(userspace)阶段启动时间可以显著改善整体启动体验。用户空间启动阶段是指内核启动之后,系统启动各种服务和应用程序的阶段,可以使用下述方法优化:

  • 分析服务启动时间并禁用非必要的服务:使用systemd-analyze blame查看启动过程中每个服务的耗时,根据具体情况确定哪些服务是非常耗时且非必要的,使用systemctl disable xxxservicenamexxx禁用这些服务以加速启动过程。

  • 延迟启动服务:对于不需要在启动时立即运行的服务,可以配置它们延迟启动或按需启动。

总结

在测试中,我只是将GRUB菜单等待时间从5秒缩减到1秒,并禁用了一些用户空间阶段启动的服务,并未针对firmware、kernel、initrd阶段进行优化。

但是目前可能是因为有某些进程未启动完毕,如果不手动systemctl cancel服务,那么它就会一直被统计到userspace的耗时中。

优化后的结果如下:

Startup finished in 4.386s (firmware) + 6.145s (loader) + 1.119s (kernel) + 3.525s (initrd) + 17min 4.058s (userspace) = 17min 19.235s

多次测试后发现firmware和kernel阶段的耗时很稳定,每次的偏差的不多;loader阶段也很稳定,而且由之前的10秒降为6秒左右,证明优化是起作用的;而initrd阶段的耗时会在3.5-6.5秒之间横跳,目前不知道变化的原因;userspace阶段由于未知服务,对耗时统计影响较大,待后期排查原因。

本笔记后面持续更新。

posted @ 2024-05-16 17:37  paw5zx  阅读(10)  评论(0编辑  收藏  举报