章 5. 儲存空間與檔案系統

本章節將概述支援的檔案系統,以及在 Red Hat Enterprise Linux 7 內 I/O 與檔案系統中會影響應用程式效能的設定選項。〈節 5.1, “考量”〉將討論與 I/O 和檔案系統有關的因素,這些因素會影響效能。〈節 5.2, “監視以及診斷效能問題”〉將教您如何使用 Red Hat Enterprise Linux 7 的工具來診斷與 I/O 以及檔案系統設定細節有關的效能問題。〈節 5.3, “設定工具”〉將討論您可以用來解決 Red Hat Enterprise Linux 7 內與 I/O 以及檔案系統相關的效能問題的工具以及策略。

5.1. 考量

適當的儲存空間設定以及檔案系統效能設定,與儲存空間的目有很大的關係。I/O 以及系統效能會受到以下的因素影響:
  • 資料寫入或讀取模式
  • 將軟體的資料分布與硬碟的配置保持一致。
  • 區塊大小
  • 檔案系統大小
  • 日誌大小與位置
  • 記錄存取時間
  • 確保資料可靠性
  • 預先截取資料
  • 預先配置磁碟空間
  • 分散檔案
  • 資源爭用
請閱讀本章節來了解會影響檔案系統的輸送、延展性、回應、資源使用量以及可用性的掛載選項和格式調整選項。

5.1.1. 固態磁碟

固態磁碟 ( SSD ) 使用 NAND 的快閃晶片來儲存永續性資料,而不是使用旋轉磁盤。它們在整個邏輯區塊位址的範圍內持續提供存取資料的時間,而且不會像旋轉磁盤一樣造成搜尋的成本。它們每一 GB 的儲存空間較貴,而且有較少的儲存密度,但是跟 HDD 硬碟比起來,它們也有較低的延遲現象以及更大的運輸量。
當 SSD 上被使用的區塊接近磁碟的容量,效能通常會下降。效能下降的程度會隨著廠商而不同,但是所有裝置的效能都會在這樣的情況之下下降。啟用捨棄行為可以減緩效能下降。欲了解更多細節請見〈節 5.1.4.3, “維護” 〉。
在預設情況下,I/O 排程器以及虛擬記憶體選項很適合與 SSD 一起使用。
關於 SSD 部署建議的其他資訊請見《Red Hat Enterprise Linux 7 儲存管理指引》,以下為連結:http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/

5.1.2. I/O 排程器

I/O 排程器決定 I/O 作業在儲存裝置上執行的時間以及執行時數。它也被稱為 I/O 升降舵。
Red Hat Enterprise Linux 7 提供三個 I/O 排程器。
deadline
預設的 I/O 排程器會封鎖 SATA 磁碟以外的裝置。「deadline」試圖在要求到達 I/O 排程器時開始提供保證延遲。這一個排程器在大部分使用情況下是很適合的,但是尤其適合那些讀取作業比寫入作業更常發生的情況。
已排入佇列的 I/O 要求會被分類為讀取批次或是寫入批次,然後會被排程來執行增加 LBA 次序。讀取批次在預設情況下比寫入批次優先,因為應用程式在讀取 I/O 時較容易封鎖。當一個批次處理完成,「deadline」會檢查寫入作業已經渴望處理器的時間多久了,然後會排程下一個適合的讀取或是寫入批次。每一個批次處理的要求數量、每一個寫入批次發行的讀取批次數量以及要求過期之前有多少時間都是可以設定的。欲了解更多細節,請見〈節 5.3.4, “微調排程器期限”〉。
cfq
預設的排程器只適用於被識別為 SATA 磁碟的裝置。「cfq」是完全公平隊列( Completely Fair Queueing)排程器,它將程序分為三個不同的類別:即時程序、盡力程序以及閒置程序。即時程序比盡力程序先執行;而盡力程序比閒置程序先執行。這意味著即時類別的程序急需盡力程序,以及閒置程序的處理器時間。程序可以經由預設,指派至盡力類別。
cfq」使用歷史資料來預測應用程式之後是否會發出更多 I/O 要求。如果會有更多 I/O,「cfq」會閒置來等新的 I/O,就算別的程序的 I/O 在等待執行也相同。
由於這個閒置的傾向,cfq 排程器不應該與不會造成大量搜尋罰則的硬體接合使用,除非它被調正過了。它也不應該與其他非工作節省的排程器接合使用,例如主機型硬體 RAID 控制器,因為堆疊這些排程器會導致大量的延遲。
cfq」行為是可以被設定的,欲了解更多細節請見〈節 5.3.5, “微調 cfq 排程器”〉。
noop
noop」I/O 排程器實施簡易的先進先出 FIFO(first-in first-out)排程演算法。請求會透過上次使用的快取被合併於一般區塊層。對於使用快速儲存,且極度仰賴 CPU 的系統,這是最好的排程器。
欲了解設定不同的 I/O 排程器,或是給一個特定的裝置指定不同排程器的細節,請見〈節 5.3, “設定工具”〉。

5.1.3. 檔案系統

請閱讀本小節來了解 Red Hat Enterprise Linux 7 支援的檔案系統的細節、建議的使用案例以及各檔案系統普遍可以使用的格式和掛接選項。欲了解這些檔案系統詳細的微調建議細節,請見〈節 5.3.7, “為效能設定檔案系統”〉。
XFS
XFS 是一個強大而且高度可調式的 64 位元檔案系統。它是 Red Hat Enterprise Linux 7 預設的檔案系統。XFS 使用的是基於分割的檔案分配,而且以許多分配配置為特徵,包含預先分配以及延遲的應用程式。兩者皆會減少分散提升效能。它也會支援中繼資料日誌紀錄,這樣子可以協助毀損復原。XFS 在被掛載以及使用中時可以被重組以及放大。Red Hat Enterprise Linux 7 支援一些特定是 XFS 備份以及還原的公用程式。
對 Red Hat Enterprise Linux 7.0 GA 來說,XFS 會被支援至一個 500 TB 的最大檔案系統以及 8 EB 的最大檔案位移 ( 疏鬆檔案 ) 。欲了解管理 XFS 的細節,請見「Red Hat Enterprise Linux 7 儲存系統管理員指引」,連結為 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。欲尋求微調 XFS 的協助,請見〈節 5.3.7.1, “微調 XFS”〉。
Ext4
ext4 是 ext3 檔案系統的可調式新版本。它的預設行為對大部分的工作負載來說是最好的。然而,它只會被支援至 50 TB 大小的最大檔案系統以及 16 TB 大小的最大檔案。欲了解管理 ex4 的細節,請見「Red Hat Enterprise Linux 7 儲存系統管理員指引」。請至以下網址取得:〈http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/〉。欲尋求微調 ext4 的協助,請見〈節 5.3.7.2, “微調 ext4”〉。
請注意,ext4 的叢集配置特徵 ( bigalloc ) 目前並沒有經過測試或是在 Red Hat Enterprise Linux 7 被支援。
Btrfs (技術預覽 )
Btrfs 是一個寫入時複製的檔案系統,它提供延展性、容錯,以及輕鬆的管理。它包含內建的快照與 RAID 支援。它使用資料以及 metadata 的總和檢查碼來提供資料完整性。它也使用資料壓縮來改善效能以及更有效地使用空間。作為技術預覽(Technology Preview),它被支援至一個 50 TB 大小的最大檔案系統。
Btrfs 最適合桌面以及雲端儲存。當裝置一開始被格式化時,最好將 btrfs 微調來符合使用目的。
Red Hat Enterprise Linux 7 提供 btrfs 作為技術預覽。欲了解 Technology Preview 的特徵,請見 〈https://access.redhat.com/site/support/offerings/techpreview/〉。
欲了解管理 btrfs 的細節,請見「Red Hat Enterprise Linux 7 儲存系統管理員指引」。您可以從以下連結取得:http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。欲尋求微調 btrfs 的協助,請見〈節 5.3.7.3, “微調 btrfs”〉。
GFS2
GFS2 是 High Availability Add-On ( 高可用性附加元件)的一部分。它提供叢集檔案系統支援 Red Hat Enterprise Linux 7。GFS2 在全部的伺服器提供一個一致的檔案系統映像,允許伺服器從單一共享的檔案系統閱讀以及寫入。
GFS2 支援至 250 TB 大小的最大檔案系統。
欲了解管理 GFS2 的細節,請見「Red Hat Enterprise Linux 7 儲存系統管理員指引」。請從以下連結取得:http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/。欲尋求微調 GFS2 的協助,請見〈節 5.3.7.4, “微調 GFS2”〉。

5.1.4. 檔案系統的一般微調設定

本小節涵蓋所有檔案系統常見的微調設定。欲了解針對您的檔案系統的微調建議,請見〈節 5.3.7, “為效能設定檔案系統”〉。

5.1.4.1. 格式化時間的考量

有一些檔案系統的設定決定不能在裝置被格式化之後被改變。本章節涵蓋一些可以使用的選項,這些選項是您在格式化儲存裝置之前必須做的決定。
大小
若要為您的工作負載建立適當大小的檔案系統,要知道的是,較小的檔案系統依比例來說需要較短的備份時間,而且需要較少時間以及記憶體來執行檔案系統檢查。然而,若您的檔案系統過小,那麼它的效能將會因為高度分散而減低。
區塊大小
區塊為檔案系統工作的單位。區塊大小將決定有多少資料可以被儲存於單一區塊之中,因此可以決定同一時間最小量可以被寫入或讀取的資料。
在預設情況之下,區塊的大小是很適合大多數使用案例的。但是如果區塊大小 ( 或者是多重區塊的大小 ) 與同一時間內讀取或寫入的資料數量一樣,或者比它稍為大一些的話,您的檔案系統將有更好的效能以及更有效地儲存資料。小的檔案將會占用一整個區塊。檔案可以被分散至多重區塊,但是這將建立其他執行階段的額外負荷。另外,有一些檔案系統會受限於特定區塊的數目,而這將會限制檔案系統的大小上限。
當您使用「mkfs」指令格式化一個裝置時,區塊大小會被指定為檔案系統選項的一部分。指定區塊大小的參數會隨著檔案系統有所不同。欲了解細節,請見您的檔案系統的「mkfs」man page。舉例來說,欲了解格式化 XFS 檔案系統時可用的選項,請執行以下指令。
$ man mkfs.xfs
幾何分佈
檔案系統幾何分佈與跨列檔案系統的資料發佈有關。如果您的系統使用等量儲存空間,例如 RAID,那麼您可以透過以下方式改善效能:在格式化裝置時使用基礎儲存空間幾何分布來對齊資料和中繼資料。
許多裝置會匯出推薦的幾何分佈,然後會在裝置與特定的檔案系統被格式化時自動被設定。如果您的裝置不匯出這些推薦項目,或者您想要變更推薦的設定,那麼您必須在用「mkfs」格式化裝置時手動指定幾何分佈。
指定檔案系統幾何的參數會隨著檔案系統有所不同。欲了解細節,請見您的檔案系統的「mkfs」man page。舉例來說,欲了解在格式化 ext4 檔案系統時可用的選項,請執行以下指令。
$ man mkfs.ext4
外部日誌
以日誌記錄檔案系統可以記錄在日誌檔案內執行寫入作業(在作業被執行前)會做的變更。這減少了儲存裝置在系統當機或電源失敗時毀損的可能性,並且也會加速復原。
metadata高用量的工作負載與日誌的頻繁更新有關。較大的日誌使用較多記憶體,但是減少寫入作業的頻率。另外,您可以透過以下方法用中繼資料加護的工作負載改善裝置的搜尋時間:將工作負載的日誌放置在跟主要儲存空間一樣快,或者比儲存間更快的專用儲存空間。

警告

請確保外部日誌是穩定的。失去一個外部日誌裝置會導致檔案系統毀損。
外部日誌一定要建立於格式化時,而且也要在掛接時指定日誌裝置。欲了解細節,請見mkfs掛載 的 man page。
$ man mkfs
$ man mount

5.1.4.2. 掛載時間設定

本小節包含可套用於大部分檔案系統的微調決策,以及在裝置被掛載(mount)時可以被指定的微調決策。
屏障
檔案系統屏障可以確保檔案系統的中繼資料被正確寫入以及被安置於持續性儲存區,以 以確保「fsync」傳輸的資料即使電源中斷了也會持續。之前的 Red Hat Enterprise Linux 版本中,啟動檔案系統屏障會明顯減慢大幅度依賴「fsync」的應用程式,或者建立、刪除許多較小的檔案。
在 Red Hat Enterprise Linux 7 中,檔案系統屏障的效能已獲得明顯改善,停用檔案系統屏障的效能效果非常少(少於 3 %)。
欲了解更多資訊,請見「Red Hat Enterprise Linux 7 儲存系統管理員指引」。請從以下網址取得:http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/
存取時間
每當一個檔案被讀取時,它的 metadata 會在被存取時更新(「atime」)。這包含了其它 I/O 寫入。大部分的案例中,這種額外負荷是很小的。在預設情況下,Red Hat Enterprise Linux 7 只有在之前的存取時間比上一次修改次數(「mtime」)更早時,或是狀態變更時(「ctime」)會更新「atime」。
然而,如果更新 metadata 很耗時間,而且並沒有要求準確的存取時間,您可以用「noatime」掛接選項來掛接檔案系統。在一個檔案被讀取時,這將停用更新至 metadata。它也將啟用「nodiratime」行為。此行為在一檔案被讀取時會停用更新至 metadata。
預先讀取
預先讀取行為會透過以下方式加快檔案存取:預先提取有可能會被需要的資料以及將資料載入頁面快取;和我們的磁碟相比,資料在這裡可以更快的被取出。預先讀取的數值越高,系統就可以越快預先提取資料。
Red Hat Enterprise Linux 嘗試設立一個適當的預先讀取數值,是以它在您的檔案系統偵測到什麼為基礎。但是不太可能每次都能準確的偵測。舉例來說,如果一個儲存陣列將自己以單一 LUN 呈現給系統,系統偵測到單一 LUN 而且不為陣列設定適當的預先讀取數值。
與循序 I/O 的重負荷串流有關的工作負載通常從高的預先讀取數值得到效益。Red Hat Enterprise Linux 7 提供的與儲存空間相關的微調檔案會提高預先讀取的數值;使用 LVM 分散讀寫也會有一樣的效果。但是這些調整對所有工作負載來說不總是完全足夠。
定義預先讀取行為的參數會隨著檔案系統有所不同;欲了解細節請見 mount man page。
$ man mount

5.1.4.3. 維護

我們建議您定期捨棄沒有被檔案系統使用的區塊,這對固態磁碟以及精簡佈建的儲存空間來說都是好的。有兩種捨棄沒有被使用的區塊的方法:批次捨棄與線上捨棄。
批次捨棄
批次捨棄是「fstrim」指令的一部分。它捨棄符合系統管理員指定準則的檔案系統內所有沒有被使用的區塊。
Red Hat Enterprise Linux 7 在 XFS 和 ext4 支援實體捨棄作業而且格式化的裝置上支援批次捨棄(意思是,在 HDD 裝置上「/sys/block/devname/queue/discard_max_bytes」的數值不是零,而且 SSD 裝置上,「/sys/block/sda/queue/discard_granularity」的數值不是「0」)。
線上捨棄
線上捨棄作業是在掛接時和「discard」選項一起被設定的,而且會在沒有使用者中斷的狀況下即時執行。但是,線上捨棄只會捨棄從使用中切換至空閒狀態的區塊。Red Hat Enterprise Linux 7 在 XFS 以及 ext4 格式化的裝置上支援線上捨棄。
Red Hat 建議使用批次捨棄,除了需要線上捨棄來維持效能,或者批次捨棄不適合系統的工作負載時。
預先配置
預先配置會在沒有將任何資料寫入檔案空間的情況下將磁碟空間標示為已被配置到某個檔案。這對於限制資料分散以及較差讀取效能來說是很有幫助的。Red Hat Enterprise Linux 7 在 XFS,ext4 和 GFS2 裝置的掛接時間時支援預先配置。請見「mount」man page 來了解適合您檔案系統的參數。應用程式也可以從使用「fallocate(2) glibc」呼叫預先配置空間而得到效益。