性能优化/启动过程

来自 Arch Linux 中文维基


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

启动过程分析[编辑 | 编辑源代码]

使用 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[编辑 | 编辑源代码]

本文或本章节可能需要合并到Bootchart#Running Bootchart2

附注: different instructions from the main page(在 Talk:性能优化/启动过程 中讨论)

您还可以使用 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 的龟速实际上成为了性能瓶颈,精简输出信息实际上有利于提高性能。

参阅[编辑 | 编辑源代码]