本博客原创文章属本人lurker0ster所有,欢迎转载。
转载时需同意以下条件:
1. 必须保持版权信息,以及文章出处http://blog.csdn.net/lurker0ster/
2. 不准演绎,修改,必须完整转载全部内容。
===================分割线====================
要进行优化,必须先知道瓶颈在哪儿。
幸运地是我们不需要重新开始,现有的工具就可以满足我们的需要。Bootchart就是专门用于检查启动过程的工具【1】。安装完成之后,通过在内核启动参数中指定kernel /vmlinuz-2.6.10 ro root=/dev/hda1 init=/sbin/bootchartd。
在我们的目标系统ubuntu 9.10中,这一步是省略的。 bootchart的启动是在initrd中的init脚本启动的。bootchart会每5s检查一次/proc/stat
/proc/diskstats
/proc/[PID]/stat收集全系统的进程运行状态以及CPU使用率和IO状态,然后写入/var/log/bootchart.tgz。当系统中出现设定中的进程时(比如GNOME下的
gdmgreeter
),bootchart认为启动结束,停止收集数据并转换数据为可视的PNG图片。
(点击查看原始大图)
这是我在Vmware里面安装的Ubuntu9.10的启动时序图,大约用时100s。可以看到usplash花了很长时间。这个就是Ubuntu那个启动画图(带高亮进度条的那个)。这个程序除了显示动画,什么事都不做,而且还很耗时,这是我们第一个要取消掉的东西。
第二个是ureadahead,在9.10最初的发行版本中使用的是intel moblin带的sreadahead。后来ubuntu又发布了自己版本的readahead。这个程序的目的在于预读取启动中要用到的文件到内存中,以减少对磁盘读数据的等待时间。这个程序我会在以后开一个专题研究的。至于为什么Ubuntu自己重写一个版本,我查了不少邮件列表,没有发现相关的性能数据,暂时先认为是有改进吧。这一步理论上是省不掉的,但是也有BugZilla report说有人在laptop上去掉ureadahead反而性能更好,或许我们也可以做一下试验。
第三个大头是udev,它调用了很多次的modprobe。udev的用户态程序配合Sysfs的信息把系统中不存在的设备对应的设备文件都去除了,保证/dev下的设备文件都有物理实体对应。可能在probe会消耗很多资料,我们需要深入研究。
第四个是hald (hal deamon),硬件抽象层做了很多addon的启动过程。
第五个是console-kit,它主要是用来支持用户快速切换。
第六个是Xorg和Xkbcomp,可以看到CPU使用率很高,可能在做复杂的计算。之后就是Gnome的各个部件,以及输入法ibus的初始化(python写的,效率应该不会太高)。在优化的初期,我们可以考虑用Xfce来替代GNOME,以避免对GNOME做过多的关注。
第七个是cups,是linux的打印伺服程序。我们可以修改成随需启动,我们不是每次启动都需要打印文件。
其他的如音频PulseAudio/Alsa, USB, NetManager 我们暂时不做关注。图中出现的Vmware相关的组件不做关注,因为真实的PC上是用不到这些组件的。
留下来的疑问:
启动过程中的dd(dbus-deamon)、 exe(usplash)不知道是什么东西,需要在以后的Hack中搞清楚。
在vmware中跑的ubuntu9.10 测试得到的Bogomips是3610.45,大约是级别Intel Pentium 4 (1.7GHZ)。利用这种对比关系,我们可以大约想象真实PC的启动时间,在启动时间没有得到大幅度优化之前,利用vmware进行测试,方便调试。
参考文献:
www.bootchart.org