在一兩年前,Linux 核心尚缺乏一個好的的硬碟預讀機制時,桌面系統的使用者若要加速開機的速度,通常得先解決磁碟存取速度的瓶頸問題。於是得依賴如 readahead 這樣的工具來預先載入想讀入的檔案,以便提高系統載入的速度。

readahead 的基本原理是先預先載入開機過程可能使用的檔案到記憶體中 (page cache)。如此開機程式執行時,便可節省讀入檔案的時間,進而加快開機速度。

當然,前提是你要有足夠的記憶體作快取。若你的系統只有小記憶體,不建議使用 readahead. 目前在 Ubuntu, Debian GNU/Linux 下使用的版本基於 Erich SchubertRobin H. JohnsonScott James Remnant,改自於 Gentoo 的版本。Fedora Project 則有另外一個概念相同,但由 RedHat 所開發的的不同實做

以下所說明的是 Ubuntu, Debian GNU/Linux 版本。

為了使 readahead 可以正確的對開機所需的檔案快取,你必須教會 readahead 目前有多少檔案需要被預先載入,原則上只需要作一次。Ubuntu 在釋出官方版本時,便會內建一組預先較調的檔案列表。但若每次更新核心或套件系統,特別是開機所需的程式,其實都應該做過一次 “profile” 的動作,以便 readahead 保持正確的載入檔案列表。

相較於 Debian 說明 readahead 的說明文件,在 Ubuntu 由於仍使用舊版,使用上則頗為謎樣,Ubuntu 的README.Debian 只提醒你 readahead 不能用在 NFS 上,忘了說明使用方法。在 Ubuntu 上,readahead 會檢查 /proc/cmdline 中是否有 profile 參數,若有則進行 profiling 的程序。若使用 Grub,則操作方式如下

  1. 開機見到 “GRUB loading” 提示時,按下 “Esc” 鍵
  2. 按下 “e” 鍵進行編輯 (若有多核心,先選擇預設開機之核心行)
  3. 按下 “向下” (↓) 鍵到 “kernel” 行
  4. 再選 “e” 鍵進行編輯
  5. 你會進入參數編輯模式,移動到參數最後加入 “profile”,”profile” 字樣前記得填入空白。
  6. 按下 “Enter” 完成編輯
  7. 按下 “b” 鍵開機

第一次開機稍慢,但作過一次 profile 後,之後的開機速度應該會提高些。

在 Debian 下,只需用 root 下達以下指令後,重新開機即可

# touch /etc/readahead/profile-once

但在新版的 Linux 核心,有 On-demand read-ahead 等技術的加持,當下已經不特別需要這樣的工具,有時甚至反而會拖慢開機的時間。

試著在安裝了 Ubuntu EeeASUS EEEPC 701 上測試 (核心為 2.6.24-16-generic),以預設安裝軟體測試開機到桌面環境出現的 uptime,每次都大約 60s。進行 profile 則約使用 80 秒,profiled 過 readahead 開機速度相同。

另外也在我的 Thinkpad X60 1706-B69 上測試,軟體是 Debian sid, 核心為 2.6.26-1-686。系統裝了相當多雜七雜八的軟體,硬體裝了 2G 記憶體,硬碟則是 8M Buffer, 5400RPM 的 FUJITSU MHV2100B。profile 大約使用 152s,profiled readahead 開機則約 55s,關掉 readahead 則約 53s。

其實在 Linux 上做檔案快取 (readahead/prefetch) 的技術頗多,除了稍早講的 readahead, 還有 preload, bootcache/filecacheprefetch. (prelink 是加快 ELF shared libraries/executables 的載入速度,不算是檔案快取)

不過 readahead 只在開機的產生效用,若開機後得依賴 preload 等工具來做檔案快取。但以 user space 的 daemon 每幾秒掃一次系統的效果實在不怎麼好。

比較吸引我注意的是 SoC 2007 中的一個計畫 prefetch

prefetch 算是融合了前幾個計畫的優點與特色的專案,計畫整合了 kernel patch 與 userspace 工具,主要特色是透過核心作監視各軟體啟動所需要取用的檔案,配合 userspace 工具做到自動更新(dynamic profiling)。

對使用者而言,操作起來容易許多,不需要像 readahead 或 bootcache/filecache 作手動「教育」,且使用效率上也會比 preload 來的好。當然,與 readahead 相較起來,實做方式也比較輕盈、聰明。

技術細節可以參考 Krzysztof Lichota 的提案 (Ubuntu Wiki) 與簡報。Prefetch 原始碼可於 Launchpad 下載,相關文件與文獻位於 Google Code. 另外,Behdad Esfahbod 的論文 “Preload — An Adaptive Prefetching Daemon” 也很值得參考。

BTW, Krzysztof Lichota 也是 one-click installer 的開發者。