如何使用dmesg优化启动速度
导读:用 dmesg 定位启动瓶颈并落地优化 一、快速定位瓶颈 打开内核时间信息:在内核配置启用 CONFIG_PRINTK_TIME=y,或在启动命令行加入 printk.time=1,让每条日志带时间戳,便于计算阶段耗时。 打开 initc...
用 dmesg 定位启动瓶颈并落地优化
一、快速定位瓶颈
- 打开内核时间信息:在内核配置启用 CONFIG_PRINTK_TIME=y,或在启动命令行加入 printk.time=1,让每条日志带时间戳,便于计算阶段耗时。
- 打开 initcall 耗时:在内核命令行加入 initcall_debug=1,打印每个 initcall 的开始/结束与耗时。
- 生成火焰图:启动后用命令将 dmesg 转为图形化时间线,直观看到最耗时阶段:
dmesg | perl scripts/bootgraph.pl > boot.svg
打开生成的 boot.svg 即可定位长条阶段(如设备探测、文件系统、特定驱动)。 - 辅助观测:必要时用串口工具(如 grabserial)对“Starting kernel … Freeing unused kernel memory”等关键节点打点,与 dmesg 时间线交叉验证。
二、常见高耗时模式与 dmesg 特征
- 驱动探测与初始化过长:dmesg 中出现某设备探测/初始化持续数百毫秒甚至数秒,且相邻 initcall 阶段时间明显拉长。
- 文件系统挂载延迟:挂载 rootfs 或关键分区前后出现明显空档,或伴随 I/O 错误/重试日志。
- 内核模块加载慢:大量模块在 initcall 阶段顺序加载,串行等待明显。
- 硬件/固件握手问题:如 EHCI/xHCI BIOS handoff failed 等报错或长时间等待,常见于部分主板 BIOS,会显著拉长启动时间。
- 日志输出过多:大量 printk 导致控制台输出拥塞,可结合 quiet 减少控制台输出,仅保留必要日志。
三、基于 dmesg 的优化动作
- 内核裁剪与按需编译:移除不需要的驱动与子系统,减少 initcall 数量与探测范围;必要时将非关键驱动改为模块,延迟加载。
- 并行与压缩:启用内核 initcall 并行(如内核支持的相关选项),尝试更快的内核压缩算法(如 LZO),缩短解压与加载时间。
- 预置关键参数:如 lpj= 预设 loops per jiffy,避免启动时自动校准带来的额外耗时。
- 减少控制台输出:在命令行加入 quiet,必要时仅保留关键告警,降低串口/控制台输出带来的时间成本。
- 修复硬件/固件问题:针对 EHCI/xHCI BIOS handoff failed 等,升级主板 BIOS/UEFI,或在确保兼容的前提下调整内核参数/驱动加载策略,规避长时间握手等待。
四、验证与复盘
- 对比前后时间线:每次优化后重复“开启时间/开启 initcall_debug → 采集 dmesg → 生成 boot.svg”,对比长条阶段是否缩短、是否消除异常等待。
- 分层验证:若优化涉及 initramfs/initrd,分别评估“仅内核”和“含 initramfs”的启动时间线,确认瓶颈所在层级。
- 现场复核:对关键节点(如存储/文件系统/网络)再次 grep 相关关键词,确认错误/重试/超时已消除或显著降低。
五、常用命令清单
- 采集带时间戳的日志:dmesg -T
- 查看错误/警告:dmesg | grep -E “error|fail|warn|timeout” -i
- 聚焦设备/总线:dmesg | grep -iE “usb|pci|ahci|nvme|mmc”
- 生成时间线图:dmesg | perl scripts/bootgraph.pl > boot.svg
- 串口打点配合分析:grabserial -d /dev/ttyUSB0 -t -m “^Starting kernel*” -q “^[ [0-9.] Freeing unused kernel memory.*”
- 降低控制台输出干扰:内核命令行加入 quiet(必要时配合 initcall_debug/printk.time 保留分析所需日志)
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何使用dmesg优化启动速度
本文地址: https://pptw.com/jishu/763394.html
