首页/系统/Linux 运维命令速查/systemd-analyze 启动性能分析
systemd 与服务42 条

systemd-analyze 启动性能分析

开机慢了三板斧:systemd-analyze time 总量、blame 各单元耗时、critical-chain 关键路径;定位并优化启动瓶颈。

Linux 运维命令速查系统更新于 2026-10-13

analyze 是什么

systemd-analyze 读取内核与各单元的启动时间戳,把开机过程拆成固件(firmware)、引导器(loader)、用户空间(userspace)三段,并能按单元列出耗时、算出关键路径。它是回答「开机为什么慢」的标准工具:先看总量在哪一段,再看哪个单元耗时最长,最后看关键路径上到底卡在谁身上。

基本信息

适用平台Linux(systemd)
常用子命令time 总耗时分解、blame 按单元耗时排行、critical-chain 关键路径、verify 校验单元语法、dot 输出依赖图
输出单位时间以秒或毫秒显示,可加 --no-pager 便于脚本处理
数据来源内核时间戳与单元的启动完成时间,不依赖额外采样
权限说明读取信息普通用户即可

典型使用场景

  • 开机变慢:先 time 看三段分布,判断是固件/引导慢还是用户空间慢
  • 找出耗时单元:blame 排序,逐个评估能否延后启动或改用 socket 激活
  • 追关键路径:critical-chain 显示真正决定总时长的那条链,而不是并行等待的总和
  • 排查服务启动失败:verify 校验单元文件语法错误
  • 交付评审:把依赖图导出成图片或文本,用于架构评审与文档

常用示例

常用示例
systemd-analyze time                     # 三段耗时总览
systemd-analyze blame | head -n 20       # 单元耗时排行
systemd-analyze critical-chain           # 默认目标的关键路径
systemd-analyze critical-chain multi-user.target   # 指定目标的关键路径
systemd-analyze verify myapp.service     # 校验单元文件语法
systemd-analyze dot multi-user.target | dot -Tsvg > units.svg   # 导出依赖图

time 三段读法

阶段含义常见归因
firmware固件自检到交给引导器BIOS 设置、外设初始化、阵列卡自检
loader引导器加载内核与 initrd内核与 initrd 体积、GRUB 菜单等待时间
userspacesystemd 接管到默认目标达成服务启动耗时、等待网络、磁盘 IO
graphical到显示管理器就绪的时间仅在图形模式下单独列出
blame 的数字含并行等待时间,加起来往往远超总时长,不能直接按排名砍服务;决定总时长的是 critical-chain 给出的那条链,优化要打在链上的单元。
不要为了「开机快」直接 mask network-online.target 或 NetworkManager-wait-online.service:依赖网络就绪的单元(NFS/CIFS 挂载、云初始化脚本、依赖远端配置的服务)会因此启动失败或延迟到超时。先确认依赖关系与业务需求,再决定是关闭等待、延后启动还是改用 socket 激活。
优化手段按性价比排序:把不必开机就跑的服务改成按需或延后启动,把等待外部资源的单元从关键路径上摘掉,最后再考虑合并串行依赖。每次改动后用相同条件重启一次,对比 time 与 critical-chain,避免只是把等待挪了个位置而总时长没变。

易错点

  • blame 统计包含并行等待,不能直接按数字大小砍服务,要看 critical-chain
  • 首次开机因为生成 SSH 主机密钥、缓存冷而天然慢,优化前后要用同条件多轮对比
  • 只看 blame 前几名就优化,可能错过关键路径上那些耗时中等但串行阻塞的单元
  • verify 只做语法与基本校验,条件式配置与依赖缺失不一定能报出来
  • 把耗时服务直接禁用而没确认依赖,会让别的单元在启动时超时,整体反而更慢

数据来源与参考

  • man 1 systemd-analyze

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌