上個月在 Australian Linux/OpenSource Magazine 上有一篇報導「Measuring the benefits of the Gentoo approach」,文章提到,每個人都說 Gentoo 從源碼中編譯出軟體,因此他的機械碼會針對個別硬體作最佳化,使用起來勢必快速許多。
然而卻沒有多少人實際作過測試,所以 Perth Linux Users Group 便 聚在一起,並建立了一些測試,他們以相同的硬體測試 i386、i586 的 Gentoo, i386 的 Debian 以及 i586 的 Mandrake。主要的目的在於測試使用者感覺(user experience),透過編譯核心、開啟大型的程式如 Gnumeric 、Gimp 、Evolution 與 OpenOffice。雖然他的測試非常粗糙,然而 Gentoo 並不比特別最佳化的 Mandrake 快,甚至也不比 Debian 快。
我們料想,除了特定的科學用途程式外,大部份的程式上不至於用到大量的浮點運算,透過重新編譯的效果對於桌面系統的最佳化並不明顯。
加速 Linux 系統的速度,其實有相當多方法,從軟體上著手,可以用 Auto Nice Daemon 來校條系統中相關程序的執行優先值,將 X Window 的優先值提高,那些只為了增加介面美觀友善的小程式可以讓他反應慢些,這樣都是不錯的作法,使用者不會卡在 X Window 的速度而心浮氣躁。此外,你也可以透過 hwtools 調整硬碟的 DMA,加速硬碟的速度。另外一個普遍的方法則是建造自己的核心,我所指的不是僅對自己的核心做客製選項,而是加入 O(1) scheduler, preemptible, low latency 等補釘,Kernel patch of Con Kolivas 是不少人的選擇。Debian 系統中也有已經包裝妥善的套件可以直接安裝應用。除了這些之外,常常更新你的軟體到新版的系統也是頗重要,新版的軟體通常會改進效能。
除此之外,RedHat 在 8.0 中加入了實驗性質的 prelink 支援,這是由 Red Hat 開發者 Jakub Jelinek 所設計的工具,prelink 是一種用來修改 ELF 共享函式庫與執行檔的工具。大部份的 ELF 程式均會使用共享函式庫,這些共享函式庫會在執行時期 (runtime) 時載入到記憶體中並反解 various symbol references。大部份的小型 C 語言程式在此階段都非常迅速,然而使用 C++ 撰寫的程式則會有大量的共享函式庫關聯,所以以動態連結方式執行的程式會在啟動的時候浪費大量的時間。2001 時,有一個稱為 objprelink 的工具,可以用來大幅改進 KDE2 的速度,不過新版的 runtime linker 已經改進許多,所以 objprelink 便比較沒有效果。而且 objprelink 是在編譯時期使用,而 prelink 則是直接修改二位元檔。
prelink 會直接修改執行檔,把那些查詢函式位址的工作擺在執行檔中處理,這可以讓程式啟動時花掉比較少的時間在 relocation 上,這當然也同時減少了記憶體的使用量,在執行大型程式時可以加快速度,一般而言 KDE、OpenOffice 在首次啟動或許可以加速一倍的啟動時間。要使用 prelink 你的系統要在 libelf 0.7 、binutils 2.11.9、kernel 2.4.12、以及 patch 過的 glibc 2.3.1(Debian woody 與 sid 都已經併入補釘)。
在系統中裝好 prelink 後,你可以找到一個設定檔,檔案裡面指定那些目錄下的二元檔案與函式庫要作 prelink,請用 root 身份執行下列指令:
/usr/sbin/prelink –all –conserve-memory
如要復原二元檔案與函式庫到原本的狀態,請執行:
/usr/sbin/prelink –undo -all
我並沒有設計測試程序,來測試執行過後會消耗掉多少硬碟容量,以及加快多少速度,如果你有興趣,請測試並試著紀錄數值。我在自己的機器上對 Mozilla 與 OpenOffice 作了 prelink,如上所述,效果不賴。此外如果你安裝了新版本的程式或是函式庫,你必須重新執行 prelink,否則那些程式只能用原本的速度啟動,使用那些函式庫的程式將無法使用 prelinking。由於 prelink 會更改那些二元檔案與函式庫,所以檔案的內容會被更改,你系統的那些稽核程式可能會大驚失色的警告你程式遭人竄改。
另外,如果你想多了解以 KDE 作為桌面系統的概況,這裡有一份 KDE/Linux Usability Report。
延伸閱讀:
Prelinking and Debian/GNU Linux
http://people.debian.org/~chris/prelink/
Gentoo Linux Prelink Guide
http://www.gentoo.org/doc/en/prelink-howto.xml
Use prelinking – the official way to optimize!
http://hints.linuxfromscratch.org/hints/prelink.txt
Improve Linux performance
http://www-106.ibm.com/developerworks/linux/library/l-perf/?ca=dgr-lnxw83FasterLinux