前幾天公司的電源瞬斷,我的一台使用 reiserfs 的主機就此再也無法開機:『root 檔案系統損毀』。後來拔硬碟到另外一台電腦做 fsck 之後是復活了,但也嚇出了我一身的冷汗。長久以來總一直聽到有關 reiserfs 的種種負面評論,親身體驗之後才知道真的不是一般的恐怖。於是興起來把我所有主機裡的 reiserfs 丟掉的念頭。
要轉換檔案系統是很麻煩沒錯。但最麻煩的是:該選擇哪一種檔案系統才好?Google 了半天,幾乎各種檔案系統都有其支持者和種種見証及說法讓人無所適從,甚至種種測試報告及使用心得,其結論都大異其趣,還真叫人不知該聽信哪一個才好。於 是我決定自己動手測試,畢竟自己動手測過,感覺才會實在。
測試環境:
CPU:Intel(R) Pentium(R) 4 CPU 2.80GHz
RAM:1GB(其中約 600 MB 掛載為 tmpfs)
Kernel:2.6.29-RC1
Swap:(none)
參加測試的檔案系統簡介:
-
ext2:老牌 Linux 檔案系統,不支援 journaling。
-
ext3:當今各大 Linux 預設使用的檔案系統。支援 journaling。
-
ext3 (data):加上 journal_data 功能的 ext3。
-
ext4:ext3 的下一版本。已正式進入 kernel 2.6.28 中。
-
reiserfs:號稱最快的 FS。Linux 上第一個支援 journaling 的檔案系統。
-
reiserfs (data):加上 journal_data 功能的 reiserfs。
-
reiser4:reiserfs 的下一版。(尚未進入 kernel 中)
-
jfs:由 IBM 所開發的 journaling 型檔案系統。已停止開發。
-
xfs:由 SGI 所開發的 journaling 型檔案系統。
-
vfat:古老 DOS/Windows 檔案系統,不支援 journaling。
-
ntfs:現今 Windows 的主流檔案系統。在 Linux 上是經由 fuse 來支援 ntfs。
-
zfs:由 Sun 所開發的終極檔案系統。在 Linux 上是經由 fuse 來支援 zfs。
-
btrfs:下一代 Linux 預設使用的檔案系統。已進入 kernel 2.6.29 RC1 的測試分支中。
測試方式:
-
把 Swap 關掉。這是為了避免 Swap 到硬碟會影響測試結果。
-
將650 MB 掛載為 tmpfs。因為 1GB 的 RAM 太大了,故意減少 RAM 的空間。據說測試資料要是 RAM 的 2 倍,結果才會較準確。不過要有塞資料給 tmpfs,它才會真的佔用 RAM 的空間,所以敝人計劃要塞 Debian Etch 的 iso 檔進去,並把它當作資料來源。
-
把 Debian Etch 的 iso 檔複製到 tmpfs 裡。
-
掛載該 Debian Etch 的 iso 檔。因為 RAM 的讀取速度應該會遠大於硬碟的讀取速度,用 RAM 當資料來源比較不會影響到測試結果。
-
開始將該 iso 裡的檔案及目錄複製到測試分割區裡。然後刪除約一半的檔案。如此重覆 24 次。這是模擬人們使用硬碟會不斷寫入刪除資料的動作,讓磁碟裡的資料散亂。最後將硬碟寫滿。
-
再刪除一部份資料以空出空間做為測試用。如此硬碟裡的資料應該算是十分散亂了。
-
開始測試資料的讀出、寫入、列出、搜尋、計算剩餘空間等等。並記錄其時間及 CPU Loading。
以下為測試結果:
剛開始寫入硬碟的速度:
btrfs 不愧是下一代 Linux 預設使用的檔案系統,速度實在驚人,竟然連 reiser4 都追不上。
而 ext3 / jfs / xfs 就真的有待加強了。ext3 慢 btrfs 約 36%,jfs 慢 btrfs 約 40%,xfs 慢 btrfs 約 60%。
而加上了 journal_data 功能的 reiserfs 及 ext3 就更慢了,因為所有的資料都要寫入硬碟 2 次。
zfs 和 ntfs 由於是用 fuse 實作的,所以實在慢得可憐。
在磁碟裡的資料散亂後,寫入硬碟的速度:
看來,在磁碟裡的資料散亂後,btrfs 會有 fragment 的問題,速度上己被 reiser4 追過。但還是遙遙領先其它的檔案系統。
此時,ext3 慢 btrfs 約 27%,jfs 慢 btrfs 約 30%,xfs 慢 btrfs 約 60%。
fragment 的比率:
這是資料在最剛開始及最後時,寫入速度的比較。jfs 的表現令人驚豔,但也慢了約 13%;btrfs 和 xfs 就有待加強了,約慢了 23% 左右。
ntfs 和 zfs 也許不是 defragment 做得好,而可能是因為碟裡的資料是否散亂已不是速度的瓶頸 - 用 fuse 來實作的速度實在太慢了,慢到連磁碟 I/O 變慢了都不太影響到測試結果。 XD
讀出、寫入、列出、搜尋、計算剩餘空間等等的效能表現:
reiserfs 不愧是檔案系統的效能之王,佔據了前 1、2 名。而 jfs 則慢了 reiser4 約 40% 左右,xfs 則是慢了 reiser4 約 65% 左右。差距實在很大。
不過在本測試中,操作的多是一些 < 10MB 的小的檔案,對於像是 xfs 這類適用於 > 500MB 大檔案的檔案系統其實並不公平。但個人認為 Linux 系統裡本來就是充斥著小檔案,所以其實也有必要如此測試才行。
敝人也試著用 > 500MB 的大檔案來進行測試,除了 ntfs 和 zfs 之外,最慢的 jfs 也只比最快的 reiser4 慢約 13%,個人認為差距沒有想像中大。
據 說 xfs 在操作 > 1TB 的檔案的速度是其它檔案系統完全比不上的:xfs 要刪除一個 1TB 的檔案和刪除 1KB 的檔案所花費的時間是一樣的;但若是 ext3 則可能要刪上幾個小時。但因為敝人實在沒有什麼操作 1TB 檔案的機會,所以這個功能對敝人而言實在是英雄無用武之地。
另外,每個人、甚至每個目錄操作檔案系統的習慣都不同,有的目錄(像 /var)常在做讀寫動作;而 像 /usr 就讀取比較多,/home 則用ls、讀寫的機會比較高,find 和 du 因為會耗費大量磁磁 I/O 敝人就不常用...一個測試要能完全模擬人們使用磁碟的習慣是不可能的。所以這個測試一定有其不準確的地方,僅供參考。
CPU 使用量:
如 圖,藍色的是 %user,紅色的是 %system,而黃色的是 %iowait。大部份的檔案系統的 %user 都不到2%,差距實在不大;ntfs 和 zfs 是運作在 user space,所以數據才會如此嚇人。而在 %system 上,xfs / jfs /ext3 都約在 10% 上下,其實算是不錯的了。reiserfs 約是 20%,而 btrfs 則是33%,應該是還有很多的調整空間。xfs 竟然還有 18% 是 idle 的,實在太驚人了。要不是 xfs 有著一些較為不足之處,其實敝人光看這個數據,真的會直接轉用 xfs。磁碟空間使用量:
這個數據是指,當 zfs 塞滿後,用同樣的資料量去塞別的檔案系統,會佔用多少硬碟空間。
xfs/btrfs/reiserfs/vfat/ntfs/jfs 的比率十分接近,而 ext2/3/4 的表現就很糟了。使用ext2/3/4 會無謂得浪費很多硬碟空間,在本測試中,ext3 會比 xfs 多佔用 12% 的硬碟空間,ext3 據說要再保留 10%的硬碟空間否則效能會嚴重下滑,想想真的是太超過了。zfs 則是磁碟空間使用量最大的。
另 外,圖中 btrfs 的硬碟使用率極佳,但在個人的測試裡,btrfs 只到約 86% 就回應已無可用空間,但 btrfs 不是支援動態inode 嗎?真令人百思不解。最下方那條 btrfs (guess) 是假設,若那 14% 是被 btrfs 暗槓掉的話,那麼 btrfs 真正的使用空間應該會再多上 16%,那麼它的使用空間就會比 zfs 更多了。
請注意,隨著分割區大小的不同,以上的數據將會跟著不同。
敝人對以上各種檔案系統的評語:
ext2:
在隨身碟上可以考慮使用這個格式,以減少磁碟讀寫,延長隨身碟使用年限。
無謂得浪費很多硬碟空間。
ext3:
因架構上的優勢及長年的開發測試,據說有著最可靠的回復能力。
- 在掛載硬碟時,可用 -o journal_data 啟用 data journaling 功能。那麼,在寫入磁碟時,會先把資料內容先寫入journal 裡,然後再真的寫到磁碟上,如此能有效再進一步降低資料丟失的機率。不過因為資料會寫入磁碟 2 次,效能也會因而大幅下滑。
沒有 undelete 功能。
在開機時會視情況進行自我檢查。有時會等上半小時。非常令人不耐。ext4 據說有試著解決這個問題了。
可用:
來關閉 max-mount-counts,讓它不會在掛載多次後便進行 fsck;並設定 interval-between-checks 為 1 個月。
tune2fs -c 0 -i 1m /dev/hdXY 除了 journal 會佔用大量的硬碟空間之外,有人建議至少要保留 10% 的未使用空間,否則會造成 ext3 效能低落。
ext4:
向前相容於 ext3,但有著更可靠的 checksumming in journal 功能。
在個人測試中,速度可逼進 ext2。
和 ext3 類似的,會無謂得浪費很多硬碟空間。
- 加快了 fsck 的速度。
可線上重整。
reiserfs:
速度飛快。這也是之前敝人選擇這種檔案系統的主因。
和 ext3 一樣,也支援 data journaling 功能。不過效能也會大幅下滑。
- 有些目錄的操作是非同步的,不太適合用於某些系統(像 postfix)上。
會佔用較多的 CPU 及記憶體。較適合用於較新的電腦上。
回復能力較差。常常有人抱怨說,硬碟裡的資料在不正常斷電後就一去不回了。
掛載及卸載速度很慢,嚴重影響到開機速度。
- 個人在使用時,偶爾偶爾在搬移檔案時會出現 Disk I/O 100% 超過 30 秒的怪事。
隨著主要開發者入獄,開發工作幾近停頓了。
reiser4:
改進了 reiserfs 的眾多缺點,且速度比 reiserfs 更快!
隨著主要開發者入獄,開發工作幾近停頓,應該不可能進入 kernel 了。
xfs:
在操作一些充斥著小檔案的目錄,或是在大量新增或移除檔案或目錄時,速度很慢。因此不太建議使用在 / 上。
在操作 > 200MB 的檔案時有其優勢。但個人以 600MB 的檔案實測結果是相差無幾。
可線上重整磁區。
只要使用時日一久,效能下降得很嚴重。
沒有 undelete 功能。
有報告指出,在強迫關機後,甚至只是 umount,檔案可能因而損壞且難以復原。
在所有的檔案系統中,佔用最少的 CPU Loading。
- 掛載及卸載速度極快。
仍在開發維護中。
jfs:
佔用較低的 CPU Loading。
綜合比較起來,速度會比起 ext3 快上一些些。
據說其修復能力可以和 ext3 比擬。
磁碟較不容易有 fragment 的問題。
- 掛載及卸載速度極快。
可將 journal 放到另一顆硬碟上,不過在實作上是有點麻煩。
- 在刪除大量檔案時速度很慢。
雖然 IBM 開發這個磁碟系統時間超過 10 年,但在它在 Linux 真正普及之前就已停止開發了,所以使用的人並不多。所以是否有潛在的問題也未可知。
- Debian Installer 預設就會提供 fsck.jfs。
vfat:
- 還是很常見於數位相機、數位攝影機、手機等等攜帶裝置中。
速度中下,且不支援 journaling。
- 磁碟 fragment 的問題很嚴重。
ntfs:
因為是經由 fuse 來支援 ntfs 的,所以速度很慢很慢。但對於還在使用 Window/Linux 雙系統的使用者而言,它仍是一個很重要的工具程式。
- 在個人測試中常導致 Kernel Panic。
zfs:
- 雖然號稱是終極檔案系統,但因為授權的因素而無法進入 kernel 中,因而是經由 fuse 來支援 zfs 的,所以速度很慢很慢。在 Linux 上幾乎沒有競爭力。
btrfs:
基本上是為了向 zfs 看齊而開發出來的 Linux 終極檔案系統。
支援一些很先進的磁碟功能,像是磁碟快照、磁碟陣列、動態掛載等等。
在速度上也是傲視群倫。
更可靠的 checksumming in journal 功能。
有對 SSD 做最佳化。
可線上重整磁區。
尚在測試實驗階段,連基本架構都未定案。
於是,幾經考慮,在 btrfs 推出之前,在 ext3、reiserfs、jfs 和 xfs 等 4
種檔案系統之間,敝人的首選應該會是jfs - CPU Loading 低、硬碟使用率高、效能中上、回復能力佳。至於 IBM 已停止開發 jfs
一事,我想只好先不管了。
不過,關於資料回復一事,其實以上的評論大多來自網路一些使用者本身的使用經驗。但同是 ext3,有些人說它的回復能力是其它檔案系統所比不上的,但也有使用者回報他的 ext3 死了無數次。所以這些評論請頂多當作參考,不要太過相信呀!
而要讓磁碟資料長保安康,請確保:
-
記憶體務必好好測過。有問題的記憶體是硬碟資料殺手。
-
請安裝 UPS。電腦常不正常關機肯定會影響到磁碟資料的。
-
要進行可能會 kernel panic 的動作,像測試 kernel module 前,請先祈禱。
-
備份、備份、備份,永遠不嫌少。
然後,再加點運氣,也許那些磁碟資料真能跟著您直到天長地久、海枯石爛呢!