Linux 系统管理 启动时间的极限优化方案
在上次完成嵌入式应用的 Linux 裁减后,Linux 的启动时间仍需要 7s 左右,
虽然勉强可以接受,但仍然没有达到我个人所追求的目标——2s 以内。况且,
在实际的商用环境中,设备可靠性的要求可是“5 个 9”(99.999%,即 OOS 时间
低于 5 分钟/年),这就意味着每减少一秒钟 Linux 启动(设备复位)时间,对
可靠性都是一个明显的提升。
言归正传,如何着手对 Linux 的启动时间进行优化呢?
CELF(The Consumer Electronics Linux Forum)论坛为我们指引了一个方向。
(1)首先是对 Linux 启动过程的跟踪和分析,生成详细的启动时间报告。
较为简单可行的方式是通过 PrintkTime 功能为启动过程的所有内核信息增
加时间戳,便于汇总分析。PrintkTime 最早为 CELF 所提供的一个内核补丁,在
后来的 Kernel 2.6.11 版本中正式纳入标准内核。所以大家可能在新版本的内核
中直接启用该功能。如果你的 Linux 内核因为某些原因不能更新为 2.6.11 之后
的版本,那么可以参考 CELF 提供的方法修改或直接下载它们提供的补丁:
http://tree.celinuxforum.org/CelfPubWiki/PrintkTimes
开启 PrintkTime 功能的方法很简单,只需在内核启动参数中增加“time”即可。
当然,你也可以选择在编译内核时直接指定“Kernel hacking”中的“Show timing
information on printks”来强制每次启动均为内核信息增加时间戳。这一种方式还
有另一个好处:你可以得到内核在解析启动参数前所有信息的时间。因此,我
选择后一种方式。
当完成上述配置后,重新启动 Linux,然后通过以下命令将内核启动信息输
出到文件:
dmesg -s 131072 > ktime
然后利用一个脚本“show_delta”(位于 Linux 源码的 scripts 文件夹下)将上
述输出的文件转换为时间增量显示格式:
/usr/src/linux-x.xx.xx/scripts/show_delta ktime > dtime
这样,你就得到了一份关于 Linux 启动时间消耗的详细报告。
(2)然后,我们就来通过这份报告,找出启动中相对耗时的过程。
必须明确一点:报告中的时间增量和内核信息之间没有必然的对应关系,
真正的时间消耗必须从内核源码入手分析。