Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

章 7. 檔案系統

請詳讀本章節,以取得有關於 RHEL 所支援使用的檔案系統,以及如何優化其效能的相關總覽。

7.1. 檔案系統微調考量

所有檔案系統皆有幾項共同的微調考量:系統上所選擇的格式化與掛載選項,以及可改善應用程式效能的動作。

7.1.1. 格式化選項

檔案系統區塊大小

區塊大小可在進行 mkfs 時選擇。可用的區塊大小範圍取決於系統本身:最大上限為主機系統的最大分頁大小,而最小限制則取決於所使用的檔案系統。預設的區塊大小適用於大部份的情況。

若您會建立許多比預設區塊大小還要小的檔案,您可設置較小的區塊大小,以儘可能縮小磁碟上所浪費的空間。然而請注意,設置較小的區塊大小可能會使檔案系統的最大大小受限,並且可能會造成額外的 runtime 負荷,特別是比所選區塊大小還要大的檔案。
檔案系統幾何分佈

若您的系統使用等量(striped)的儲存裝置(例如 RAID 5),您可在進行 mkfs 時,將資料和 metadata 與基礎儲存裝置幾何對稱,以改善效能。當使用軟體 RAID(LVM 或是 MD)和某些企業硬體儲存裝置時,這項資訊會被查詢並自動設置,不過在許多情況下,管理員必須在命令列上以 mkfs 來手動指定這項幾何分佈。

欲取得更多有關於建立和維護這些檔案系統上的相關資訊,請參閱《儲存裝置管理指南》。
外部日誌

工作量若包含大量 metadata,即代表日誌檔案系統(例如 ext4 和 XFS)的記錄檔部分會時常更新。若要儘可能減少檔案系統搜尋日誌的時間,您可將日誌放置在專屬的儲存裝置上。然而請注意,若將日誌放置在速度比主要檔案系統還要慢的外部儲存裝置上,使用該外部儲存裝置所得到的結果可能會不甚理想。

警告

請確認外部日誌有足夠的可靠性。失去外部日誌將造成檔案系統損毀。
執行 mkfs 時會建立外部日誌,掛載時會指定日誌裝置。欲取得更多資訊,請參閱 mke2fs(8)mkfs.xfs(8)mount(8) man page。

7.1.2. 掛載選項

屏障

「寫入屏障」(write barrier)是個用來確保檔案系統 metadata 正確寫入永續性儲存裝置,並正確排序的 kernel 機制;即使停電,揮發性寫入快取的儲存裝置亦能確保資料無誤。啟用了寫入屏障的檔案系統亦可確保任何透過 fsync() 傳輸的資料皆能保有永續性(預防停電的狀況發生)。預設上,RHEL 會在所有支援寫入屏障的硬體上啟用屏障。

然而,啟用寫入屏障會使部分應用程式效能大幅降低;特別是大幅使用 fsync() 的應用程式,或是建立和刪除許多小型檔案的應用程式。如果您能接受沒有揮發性寫入快取的儲存裝置、或是因為停電而導致檔案不一致和資料遺失等情況,您可藉由使用 nobarrier 掛載選項來停用屏障。欲取得更多相關資訊,請參閱《儲存裝置管理指南》。
存取時間(noatime)

以前讀取檔案時,檔案的存取時間(atime)必須更新於 inode metadata 中,這包含了額外的寫入 I/O。若不需要正確的 atime metadata,請以 noatime 選項掛載檔案系統,以避免更新這些 metadata。然而在大部份情況下,基於 Red Hat Enterprise Linux 6 kernel 中的預設相對 atime(或是 relatime)特性,atime 不會是個極大的額外負荷。relatime 特性僅會在先前的 atime 比修改時間(mtime)或是狀態更改時間(ctime)還要早的情況下更新 atime

注意

啟用 noatime 選項也會啟用 nodiratime 的特性;您無須同時設置 noatimenodiratime
增加了對預先讀取的支援

「預先讀取」(read-ahead)會透過事先讀取資料,並將之載入分頁快取中(讓這些資料能預先存在記憶體中,而不用再由硬碟存取),以提升檔案存取的速度。某些工作量(例如那些包含了大量循序 I/O 串流的工作量)能有效受益於高度的預先讀取值。

使用 tuned 工具和等量的 LVM 能提升預先讀取的值,不過這對於部分工作量來說,並非永遠足夠。此外,RHEL 不一定總是根據檔案系統設置,適當的預先讀取值。比方說,若某個強大的儲存裝置陣列以單一強大的 LUN 的方式呈現給 RHEL,作業系統並不會把它視為是一個強大的 LUN 陣列,因此預設上也就不會完善使用此儲存裝置潛在的預先讀取效能。
請使用 blockdev 指令來檢視並編輯預先讀取值。若要檢視某個區塊裝置目前的預先讀取值,請執行:
# blockdev -getra device
若要修改該區塊裝置的預先讀取值,請執行下列指令。N 代表 512 位元組磁區的數量。
# blockdev -setra N device
請注意,透過 blockdev 指令選擇的值不會保有永續性。我們建議您建立一份 runlevel init.d script,以在開機時設置這個值。

7.1.3. 檔案系統維護

清除未使用的區塊

「批次清除」與「線上清除」皆為已掛載之檔案系統,用來清除未使用之區塊所進行的作業。這些作業亦適用於固態硬碟和精簡佈建的儲存裝置。

使用者可透過 fstrim 指令來執行「批次清除作業」(batch discard operation)。這項指令會清除檔案系統中,所有符合使用者指定條件的未使用區塊。只要檔案系統下的區塊裝置支援實體清除作業,RHEL 6.2 以上版本搭配 XFS 與 ext4 檔案系統就支援這兩項作業類型。若 /sys/block/device/queue/discard_max_bytes 的值非零的話,即代表實體清除作業受支援。
線上清除作業」(online discard operation)可在進行掛載時透過 -o discard 選項(在 /etc/fstab 中或是作為 mount 指令的一部分)來指定,並在無使用者互動的情況下即時執行。線上清除作業僅會清除狀態由「已使用」切換為「可用」的區塊。線上清除作業在 RHEL 6.2 以上版本的 ext4 檔案系統上受到支援,並且也在 RHEL 6.4 以上的 XFS 檔案系統上受到支援。
Red Hat 建議您使用批次清除作業,除非批次清除對於系統的工作負載來說並不適用,或是您必須透過線上清除作業,以維持效能。

7.1.4. 應用程式考量

預先分派

ext4、XFS 和 GFS2 檔案系統皆支援透過 fallocate(2) glibc 呼叫,來進行高效率的空間預先分配功能。在某些情況下,檔案可能會因為寫入模式而過度分散,並間接影響讀取效能,這時空間預先分配就會是一項非常有幫助的技巧。預先分配功能會標記磁碟空間,在不寫入任何資料的情況下,使該空間猶如早已分配給了某個檔案。直到真實的資料寫入某個預先分配的區塊之前,讀取作業所回傳的值將會是零。