這是 Arjan van de Ven 與 Auke Kok Linux Plumbers Conference 2008 上的展示畫面。

在讀 O’Really 對 Arjan van de Ven 的訪問 How PowerTOP, LatencyTOP, and Five-Second Boot Improve Desktop Linux) 時,知道了在 Intel Open Source Technology Center 工作的 Arjan 在 PowerTop, LatencyTop 上的努力,以及其他開發者如何利用這些工具來改進軟體的效能與品質。

在訪問後段提到了 Arjan 最近在 Linux Plumbers Conference 2008 上的實做展示,Arjan 的簡報中提到了開發的思維態度應該以五秒鐘內開機為目標,不要把加速開機當作目標。同時也不要弄先開機,再做後續處理,造成系統無法使用的暫時性解決方式。應該想辦法把正確的事情作對來加速速度,如開機時以平行執行方式 (Parallel boot) 啟動系統也不是正確的行為。

這樣的論點,當然讓長期使用這種解決方案的開發者不甚認同,像是 MandrivaFrederic Crozat 就跳出來說明過去幾年來各種平行執行的策略,並說明在 EeePC 上碰到的一些硬體問題,經過調整後,可以讓 Mandriva 在 Eee PC 上以 15 秒內開機。

而 Arjan 的作法是將開機分成四個程序,分別是 Kernel, Early boot, X Server, GUI/Desktop。其中除了 Desktop 系統外,其他的程序都只能花用一秒鐘執行!

在核心的主要修改是利用從 RedHat readahead 改來的 sreadhead 加速軟體的檔案載入速度 (上個月我也介紹過 readahead 加速 Linux 開機速度 ? 。另外 sreadhead 的原始碼會在 Moblin Project 釋出) ,並將所需驅動程式先編入核心,關掉 initrd,預先建好 /dev 下需要的 device files, 同時利用新的 asynchronous initcall level 來載入較不重要的核心模組。如此可將核心載入時間壓縮在一秒。

相關的新 APIs 已經丟到 LKML 上供檢閱,希望可以納入 2.6.28 中。

而開機程序 (init scripts) 則還是利用 sysvinit,不用平行執行 (Parallel Boot) 之方法,也不利用 udev 動態產出 /dev 下的檔案,而是先固定寫死。另外雖說 initscripts 都還保持著原本的版本,在此預設也是不執行的。

另外 X Server 則稍加修改了 xorg-x11-drv-intel 顯示卡驅動程式,讓其在偵測硬體時,就一併先進行硬體設定,且修正了一些 PCI posting 的臭蟲。而且修改 XKB 快取 keyboard mappings,因為 XKB 居然會每次開啟時呼叫 C preprocessor 來編譯 keyboard mappings!至於桌面系統則使用輕量的 XFCE,稍加修改讓桌面程式同時執行。

如此如此,讓 Arjan 硬幹出來的版本,讓那天展示的跑在 ASUS EeePC 901 上 FedoraMoblin 可以在五秒鐘內開機!相較於其他在 ASUS EeePC 901 上得套件系統開機動輒要約30秒到一分鐘,的確快了很多。

但是我要一個只有桌面沒有網路連線的機器要做什麼呢 ? 且許多硬幹的方法,必須針對特定硬體作調整,的確不適用一般新安裝的系統。不過 Arjan 的 Fastboot 的確很值得參考使用,另外許多低效能問題的解決方法也都可以採用。希望這些新的研究可以盡快的套用到更多的環境上才是。

對了 Arjan van de Ven 也是 Linux-ready Firmware Developer Kit 的發起人,Linux-ready Firmware Developer Kit 是協助 BIOS/EFI 開發工程師測試的工具,若你是開發主機板或 BIOS/EFI 軔體的工程師,請別忘了下載來玩玩,或許可以避免發生 Foxcomm 前陣子的窘狀

在一兩年前,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。