Moblin从kernel到X都进行了大量的优化,同时采用了Sreadahead进行磁盘预读取来提高启动速度,最终把Moblin系统的启动时间控制在10秒以内。
一、概述
1、什么是启动时间
这里的启动时间指的是从bootloader(grub)到系统启动完毕的时间,并不包括BIOS阶段的时间。
快速启动就是要尽量缩短启动时间。
2、启动过程的完成
(1)CPU和磁盘处于idle状态。
(2)没有任何延后启动的程序让当前系统在几秒或者几分钟内不可用。
(3)系统已经完全启动完毕,用户可以开始做任何事,包括关机。
二、Boot Graph
1、Boot Graph概念
Boot Graph用来分析kernel启动过程中每个模块的时间顺序。
Boot Graph是一个基于perl的脚本(bootgraph.pl),位于$(linux_source)/script下。
Boot Graph会读取dmesg的输出并生成一幅SVG图片用以分析。
2、Boot Graph使用
(1)kernel编译时需要包含CONFIG_PRINTK_TIME选项
make menuconfig
(2)bootloader启动系统时需要在kernel启动选项上加上“initcall_debug”,如下:
kernel /vmlinuz-2.6.28 ro root=/dev/hda1 initcall_debug
(3)在系统启动完毕后执行
dmesg | perl $(Kernel_DIR)/scripts/bootgraph.pl > output.svg
(4)使用SVG浏览器(比如Inkscape,Gimp,Firefox)来查看输出文件output.svg
三、Bootchart
1、Bootchart概念
Bootchart是一个以图形方式查看和分析Linux启动过程的工具。
/sbin/bootchartd是一个shell脚本,在kernel启动时被调用。
启动后在后台运行,从/proc文件系统中收集信息。
一开始数据被保存在内存中(tmpfs),直到启动完全结束后写到磁盘(/var/log/bootchart.tgz)。
/usr/bin/bootchart用来解析结果并生成图片。
2、Bootchart工作流程
(1)bootloader启动系统时需要在kernel启动选项上加上
(init=/sbin/bootchartd)
kernel /vmlinuz-2.6.28 ro root=/dev/hda1 init=/sbin/bootchartd
(2)收集信息
一开始数据被记录在内存里(tmpfs)
在/proc文件系统被加载之后,从以下位置读取信息:
>/proc/stat
>/proc/diskstat
>/proc/[PID]/stat
最终log数据被打包并保存在/var/log/bootchart.tgz
(3)生成图片,把打包后的log数据拷贝到开发机上并用一个java程序/usr/bin/bootchart去解析并渲染出一张图片(PNG,SVG或EPS格式)。
>/usr/bin/bootchart /home/xxx/tmp/bootchart.tgz
3.时间分配
(1)Kernel(1s)
a、把所有的模块都编译到kernel image内部,而不是单独模块:
Modules:slow,synchronous
b、不要使用initrd:
initrd又称为initramfs。
把所有关键的drivers都放到kernel里面。
c、驱动加载并行化:
采用并行的方法同时检测多个硬件设备来减少启动时间;
并行方法可能会影响到系统的稳定性,数据的访问顺序以及一致性;
仔细调整每个函数的启动顺序尽量不在影响系统的情况下并行执行。
(2)Early userspace(1s)
去掉不必要的后台服务程序(nfs server,mail server,etc);
并行启动必要的后台服务(dbus,hal,conmann,etc);
修改HAL(Hardware Abstraction Layer)里的算法来减少CPU使用率;
采用super readahead(Sreadahead)进行磁盘预读取;
采用Fastinit作为启动脚本,方便OSV加入其他启动脚本。
(3)X(1s)
减少Intel显卡驱动加载所耗时间(5秒到0.5秒);
减少显卡驱动所占内存;
对XKB(keyboard layouts)结果进行缓存,以便以后直接使用;
X可以直接使用kernel启动时检测到的显示模式。
(4)Home Screen
4.Sreadahead