systemd-analyze 命令可精准分析开机启动耗时与依赖:blame 查最慢服务,plot 生成时序图,critical-chain 追踪瓶颈链,不加参数则分阶段统计总耗时。

直接用 systemd 自带的分析命令就能查清开机启动项的执行耗时和依赖顺序,不需要第三方工具。关键不是看“哪些服务开了”,而是看“谁拖得久、谁卡在哪儿、谁等谁”。
查各服务启动耗时(谁最慢)
systemd-analyze blame 是最常用的命令,它按毫秒级耗时从高到低列出所有已启动的服务,只统计该服务自身 ExecStart 的执行时间。
- 运行
systemd-analyze blame | head -n 10查前10名耗时服务;常见拖慢项有:apt-daily.service(自动更新检查)、NetworkManager-wait-online.service(等网络就绪)、docker.service(镜像加载)、ModemManager.service(蜂窝模块扫描) - 注意:只有成功启动的服务才会出现在结果里;disabled 或 static 类型的服务不会显示
看整体启动时序图(谁和谁并行/阻塞)
systemd-analyze plot 会生成 SVG 格式的可视化时序图,打开后能直观看到:
- 服务启动的起止时间点
- 大量服务是否挤在某个时间段集中启动(说明并行度不足或触发条件集中)
- 某个服务长期处于
activating状态(可能卡在依赖或超时等待)
执行 systemd-analyze plot > boot.svg,再用浏览器打开 boot.svg 即可查看。
追踪关键路径(谁是瓶颈链上的节点)
systemd-analyze critical-chain 展示的是不可并行化的最长依赖链,也就是真正决定总启动时间的那条主线。
- 运行
systemd-analyze critical-chain查从graphical.target回溯到最早启动单元的完整链路 - 想聚焦某服务,比如 docker,可用
systemd-analyze critical-chain docker.service - 典型瓶颈场景:
NetworkManager-wait-online.service卡住,往往是因为它等network-online.target,而后者又在等 DHCP 超时(默认 30 秒)
分阶段耗时汇总(内核 vs 用户空间)
systemd-analyze 不加参数,输出总启动时间,并拆解为:
-
firmware(固件阶段,BIOS/UEFI) -
loader(bootloader,如 GRUB) -
kernel(内核加载与初始化) -
initrd(initramfs 阶段) -
userspace(systemd 启动服务阶段)
若 userspace 占比过高(例如 >40 秒),说明问题集中在服务加载环节;若 kernel 或 initrd 偏长,需检查驱动、磁盘健康或 initramfs 是否臃肿。











