如何利用dmesg优化系统启动速度
导读:用 dmesg 定位瓶颈并用针对性优化缩短启动时间 一、快速定位瓶颈 获取带时间戳的内核日志,聚焦异常与耗时阶段: 查看完整日志:dmesg -T | less 关注错误与警告:dmesg -T | egrep -i “error|f...
用 dmesg 定位瓶颈并用针对性优化缩短启动时间
一、快速定位瓶颈
- 获取带时间戳的内核日志,聚焦异常与耗时阶段:
- 查看完整日志:dmesg -T | less
- 关注错误与警告:dmesg -T | egrep -i “error|fail|warn|timeout”
- 按设备/子系统过滤:dmesg -T | grep -i “usb|pci|ahci|nvme|mmc”
- 观察挂载与文件系统:dmesg -T | grep -i “mount|fsck|EXT4-fs”
- 跟踪模块加载:dmesg -T | grep -i “module|insmod”
- 若日志被轮转,可查看持久化日志:sudo journalctl -k -b -e
- 识别长时静默段:相邻两条日志的时间戳差值较大处,往往对应驱动探测、设备初始化或 I/O 等待。结合关键字(如 usb、pci、block、scsi、mmc、nvme)可快速锁定嫌疑模块或硬件路径。
二、把耗时环节做成“可视化时间线”
- 在内核命令行加入:initcall_debug printk.time=1 quiet
- 说明:initcall_debug 打印每个 initcall 的开始/结束与耗时;printk.time=1 显示时间戳;quiet 减少控制台输出开销(调试阶段可先不加 quiet)。
- 保存日志并生成时间图:
- dmesg > boot.log
- 使用内核源码脚本生成 SVG:perl scripts/bootgraph.pl boot.log > boot.svg
- 用浏览器打开 boot.svg,定位耗时最长的 initcall(色块越长越耗时),据此决定“裁剪/延后/并行化”策略。
- 可选:若需更细粒度,可配合串口抓时序(如 grabserial)对齐外部观测与内核日志。
三、常见高影响问题与 dmesg 线索
- 控制台输出过慢
- 线索:大量串口输出期间时间线明显拉长。
- 优化:内核参数加入 quiet;必要时减少打印级别(如 loglevel=)。仅在确认无问题后再做“终极”静默(如关闭 CONFIG_PRINTK),以免影响排障。
- 驱动探测与初始化过慢
- 线索:initcall 时间图中某些驱动 initcall 持续数百毫秒甚至秒级;dmesg 中相关设备探测信息集中出现。
- 优化:将非关键驱动改为模块并在用户空间按需加载;对可延后初始化的驱动返回 -EPROBE_DEFER;对必须内置的驱动,精简探测逻辑与依赖。
- PCI/USB 控制器 BIOS 交接失败或延迟
- 线索:dmesg 出现 “EHCI/XHCI BIOS handoff failed (BIOS bug?)” 等字样,随后伴随明显等待。
- 优化:升级 BIOS/UEFI;在内核参数中尝试 usbcore.quirks=… 绕过问题;必要时将相关控制器驱动改为模块,延后加载以让图形/动画先行。
- 存储与文件系统挂载慢
- 线索:dmesg 中 “Waiting for /dev/… to be ready…”、“EXT4-fs (recover)”、“fsck” 等阶段耗时。
- 优化:确保存储健康与分区对齐;优化 /etc/fstab(noatime、data=ordered 等);必要时将关键文件系统检查改为异步或在后台执行(视发行版支持);对嵌入式/定制场景可评估 initramfs 精简与拼接策略。
- 内核与 initramfs 过大、解压与初始化慢
- 线索:dmesg 早期阶段占用时间长,且 bootgraph 显示大量 initcall 集中在核心子系统。
- 优化:裁剪未用驱动与调试选项;尝试更优压缩(gzip/lzo 在不同平台表现不同);将非必要功能编译为模块;在资源允许时将 Kernel+initramfs 拼接以省去块设备与文件系统初始化(需评估解压开销与兼容性)。
四、从内核到用户空间的闭环优化
- 内核与引导
- 裁剪与配置:关闭用不到的驱动/子系统与调试功能(如 Tracers、CONFIG_PRINTK/CONFIG_KALLSYMS 等,仅在确认无排障需求时关闭);选择合适的内存分配器(如 SLAB/SLUB 的取舍需实测);尝试更优内核压缩算法;必要时预设 lpj 值避免启动时校准。
- 引导器:缩短或移除 bootdelay;精简功能与输出;在条件允许时采用 SPL/U-Boot Falcon Mode 直接加载内核,减少阶段切换开销。
- 用户空间
- 并行与按需:结合 systemd-analyze blame/plot 找出用户空间长任务,能并行的并行、能按需的延后;非必要服务 disable 或 mask。
- 图形会话:减少登录后同步执行的重型组件(如蓝牙、截图、输入法、托盘应用等),对不必要项设置 X-GNOME-autostart-Delay 或移出自启动。
- 日志开销:若不需要持久化内核日志,可在 /etc/systemd/journald.conf 将 Storage 设为 none(注意这会影响后续排障)。
五、可复用的操作流程清单
- 采集日志:dmesg -T > boot.log;必要时 journalctl -k -b -e 补充持久化日志。
- 初筛问题:grep -i “error|fail|warn|timeout” boot.log;按设备类目二次过滤(usb/pci/nvme/block/fs)。
- 生成时间图:perl scripts/bootgraph.pl boot.log > boot.svg,定位最长 initcall。
- 实施优化(按影响度从高到低):
- 控制台输出:加 quiet;必要时降低打印级别。
- 驱动:非关键驱动改模块并延后加载;对可延后者返回 -EPROBE_DEFER。
- 硬件交接:升级 BIOS;尝试 usbcore.quirks;必要时延后相关控制器驱动。
- 存储/文件系统:优化 fstab 挂载选项;必要时异步/后台 fsck;评估 initramfs 精简与拼接。
- 内核/引导:裁剪配置、选优压缩、预设 lpj;缩短/优化引导器流程。
- 复测与回归:对比 boot.log 与 boot.svg,确认关键阶段耗时下降;保留关键日志以便后续排障。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何利用dmesg优化系统启动速度
本文地址: https://pptw.com/jishu/758804.html
