dmesg -T 仅将内核日志中的启动后秒数转换为可读时间戳,不提供耗时计算功能;驱动加载耗时需通过原始时间戳(如[1.350864])相减得出,精度达微秒级。

dmesg -T 本身不提供秒级耗时计算功能,它只是将内核日志中原始的“启动后秒数”(如 [ 1.234567])转换为人类可读的本地时间戳(如 [Tue May 6 09:42:18 2026]),便于你对照系统行为发生的具体时刻。但要分析“各驱动加载耗时”,关键不是看绝对时间,而是利用原始时间戳的差值来推算模块或设备初始化所花的时间。
真正能实现秒级精度分析的方法,是结合 dmesg 的默认输出(含高精度启动秒数)与针对性过滤,再人工或脚本比对时间差。以下是实用、可操作的步骤:
看清驱动加载起止点的时间戳
内核日志中驱动加载通常有明确标志,比如:
- 模块开始加载:
Loading module 'xxx' - 驱动绑定设备:
xxx 0000:00:1f.2: version X.X - 设备就绪完成:
xxx 0000:00:1f.2: registered as ...或probing for xxx
这些行开头的 [ X.XXXXXX] 就是启动后精确到微秒的时间(单位:秒,小数点后6位)。例如:
[ 1.346920] lpc_ich 0000:00:1f.0: I/O space for GPIO uninitialized [ 1.350864] ahci 0000:00:1f.2: version 3.0 [ 1.361478] ahci 0000:00:1f.2: AHCI 0001.0000 32 slots 6 ports ...
→ ahci 驱动从 1.350864 开始加载,到 1.361478 完成初始化,耗时约 0.0106 秒。
你可以这样快速提取并排序相关日志:
dmesg | grep -E "(ahci|e1000e|nvme|igb|mlx5_core|r8169)" | grep -v "firmware\|failed\|error" | sort -k1,1
用 -T 辅助定位关键时间段(非用于计算耗时)
dmesg -T 对排查“某驱动是否在预期时间窗口内加载”很有用。例如:
- 启动后前 2 秒集中加载主板芯片组、SATA、USB 控制器;
- 第 3–5 秒常见网卡、显卡驱动;
- 超过 10 秒才出现
nvme 0000:01:00.0:,可能意味着 PCIe 链路协商异常或固件延迟。
执行:
dmesg -T | grep -E "(ahci|nvme|e1000e)" | head -15
就能看到这些驱动在真实时间轴上的大致分布,帮助判断是否存在明显延迟。
快速估算耗时的实用技巧
不需要写脚本,一条命令即可粗略观察某驱动的初始化跨度:
# 查找 nvme 驱动首尾两行,并显示时间戳差(需 GNU awk)
dmesg | awk '/nvme.*0000:[0-9a-f]+:[0-9a-f]+.[0-9]/ {if(!start) start=$1; end=$1} END {if(start&&end) printf "NVMe init span: %.6f s\n", substr(end,2)+0 - substr(start,2)+0}'
输出类似:NVMe init span: 0.023412 s
更轻量的做法是复制两行时间戳到计算器里相减(如 1.361478 - 1.350864)。
注意缓冲区覆盖和日志完整性
- 内核环形缓冲区默认仅 16KB,大量日志会覆盖早期内容;
- 若怀疑驱动加载慢但没看到对应日志,可能是已被覆盖 → 系统启动后立即运行
dmesg > /tmp/dmesg-boot.log保存快照; - 某些驱动(如
i915、nvidia)会在用户空间进一步初始化,dmesg只记录内核态部分,耗时不能代表整体启动延迟。
不复杂但容易忽略。











