需用 systemd-analyze time 查整体耗时,blame 找耗时单元,critical-chain 分析关键路径,plot 生成时序图,journalctl -b 结合日志定位具体错误。

如果您希望了解 Linux 系统从加电到用户空间就绪所耗费的总时间,并定位拖慢启动的具体环节,则需借助 systemd 自带的分析工具。以下是查看与分析系统启动耗时的操作步骤:
一、获取整体启动耗时与阶段分布
systemd-analyze time 命令可将启动过程划分为 kernel、initrd 和 userspace 三个关键阶段,分别反映硬件初始化、临时根文件系统加载及服务启动的耗时情况。该命令输出结果直观呈现各阶段用时及其累加总和,是建立性能基线的第一步。
1、打开终端,执行以下命令:
systemd-analyze time
2、观察输出格式示例:
Startup finished in 2.123s (kernel) + 4.567s (initrd) + 8.901s (userspace) = 15.592s
3、识别各阶段含义:
kernel 阶段耗时高,表明问题可能出在 BIOS/UEFI 设置、硬件自检或内核驱动加载环节
initrd 阶段耗时高,常见于加密卷解锁延迟、LVM/RAID 检测超时或缺失必要驱动模块
userspace 阶段耗时高,则需进一步排查 systemd 托管的服务或挂载单元
二、列出最耗时的服务与挂载单元
systemd-analyze blame 命令按启动耗时倒序排列所有已激活的 unit(包括 .service、.mount、.automount 等),便于快速识别 TOP 耗时项。该命令默认显示前 20 个,适用于发现明显拖慢启动的单元。
1、在终端中运行:
systemd-analyze blame
2、若需查看全部结果且避免分页截断,添加 --no-pager 参数:
systemd-analyze blame --no-pager
3、重点关注以下类型单元:
耗时超过 1 秒的 .service 单元,如 NetworkManager-wait-online.service、docker.service 或自定义监控代理
状态长期处于 activating (start) 的单元,说明其依赖未满足或初始化卡死
异常耗时的 .mount 单元,提示 /etc/fstab 中存在不可达设备或挂载选项不当
三、分析启动关键路径与瓶颈依赖
systemd-analyze critical-chain 命令展示从启动起点至指定 target(默认为 default.target)的最长依赖链,即决定整体启动时长的关键路径。该路径上的任一单元延迟,都会直接拉长总耗时。
1、执行命令查看默认目标的关键链:
systemd-analyze critical-chain
2、若需分析图形界面目标,指定 target 名称:
systemd-analyze critical-chain graphical.target
3、逐级展开每个单元的依赖详情:
systemd-analyze critical-chain unit-name.service
4、结合输出判断:
若某服务反复出现在多层 critical-chain 中,说明它是多个目标的汇聚瓶颈
若 chain 中包含 network-online.target,需检查是否有非必要服务强依赖网络就绪
四、生成可视化启动时序图
systemd-analyze plot 命令导出 SVG 格式的启动流程图,以时间轴形式展现所有 unit 的启动起止时刻、并行关系与依赖间隙,适合对复杂依赖结构进行直观诊断。
1、执行命令生成图表文件:
systemd-analyze plot > boot-time.svg
2、使用浏览器打开生成的 boot-time.svg 文件
3、识别图中关键特征:
横向色块长度代表该 unit 启动持续时间,越长表示越耗时
色块重叠区域表示并行启动,空隙处反映因依赖等待产生的停滞
若某服务前后出现大片空白,说明其上游依赖尚未完成或下游无有效并行任务
五、结合日志深入定位失败或卡顿原因
journalctl -b 可提取本次启动的完整日志流,配合 -u 参数聚焦特定 unit,用于确认是否发生超时、权限拒绝、设备不可达等具体错误。
1、查看某服务本次启动全过程日志:
journalctl -b -u NetworkManager-wait-online.service
2、筛选错误与警告级别日志,缩小排查范围:
journalctl -b --level=err,warn
3、定位某挂载单元失败原因:
journalctl -b -u home.mount
4、验证 fstab 中某行配置是否引发阻塞:
sudo mount -v /dev/sdb1










