歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux服務器

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 © Linux教程網 All Rights Reserved