接下来,找出消耗时间最多的环节,进行优化。裁掉 tracing在 Kernel hacking 里关闭 Tracers 相关的功能。启动时间:缩短 550ms。内核大小:缩小 217KB。裁掉一些用不上的硬件功能 omap8250_platform_driver_init() // (660 ms)cpsw_driver_init() // (112 ms)am335x_child_init() // (82 ms)...预设 loops per jiffy在每次启动时,内核都会校准 delay loop 的值,用于 udelay() 函数。这会测量 loops per jiffy (lpj) 的值。我们只需要启动一次内核,在log 查找 lpj 值: Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736)然后将 lpj=4980736 填写到启动参数中,即可:
Calibrating delay loop (skipped) preset value.. 996.14 BogoMIPS (lpj=4980736)
大约缩短了 82 ms。禁用 CONFIG_SMPSMP 的初始化很慢。它通常在默认配置中是启用的,即使是一个单核 CPU。如果我们的平台是单核的,可以禁用 SMP。关闭后,内核缩小:-188 KB (-4.6 %),启动时间缩短 126ms.禁用 log启动参数里添加 quiet,启动时间缩短 577 ms。禁用 CONFIG_PRINTK 和 CONFIG_BUG 后,内核缩小 118 KB (-5.8 %)。禁用 CONFIG_KALLSYMS 后,内核缩小 107 KB (-5.7 %)。合计,启动时间缩短 767 ms。开启 CONFIG_EMBEDDED 和 CONFIG_EXPERT这会让系统调用变得更精简,内核会变得没那么通用,但是能保持你的应用程序能运行就足够了。内核缩小 51 KB。启动时间缩短 34 ms。选择 SLAB memory allocators一般是 SLAB、SLOB、SLUB 三选一。SLAB:默认选择,最通用、最传统、最可靠。SLOB:更简洁,代码量更少,更节省空间,适合嵌入式系统,使能后,内核缩小 5 KB,但是启动时间增加 1.43 S!SLUB:更合适大型系统,使能后,启动时间增加 2 ms。因此,我们仍使用 SLAB。内核压缩方式不同压缩方式的特点如下:
实测效果:看起来,gzip 和 lzo 表现更好。测试的效果应该是和 CPU/磁盘 的性能相关的。
内核编译参数使能 CONFIG_CC_OPTIMIZE_FOR_SIZE,该选项可能是用 gcc -Os 代替 gcc -O2。注意,这只是在 BeagleBone Black + Linux 5.1 上的测试结果,不同平台之间有差异。禁用 /proc 等伪文件系统要考虑应用的兼容性。ffmpeg 依赖 /proc ,所以只能关闭一些 proc 相关的选项:CONFIG_PROC_SYSCTL、CONFIG_PROC_PAGE_MONITOR CONFIG_CONFIGFS_FS,启动时间没有变化。关闭 sysfs, 启动时间缩短 35 ms。拼接 DTB启用 CONFIG_ARM_APPENDED_DTB:
$ cat arch/arm/boot/zImage arch/arm/boot/dts/am335x-boneblack-lcd4.dtb > zImage$ setenv bootcmd 'fatload mmc 0:1 81000000 zImage; bootz 81000000'
启动时间缩短 26 ms。 6 优化 Bootloader 这里我们采用最好的方案:使用 Uboot Falcon mode。Falcon mode 只执行 Uboot 的第一阶段:SPL,然后跳过 Stage 2,执行加载 Kernel。启动时间缩短 250 ms。
|