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