fcache:加速linux的启动


一. 简介:

  fcache的作者是Jens Axboe,他是把这个patch当成一个weekend project写的 。

  这个补丁的目的是在不修改文件系统的前提下,而使启动的流程是完全线性的(应该是指读磁盘的流程),从而加速linux的启动,简单的说fcache就是文件系统和块设备之间一种重映射。

  fcache有两种运行模式:prime模式和normal模式。当运行在prime模式时,他缓存一切对目标分区的读操作,写入缓存分区。从而使数据在缓存设备中线性存放,即是一个关于时间的函数。当运行在normal模式时,fcache将会在缓存设备中查找缓存,如果命中的话,那么启动即可以直接读入缓存设备的线性数据。由于启动流程大多时候是重复性的,因此,fcache会提供完美的获取启动数据途径。

  一般来说,第一次启动使用prime模式,准备好缓存数据,以后启动时使用normal模式,可以大大加速启动的速度(只要你的启动流程不变的话)

  这里有一份hzmagnel写的关于fcache原理的文档,有兴趣的同学可以随便翻翻,我们会感动的内牛满面!

  二. 如何使用fcache

  Step 1:给内核打上fcache补丁,推荐的内核版本是2.6.17

  cd /usr/src/linux

  下载补丁 wget http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.17/2.6.17-ck1/patches/fs-fcache-v2.1.patch

  进入内核源代码目录 patch -p1 Block devices->Boot fronted cache driver

  然后重新编译内核,并使用这个内核。

  Step 2:创建fcache的分区

  分区大小为512M左右,文件系统为ext3,如果仅仅为试验,可以暂时使用swap分区作为fcache的分区

  Step 3:修改启动和关闭脚本

  在linux启动的时候,根文件系统第一次被加载的时候是readonly的,等到检查完根文件系统,这时候再用rw的方式remount根文件系统。我们要做事情就是在remount的时候,加上fcache的参数。而remount的所在是因不同发行版而异的,比如在gentoo中,remount在/etc/init.d/checkroot里,而在suse中,remount在/etc/init.d/rootfsck中。我们可以通过grep

  "remount"找到那个脚本。

  找到那个脚本后,找出mount -n -o remount,rw / 2>/dev/null

  修改为mount -n -o remount,fcache_dev=#/*,fcache_prime=0 / 2>/dev/null

  以下针对ubuntu 7.04,写出一种具体做法(注意:其他版本需要做相应调整)

  编辑 /etc/init.d/checkroot.sh脚本,找到

  if ! mount -n -o remount,$rootopts,$rootmode $fstabroot / 2>/dev/null

  then

  mount -n -o remount,$rootopts,$rootmode /

  fi

  修改为

  if ! mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 $fsabroot /

  2>/dev/null

  then

  mount -n -o remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=1 /

  fi

  注意这里fcache_dev=#/*,其中fcache_dev是指我们在第二步创建的那个分区对应的设备。

  #代表主设备号,*代表次设备号。比如笔者的使用的IDE硬盘,是hda10,因此fcache_dev=3/10

  编辑/etc/init.d/umountroot脚本,找到

  mount $MOUNT_FORCE_OPT -n -o remount,ro -t dummytype dummydev /

  2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro dummydev /

  2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro

  修改为

  mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/* -t

  dummytype dummydev / 2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*

  dummydev / 2>/dev/null \

  || mount $MOUNT_FORCE_OPT -n -o remount,ro,fcache_dev=#/*

  /

  ok,现在可以重新启动了,这时候,fcache就会进入prime模式。这次启动会比平时启动稍微慢一点。启动完毕,进入桌面后,执行mount

  / -o remount,fcache_dev=#/*,fcache_prime=0

  我们可以检验一下,fcahce是否工作了

  ken@ubuntu:~$ dmesg | grep "fcache"

  [17179592.200000] fcache: new header: first block 2872, max 294040

  [17179592.200000] fcache: hda10 opened successfully (priming)

  [17180105.728000] fcache: ios r/w 6286/4904, hits 0, misses 0, overwrites 766

  [17180105.744000] fcache: wrote 6286 extents, holding 354656 sectors of data

  [17180105.756000] fcache: wrote header (extents=6286,serial=27)

  [17180105.808000] fcache: header looks valid (extents=6286 extents, serial=27)

  [17180105.824000] fcache: loaded 6286 extents

  [17180105.824000] fcache: hda10 opened successfully (not priming)

  可以看到,fcahce的确处于prime模式,并且缓存启动时的数据。

  最后再次修改/etc/init.d/checkroot.sh,把第一次我们修改的地方,再修改为

  if ! mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 $fsabroot /

  2>/dev/null

  then

  mount -n -o

  remount,$rootopts,$rootmode,fcache_dev=#/*,fcache_prime=0 /

  fi

  即让fcahce处于normal状态,再次启动,你就能享受fcache给你带来的启动如飞的感觉了。

  以后如果你的启动流程变了,比如你增加或减少某些启动脚本,则需要重新激活prime模式一次,即重复一遍上述流程。

  个人觉得从出现gdm的登录窗口,到登录,完全进入桌面环境,加载完启动项。这一段时间,fcache带来的速度提升是相当明显的。

  以下是测试报告

  time1 time2 total

  --------------------------------------------------------------------------------------

  fcache and prime=1 50s 52s 102s

  fcache and prime=0 46s 29s 75s

  without fcache 48s 38s 86s

  注: time1表示从加载内核到出现登录窗口

  time2表示从开始登录到完全启动完毕


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3