Centos8系统启动时间优化
前言
因需要,对Centos8操作系统的启动时间进行优化。
初始化系统
Centos8使用了systemd作为系统和服务管理器。systemd是现代Linux发行版中普遍采用的初始化系统,它负责在启动时初始化系统环境并管理系统服务。我们在分析操作系统的启动过程时可以使用systemd
和systemctl
相关的命令。
启动阶段
首先查看操作系统启动过程中各阶段的耗时信息:
1 | systemd-analyze |
显示
1 | 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的耗时中。
优化后的结果如下:
1 | 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阶段由于未知服务,对耗时统计影响较大,待后期排查原因。
本笔记后面持续更新。
- 标题: Centos8系统启动时间优化
- 作者: paw5zx
- 创建于 : 2024-05-16 17:37:46
- 更新于 : 2024-08-20 11:41:14
- 链接: https://paw5zx.github.io/linux-centos-boot-time-optimization/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。