啟動性能分析方法論
Printk Time 時序採集
# 1. 內核配置啟用
CONFIG_PRINTK_TIME=y
# 或啟動參數添加: time
# 2. 重啟採集完整日誌
dmesg -s 131072 > /tmp/kernel_boot.log
# 3. 內核腳本轉換為時間增量
/usr/src/linux/scripts/show_delta /tmp/kernel_boot.log > /tmp/boot_delta.log
數據解讀關鍵原則
- 時間增量 ≠ 該行代碼耗時:printk 點之間可能包含大量無打印代碼
- 必須結合內核源碼定位:定位耗時函數調用鏈
- 必要時插桩驗證:關鍵路徑添加臨時 printk 確認
典型耗時熱點拆解與優化
1. RTC 時鐘同步 (0.611s) → RTCNoSync
# 內核補丁方案:drivers/rtc/hctosys.c
# 選項 A:完全跳過(嵌入式無 RTC 場景)
# 選項 B:異步延後同步(推薦,啟動後由用戶空間 systemd-timesyncd 處理)
# 啟動參數: rtc_no_sync=1
2. BogoMIPS 校準 (0.328s × 4 核) → Preset LPJ
# 1. 正常啟動記錄校準值
# Calibrating delay loop... 9600.70 BogoMIPS (lpj=4800350)
# 2. 內核命令行固化
lpj=4800350
# 3. 驗證跳過
# Calibrating delay loop (skipped)... 9600.70 BogoMIPS preset
3. SMP 遷移成本校準 (0.312s) → Preset Migration Cost
# 內核源碼 kernel/sched/core.c calibrate_migration_cost()
# 記錄正常啟動值:Migration cost=4000
# 內核命令行固化:
migration_cost=4000,4000 # 多核每核一個值
4. Intel E1000 網卡初始化 (3.520s) → 模塊化並行化
# 1. 內核配置改為模塊
CONFIG_E1000=m
CONFIG_E1000E=m
# 2. 創建早期加載腳本 /etc/initramfs-tools/scripts/init-premount/eth_load
#!/bin/sh
modprobe e1000e &
modprobe other_driver &
wait
# 3. 更新 initramfs
update-initramfs -u
# 4. 效果:網卡 probe 從串行阻塞變為並行,主鏈路縮減 3.2s
# 注意:若早期用戶空間需網絡(NFS root、iSCSI),需保留 eth0 同步初始化
5. IDE/SCSI 探測延遲 → ShortIDEDelays / IDENoProbe
# 內核參數
ide_core.probe_delay=0 # 跳過 IDE 探測延遲
libata.force=40c # 強制 40 線纜模式跳過檢測
# 或內核配置
CONFIG_IDE_PROBE_DELAY=0
用戶空間並行化優化
Systemd 並行啟動調優
# 1. 分析啟動關鍵路徑
systemd-analyze critical-chain
systemd-analyze plot > boot.svg
# 2. 優化服務依賴
# 編輯 /etc/systemd/system/your-service.d/override.conf
[Unit]
After=network-online.target # 改為 network.target(不等待在線)
Wants=network.target
# 3. 啟用 Socket 激活(按需啟動)
# socket 文件自動啟動對應 service
# 4. 禁用無用服務
systemctl disable unused-service
BusyBox 精簡 initramfs
# 替換發行版龐大 initramfs
# 1. 配置 BusyBox 只編譯必需工具
# 2. 手寫極簡 linuxrc
#!/bin/busybox sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
# 必需模塊加載
modprobe ext4
modprobe sd_mod
# 掛載根文件系統
mount -o ro /dev/mmcblk0p2 /root
exec switch_root /root /sbin/init
內核裁剪策略
- 模塊化一切非啟動必需驅動:聲音、打印、藍牙、WiFi、顯卡(非桌面)
- 移除無用文件系統:只保留根分區 FS (ext4/btrfs) + 模塊化其餘
- 禁用調試選項:CONFIG_DEBUG_KERNEL=n, CONFIG_SLUB_DEBUG=n
- 精簡內核體積:CONFIG_MODULE_COMPRESS_XZ=y, 移除符號表
優化成果驗證
| 階段 | 耗時 | 優化手段 |
| 基線 | 6.188s | — |
| LPJ 預置 | -0.328s | lpj=4800350 |
| Migration Cost 預置 | -0.312s | migration_cost=4000,4000 |
| 網卡模塊化並行 | -3.200s | e1000e=m + initramfs 並行加載 |
| RTC 異步 (可選) | -0.611s | rtc_no_sync=1 + systemd-timesyncd |
| 用戶空間並行化 | -0.800s | systemd 依賴優化 + 禁用無用服務 |
| 最終 | 1.708s | 含 eth0 同步初始化 0.3s |
生產環境權衡清單
- ✅ LPJ/Migration Cost 預置:零風險,硬件固定場景必做
- ✅ 驅動模塊化:通用最佳實踐,便於硬件變更
- ⚠️ RTC 異步:需評估時間敏感業務影響,配合 NTP 緩解
- ⚠️ 內核裁剪:需建立硬件白名單機制,避免新硬件無法啟動
- ❌ XIP (Execute in Place):僅限 NOR Flash 固化場景,通用性差