Improving performance (简体中文)/Boot process (简体中文)

From ArchWiki
翻译状态:本文是 Improve_Boot_Performance翻译。上次翻译日期:2012-11-04。如果英文版本有所更改,则您可以帮助同步翻译。

Tango-preferences-desktop-locale-modified.png这篇文章或章节的翻译不反映原文。Tango-preferences-desktop-locale-modified.png

原因:Has seen an update 2021-10-14, but still out of sync with English page.(在 Talk:Improving performance (简体中文)/Boot process (简体中文)# 中讨论)

本文将为读者提供数种加速系统启动的方法。通过学习实践这些方法,读者不仅能改善系统性能,还能学习系统启动脚本的知识。

启动过程分析

使用 systemd-analyze

systemd提供了一个名为 systemd-analyze 的工具, 可用于显示有关启动过程的计时细节, 包括一个svg图, 显示等待其依赖项的单元. 您可以看到哪些单元文件导致启动过程减慢, 然后可以相应地优化系统.

要查看启动时在内核/用户空间中消耗的时间, 只需使用:

$ systemd-analyze
提示: 如果使用 UEFI 引导, 且启动引导器实现了 systemd 的 Boot Loader Interface (目前只有 GRUBsystemd-boot 实现了), systemd-analyze 还可以显示 EFI 固件和启动引导器自身花费的时间

按照耗费时间顺序, 输出启动每个单元耗费的时间:

$ systemd-analyze blame

在开机过程的一些时刻, 需要特定的单元成功启动了才能继续. 查看在启动链中哪些单元处于这些关键点, 可以:

$ systemd-analyze critical-chain

还可以生成类似于 bootchart 的开机过程图表:

$ systemd-analyze plot > plot.svg

更多细节请参考 systemd-analyze(1).

使用 systemd-bootchart

自2012年10月17日,bootchart 工具已经合并进 systemd 中,使用方法和原来的 bootchart 大同小异,添加下列内容到内核参数即可:

initcall_debug printk.time=y init=/usr/lib/systemd/systemd-bootchart

更多信息请查看 manpage

使用 bootchart2

Merge-arrows-2.pngThis article or section is a candidate for merging with Bootchart#Running Bootchart2.Merge-arrows-2.png

Notes: different instructions from the main page (Discuss in Talk:Improving performance (简体中文)/Boot process (简体中文))

您还可以使用 Bootchart 来可视化引导序列. 由于没有办法在内核参数设置两个 init, 所以不能使用源里的 bootchart. 不过, AUR 软件包 bootchart2AUR 提供了一个 systemd 服务. 在安装完 bootchart2 后启用服务即可:

# systemctl enable bootchart2.service

详情参阅 bootchart2 文档

自己编译内核

编译自定义内核可以减少启动时间和内存使用. 尽管随着64位体系结构的标准化和Linux内核的模块化特性, 这些好处可能没有预期的那么大

有关更多信息, 请参见:Kernel (简体中文)#编译

Initramfs

类似于 #自己编译内核, initramfs也可以精简. 一个简单的方法是包含 mkinitcpio autodetect 钩子. 详情请参见 Minimal initramfs.

提前启动服务

systemd 的一个核心特性就是 D-Bus 以及 socket 激活. 这会导致服务在首次访问时启动, 这通常是一件好事. 但是, 如果你知道某个服务 (比如 upower) 总是在引导过程中启动, 那么尽可能早地启动它可能会缩短总体的引导时间. 可以通过以下方式实现 (如果这个服务有 service 文件, 多数情况下都是):

# systemctl enable upower

这会使 systemd 尽快启动 UPower, 而不会导致 socket 或 D-Bus 激活的竞争.

Staggered spin-up

有些硬件使用staggered spin-up,操作系统一个一个访问硬盘,以减少耗电。这会降低启动速度,大部分用户都不需要开启。检查是否开启:

# dmesg | grep SSS

如果没有查到,表示未启动。如果有显示,可以将libahci.ignore_sss=1 加入 kernel line 进行禁用。

避免重复挂载

mkinitcpio提供了 fsck 钩子,将启动加载配置中的 root 从 ro 修改为 rw 并删除 /etc/fstab 中的 root 挂载,可以避免重复挂载。挂载参数可以通过rootflags=[mount options...]设置。

删除 /etc/fstab 中的 API 文件系统,systemd 会自动挂载它们。下面命令可以获得这些 API 文件系统的列表:

$ pacman -Ql systemd | grep '\.mount$'

/home等其他文件系统可以通过自定义挂载单元进行挂载。

精简输出信息

修改启动加载器内核参数中的 verbosequiet 即可。对于某些用户,特别是 SSD 用户,TTY 的龟速实际上成为了性能瓶颈,精简输出信息实际上有利于提高性能。

参阅