系统裁剪与启动优化
一、启动时间优化
1. 测量
# 内核启动
systemd-analyze time
# 各服务
systemd-analyze blame
systemd-analyze plot > boot.svg
# 内核详细
systemd-analyze critical-chain
# 内核
dmesg -d | head -100
2. 内核优化
# 关功能
CONFIG_LOG_BUF_SHIFT=12 # 小日志
CONFIG_PRINTK=n # 减少 printk
CONFIG_DETECT_HUNG_TASK=n
CONFIG_DETECT_SOFTLOCKUP=n
CONFIG_FTRACE=n # 不需要调试
CONFIG_PROFILING=n
# 编译选项
CONFIG_CC_OPTIMIZE_FOR_SIZE=y # 优化大小
CONFIG_KERNEL_XZ=y # XZ 压缩
CONFIG_INITRD_NONE=y # 不需要 initramfs
3. initramfs → 切换到 rootfs
- 直接从 initramfs 启动 rootfs
- 不用挂载 tmpfs
4. systemd 优化
# 关闭不需要的服务
systemctl disable bluetooth
systemctl disable NetworkManager-wait-online.service
systemctl mask systemd-journald.service
# 调整日志
systemctl edit systemd-journald
[Journal]
Storage=volatile
RuntimeMaxUse=16M
# 并行启动(默认)
# /etc/systemd/system.conf
[Manager]
DefaultDependencies=no
DefaultTimeoutStartSec=10s
5. 预加载(readahead)
systemd-readahead collect
systemd-readahead analyze
6. BusyBox init 优化
# 删掉不用的 applets
make menuconfig
# 取消勾选不需要的
7. 启动流程
上电 0ms
├── BootROM (50-200ms)
├── SPL/U-Boot (200-500ms)
├── 内核自解压 (100-300ms)
├── 内核初始化 (500-1000ms)
├── rootfs 挂载 (100-500ms)
├── init / systemd (500-3000ms)
└── 应用启动
优化目标:让产品从"上电"到"主界面" < 5 秒。
二、内存优化
1. 内核裁剪
CONFIG_IKCONFIG=y # 把配置编译进内核
CONFIG_EMBEDDED=y # 嵌入式精简
# 关掉
CONFIG_INPUT_EVDEV=n
CONFIG_INPUT_MOUSE=n
CONFIG_INPUT_KEYBOARD=n
CONFIG_USB=n # 不需要 USB
CONFIG_SOUND=n
CONFIG_HID=n
CONFIG_FB=n # 不需要 framebuffer
2. 应用裁剪
- 用 musl 而非 glibc(小 1MB+)
- strip 符号
- UPX 压缩(少数情况)
- musl + static
3. rootfs 优化
- 用 squashfs 压缩只读
- 用 overlay 挂载可写
- tmpfs 用于 /tmp
4. 内存监控
cat /proc/meminfo
free -h
slabtop
cat /proc/buddyinfo
cat /proc/pagetypeinfo
三、磁盘优化
1. 闪存优化
- 启用 I/O scheduler 适配器(mtpq、bfq)
- 用 f2fs 替代 ext4
- tmpfs 替代内存盘
# 移动应用预读
fio --rw=randread --bs=4k --numjobs=4 --runtime=60 --name=readtest
2. 镜像大小优化
- Buildroot / Yocto
BR2_TOOLCHAIN_BUILDROOT_GLIBC→ musl - squashfs 压缩
- 删除 docs、locale
四、CPU 优化
1. 编译器优化
CFLAGS=-O3 -march=armv7-a -mtune=cortex-a9 -mfpu=neon
LDFLAGS=-Wl,--gc-sections
2. LTO(链接时优化)
CFLAGS=-flto
LDFLAGS=-flto
3. PGO(profile-guided optimization)
# 1. 编译带 profile
CFLAGS="-fprofile-generate"
# 2. 跑典型负载
./myapp
# 3. 用 profile 重编
CFLAGS="-fprofile-use"
五、网络优化
1. TCP buffer
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
2. Socket 选项
- TCP_NODELAY
- SO_KEEPALIVE
- TCP_QUICKACK
3. 零拷贝
- sendfile
- mmap
- splice
六、图形优化
1. Framebuffer 渲染
- lvgl 局部刷新
- 减少透明 / 阴影
2. GPU 加速
- 选用 eglfs / DRM / V4L2
- OpenGL ES 2.0+
七、电源优化(见 05-power-management.md)
八、常见性能问题
| 问题 | 优化 |
|---|---|
| 启动慢 | 裁剪内核、并行 init |
| 内存紧张 | musl、strip、压缩 rootfs |
| 频繁 IO | tmpfs、batch IO |
| CPU 占用高 | O2/-O3、neon、LTO |
| 网络慢 | mtu、buffer、TCP 选项 |
| UI 卡 | 局部刷新、GPU |