dmesg和systemd-analyze blame需结合时间戳差值、关键词筛选及critical-chain依赖链交叉验证:dmesg -t计算相邻行时间差定位内核级延迟,如nvme/ahci后卡顿;blame排序须对照critical-chain识别真实瓶颈,避免误判上游阻塞;initramfs问题需rd.debug+dracut日志深入分析。

直接看 dmesg 和 systemd-analyze blame 就能定位大部分日志可查的瓶颈位,但必须配合时间戳比对和关键词筛选——光扫日志列表没用,关键在“谁拖慢了谁”。
怎么用 dmesg 找内核级延迟点
dmesg 输出的是内核环形缓冲区内容,启动阶段卡顿、驱动加载超时、硬件初始化失败都藏在里面。问题不在于有没有报错,而在于“时间差”。
- 执行
dmesg -T,注意每行开头的本地时间戳(不是 uptime) - 用脚本或手动算相邻两行时间差:比如上一行是
[Wed Jul 8 07:12:33 2026],下一行是[Wed Jul 8 07:12:34 2026],中间可能实际卡了 800ms,但日志只显示秒级精度 - 重点搜
dmesg -T | grep -E "(timeout|stuck|failed|nvme|ahci|raid|btrfs)",尤其关注nvme和ahci驱动后紧跟的耗时行 - 如果某条
ata_link is slow to respond后隔了 2 秒才出现scsi device ready,这就是明确瓶颈位
怎么用 systemd-analyze 看服务级阻塞链
systemd 启动不是线性的,但 critical-chain 能还原真实依赖路径,blame 排序只反映单个 unit 耗时,容易误判——比如一个服务本身快,但它等的上游服务慢,它就会“背锅”。
- 运行
systemd-analyze critical-chain default.target,从第一行开始逐级往下看,每行末尾的耗时是“该 unit 自身启动时间 + 所有依赖项完成时间”,这才是真实延迟叠加 - 对比
systemd-analyze blame结果,如果某个服务在 blame 里排前三,但在 critical-chain 里根本没出现,说明它没拖慢主路径,不用优先处理 - 留意
dev-mapper-xxx.device或dev-disk-by\x2duuid-xxx.device类设备单元耗时异常高,往往指向 LUKS 解密慢或 RAID 同步未完成 -
systemd-analyze plot > boot.svg可导出时序图,但需用浏览器打开查看重叠与空闲段,比纯文本更直观
initramfs 阶段的日志怎么捞出来
根文件系统挂载失败、LVM 激活卡住、加密卷解密无响应——这些发生在 initramfs 里的问题,dmesg 只记结果,不记过程。必须主动启用调试输出,否则日志就断在“switching root”之前。
- 重启进 GRUB,按
e编辑启动项,在 kernel 行末尾加rd.debug systemd.log_level=7,然后Ctrl+X启动 - 启动后立刻执行
dmesg | grep -A15 -B5 "dracut:",dracut日志会包含模块加载顺序、udev 事件触发、LUKS keyslot 尝试次数等细节 - 若怀疑 LUKS 密码输错或 keyfile 权限不对,
rd.shell rd.break=pre-mount进紧急 shell,手动跑cryptsetup luksOpen --debug /dev/sda2 cryptroot看具体卡在哪一步 -
lsinitrd /boot/initramfs-$(uname -r).img | grep -E "(nvme|ahci|dm-mod|crypt)"必须确认对应驱动和 crypto 模块已打包进 initramfs,缺一个就无法继续
earlyprintk 日志为什么有时比 dmesg 更可靠
当系统卡在 PCI 设备枚举、ACPI 表解析或 USB 主机控制器初始化阶段时,dmesg 可能完全空白——因为 console 还没初始化,日志根本没地方输出。这时候只有 earlyprintk 能把最原始的 printk 打到串口或 VGA。
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX中追加earlyprintk=vga,0x3f8(vga 用于图形界面,0x3f8 是串口地址,根据主板选) - 运行
update-grub && reboot,启动时盯紧屏幕左上角或串口终端,能看到类似[ 0.123456] ACPI: SSDT ...这种带微秒级时间戳的早期输出 - 如果某行
ACPI: EC: EC started后隔了 3 秒才出现下一条,基本锁定是嵌入式控制器响应慢,跟 BIOS 版本或 EC 固件有关,dmesg里只会显示最终 “EC timeout” - 注意:
earlyprintk输出不可保存到文件,必须手动截图或串口抓取,且部分笔记本 BIOS 会禁用此功能
真正难啃的瓶颈位,往往不在日志里明说,而在两行日志之间那几百毫秒的沉默里——得靠时间戳差值、依赖链走向、initramfs 调试输出三者交叉验证,漏掉任一环节,就容易把症状当病因。











