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

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Improve_Boot_Performance翻译。上次翻译日期:2012-11-04。如果英文版本有所更改,则您可以帮助同步翻译。

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

原因:Last updated in 2013(在 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 的龟速实际上成为了性能瓶颈,精简输出信息实际上有利于提高性能。

参阅