Linux 开机启动慢?用 systemd-analyze 在 3 分钟内定位瓶颈服务并优化

概述

如果 Linux 服务器或 PC 的启动时间比平时更长,就需要排查原因以减少不必要的延迟。借助 systemd-analyze 命令,可以轻松完成从测量系统总体启动时间、追踪导致瓶颈的系统服务,到验证单元文件(Unit File)的完整流程。本文将介绍可在实际工作中直接使用的核心分析命令和性能优化技巧。

1. 查看启动耗时及各阶段延迟测量 (time & blame)

systemd-analyze 命令用于测量并展示启动过程中消耗的总时间,以及内核和用户空间(userspace)的初始化耗时。
从执行结果可以看出,系统完成启动并到达图形界面环境 graphical.target 共耗时 315ms。
⚙️ [常用选项]

time : 输出系统启动时内核与用户空间消耗的总时间(默认行为)。
blame : 按耗时降序输出在初始化过程中导致启动延迟的服务列表。
critical-chain : 显示导致启动延迟的关键路径(时间临界链)的服务依赖关系树。
plot : 将整个启动过程中各个服务的执行时间线输出为 SVG 矢量图文件。
dot : 生成 Graphviz dot 格式的服务间依赖关系图。

systemd-analyze

systemd-analyze blame | head -n 10 命令按耗时降序排列,查看启动时执行的且初始化耗时最长的前 10 个服务。
从执行结果中可以看出,systemd-resolved.service(68ms)和 ldconfig.service(67ms)在启动初始化阶段消耗的时间最多。

systemd-analyze blame | head -n 10

2. 追踪启动延迟的关键路径 (critical-chain)

systemd-analyze critical-chain 命令会打印直接影响系统启动完成时间的服务依赖树(临界路径)。
输出结果中,@ 符号后面表示该单元被激活或启动的时间点,+ 符号后面则代表该单元自身执行所花费的时间。
查看结果树可以发现,在到达 graphical.target(315ms)之前,systemd-resolved.service(68ms)与 systemd-journald.service(39ms)等呈串联执行,是造成整个系统启动延迟的核心瓶颈路径。

systemd-analyze critical-chain

systemd-analyze critical-chain networking.service 命令用于指定特定服务(此处为 networking.service),单独追踪该服务启动之前的关键链条。
当不需要查看整个系统的全路径,而只想针对特定网络或后端服务的瓶颈依赖进行隔离分析时,该命令非常实用。

systemd-analyze critical-chain networking.service

3. 生成启动时间线可视化的 SVG 报告 (plot)

为了规范保存与管理启动分析报告文件,先执行 mkdir -p ~/systemd-reports 命令创建专用目录。

mkdir -p ~/systemd-reports

systemd-analyze plot > ~/systemd-reports/boot-analysis.svg 命令将整个启动过程中运行的每个服务的启动时机与执行耗时,生成并保存为直观时间线形式的 SVG 矢量图文件。
通过图形化图表,可以直观地查看仅凭文本日志难以理清的服务并行执行流程及延迟区间。

systemd-analyze plot > ~/systemd-reports/boot-analysis.svg

ls -lh ~/systemd-reports/boot-analysis.svg 命令用于确认生成的 SVG 报告文件是否存在以及文件大小(59KB)等详细信息。
生成的 SVG 文件可以在 Web 浏览器或图像查看器中打开,对详细的启动时间线图表进行可视化分析。

ls -lh ~/systemd-reports/boot-analysis.svg

4. 验证服务单元配置错误及安全状态 (verify & security)

sudo systemd-analyze verify /lib/systemd/system/ssh.service 命令用于预先检查指定单元文件是否存在语法错误或配置项缺失。
执行结果没有任何信息输出,说明该服务单元文件没有语法缺陷或配置错误。

sudo systemd-analyze verify /lib/systemd/system/ssh.service

systemd-analyze security ssh.service 命令用于诊断指定服务单元的安全隔离配置与系统暴露程度(Security Exposure)。
通过执行结果,可以详细检查是否使用 root 权限运行(User=)、设备访问控制(PrivateDevices=)、防止权限提升(NoNewPrivileges=)等主要安全项的应用状态以及风险暴露评分。

systemd-analyze security ssh.service

至此,我们简要了解了如何使用 systemd-analyze 命令排查导致启动变慢的瓶颈服务并进行优化。
清理不必要的服务,打造更加清爽、飞速的 Linux 启动环境吧。