ureadahead

ureadahead(über-readahead)是一项提前读取文件的技术,当需要读取这些文件时,由于他们已经被加载至 page cache 中,这会提高启动的性能,加快启动的顺序。

当 ureadahead 没有任何参数启动时,它会检查默认的 pack 文件 /var/lib/ureadahead/pack 的存在性以及是否过期,如果不存在或者超过一个月,系统会丢弃该技术然后执行正常的启动。pack 会在启动结束时包含在启动过程中在内存中打开的文件以及块信息。

如果该文件存并且比较新(newer than a month old),在 pack 中的文件通过 readahead 系统调用读取至 page cache 中

readahead 是一个普遍用在 Linux 上的文件预取(prefetching)的技术,它会通过系统调用将文件内容加载至 page cach。当该文件随后被取用时,该文件的内容会从物理内存而非硬盘中读取,这样会大大的加快读取速度,我们知道下面这些存储器件的访问速度:寄存器 > L1/L2高速缓存 > 内存 > 闪存 > 硬盘。
在安装了新的服务或者更新了系统后,可以做一次 "profile" 操作,这样可以让 ureadahead 载入新的预读文件,启动时在 kernel 参数后面加上 "profile" 就可以了。

注意:ureadahead 对于 SSD(Solid State Disk) 也就是固态硬盘并没有什么效果,主要针对的是 HDD(Hard Disk Drive)。

在大致了解了下 ureadahead 是什么时候来看看下面遇到的问题,在 Ubuntu-10.04.3-x86_64 的系统安装完毕启动时,出现下面类似的内容:

init: ureadahead main process (798) terminated with status 5

打开 /etc/init/ureadahead.conf,发现下面的两句话:

start on starting mountall

我理解的意思当系统 mountall 时就开始 ureadahead 的机制,而 ureadahead 需要读取 /var/lib/ureadahead/ 目录下的内容,由于在 fstab 中 / 是优于 /var(单独分区)挂载的,而此时 /var 还没挂载,自然找不到相应的文件,因而出现上面的错误。

要解决此问题可以将挂载的时间修改或者直接禁用掉。

# sed -i 's/start on starting mountall/start on mounted MOUNTPOINT=\/var/' /etc/init/ureadahead

或者

# mv /etc/init/ureadahead /etc/init/ureadahead.bk

重启之后查看 /var/log/boot.log 文件,发现如下的信息:

init: ureadahead-other main process(777) terminated with status 4

在看了 Ubuntu 的相关文档后发现这个是正常的返回值。这个并非是 ureadahead 的一个 bug。这个数值表示在 fstab 这个文件中存在这样的一个挂载点,该挂载点中并没有在系统启动过程中需要的文件。

参考:

http://en.wikipedia.org/wiki/Readahead
http://ubuntuforums.org/showthread.php?t=1434502

  • http://www.yetone.net yetone

    幸亏我是SSD,不然又要折腾了