5.3. 設定工具

Red Hat Enterprise Linux 提供一些工具來輔助系統管理員設定儲存空間以及檔案系統。本小節將概述可以使用的工具以及提供例子說明要怎麼使用它們來解決 I/O 和與 Red Hat Enterprise Linux 7 內效能問題相關的檔案系統。

5.3.1. 設定微調檔案增強儲存空間效能

Tuned」以及「tuned-adm」提供一些為了特定使用案例設計來改善效能的檔案。以下檔案對改善儲存空間效能特別有用。
  • 延遲效能
  • 吞吐效能 ( 預設狀況下 )
要在您的系統上設定一個設定檔,請執行以下指令,用您想使用的設定檔檔名來取代「name」。
$ tuned-adm profile name
tuned-adm recommend」指令為您的系統建議適合的設定檔。這也會在開機時為您的系統設定預設設定檔,所以它可以被用來傳回至預設設定檔。
欲了解這些設定檔或是附加設定的選項的細節,請見〈節 A.6, “tuned-adm”〉。

5.3.2. 設定預設 I/O 排程器

預設的 I/O 排程器是在一個裝置的掛接選項裡,沒有指定排程器時所使用的排程器。
要設定預設的 I/O 排程器,請透過以下方式指定您想使用的排程器:附加電梯參數至 kernel 命令列,無論是在開機時或是透過編輯「/etc/grub2.conf」檔案。
elevator=scheduler_name

5.3.3. 裝置設定 I/O 排程器

要設定排程器或是設定一個特定儲存空間裝置的排程器喜好順序,請編輯「/sys/block/devname/queue/scheduler」檔案,而「devname」是您想要設定的裝置名稱。
# echo cfq > /sys/block/hda/queue/scheduler

5.3.4. 微調排程器期限

當「deadline」在使用中,排入佇列的 I/O 要求會被分類為讀取或寫入批次,然後被排程執行以增加 LBA 順序。在預設狀況下,讀取批次比寫入批次優先,因為應用程式在讀取 I/O 時較有可能被阻擋。在一個批次處理完成後,「deadline」會檢查寫入作業已被占用了多久的處理器時間,然後排程下一個適合的讀取或是寫入批次。
以下參數會影響「deadline」排程器的行為。
fifo_batch
在單一批次發行的讀取或寫入作業數量。預設值為「16」。較高的數值可以增加輸送,但是也會增加延遲。
front_merges
如果您的工作負載不會產生前端合併,那麼這個可調數值可以被設為「0」。然而,除非您測量過這個檢查的額外負荷,否則 Red Hat 建議您將預設值設為「1」。
read_expire
讀取要求應該要排程給服務使用的毫秒數量。預設值為「500」(0.5 秒)。
write_expire
寫入要求應該要排程給服務使用的毫秒數量。預設值為「500」(0.5 秒)。
writes_starved
在處理寫入批次之前可以被處理的讀取批次數量。數值設定的越高,讀取批次得到的偏好設定就越大。

5.3.5. 微調 cfq 排程器

當「cfq」在使用中,處理序被放置在三個類別裡:即時、 盡力以及閒置。所有即時程序都比盡力程序先排程;它也比任何閒置程序先被排程。在預設情況下,程序被分類為盡力類別,您可以用「ionice」命令手動調整處理序的分類。
您可以使用以下參數進一步調整「cfq」排程器的行為。這些參數是透過調整在「/sys/block/devname/queue/iosched」目錄之下指定的檔案而設立於每一個裝置上的。
back_seek_max
cfq」將會執行反向搜尋的最大距離,單位為 KB。預設值為 「16 KB」。反向搜尋通常會損害效能,所以我們不建議設定大數值。
back_seek_penalty
這是當磁碟前端正在決定要向前還是向後移動時,套用於反向搜尋的乘數。預設值為「2」。如果磁碟前端位置是在「1024 KB」,而且系統內(舉例來說,「1008 KB and 1040 KB」)有等距離的要求,「back_seek_penalty 」會套用於反向搜尋,磁碟會向前移動。
fifo_expire_async
非同步(已緩衝寫入)要求可以保持無服務的時間長度,單位為 KB。逾期時,單一急需非同步要求會移到分派的清單上。預設值為「250」毫秒。
fifo_expire_sync
同步(讀取或「O_DIRECT」寫入)要求可以保持無服務的時間長度,單位為 KB。逾期時,單一 starved 同步要求會移到分派清單。預設值為「125」毫秒。
group_idle
在預設狀況下,這個參數被設為「0」(停用)。當被設為「1」(啟用),「cfq」排程器會在上一個在控制群組裡發行 I/O 的處理序閒置。這個在您使用等比例權數 I/O 控制群組時,以及「slice_idle」被設為「0」(快速儲存空間上)的時候是很有用的。
group_isolation
這個參數在預設情況下被設為「0」(停用)。當被設為「1」(啟用),它會在不同群組之間提供較強的隔離,但是會減少輸送,因為 fairness 套用於隨機以及循序工作負載。當「group_isolation」被停用(被設為「0」),fairness 只會套用於循序工作負載。欲了解更多資訊,請見安裝於「/usr/share/doc/kernel-doc-version/Documentation/cgroups/blkio-controller.txt」的文件。
low_latency
這個參數在預設情況下被被設為「1」(啟用)。啟用時,「 cfq」藉由以下方式偏好 fairness 多過輸送:為每一個在裝置上發行 I/O 的處理序提供最大等待時間「300 ms」。當這個參數被設為「0」(停用),目標延遲會被忽略,而且每一個處理序會接收完整時間配量。
quantum
這個參數決定「cfq」一次傳送到一個裝置的 I/O 要求數量,基本上會限制佇列深度。預設值為「8」個要求。使用中的裝置可以支援更大的佇列深度,但是增加配量數值也會增加延遲,尤其是對於大的循序寫入工作負載。
slice_async
這個參數決定分配到每一個發出非同步 I/O 要求的處理序的時間配量長度 ( 以毫秒計算 )。預設值為「40」毫秒。
slice_idle
此參數指定毫秒內 cfq 在等待其他要求時閒置的時間長短。預設值為「0」(佇列或是服務樹狀等級沒有閒置)。預設值對外部 RAID 儲存空間輸出來說是很理想的,但是它會降低內部非 RAID 儲存空間的輸出,因為它會增加搜尋作業的整體數量。
slice_sync
此參數決定分配到每一個發出同步 I/O 要求的處理序時間配量(以毫秒計算)。預設值為「100 ms」。

5.3.5.1. 為了快速儲存空間微調 cfq

我們不建議在不受大型搜尋罰則影響的硬體上使用「cfq」排程器,例如快速外部儲存空間陣列或是固態硬碟。如果您要求「cfq」在這個儲存空間被使用,您必須編輯以下設定檔案:
  • 請設定「/sys/block/devname/queue/ionice/slice_idle」至「0
  • 請設定「 /sys/block/devname/queue/ionice/quantum」至「64
  • 請設定「/sys/block/devname/queue/ionice/group_idle」至「1

5.3.6. 微調 noop 排程器

noop」I/O 排程器主要有助於極度仰賴 CPU ,且使用快速儲存量的系統。請求會合併在攔截層,因此「noop」行為的更改是藉由編輯「/sys/block/sdX/queue/」目錄中的攔截層參數進行。
add_random
一些 I/O 事件 對於 entropy 集區的「 /dev/random」有所幫助。此參數能夠設定至「0」,若這些幫助的額外負荷變得可以計算。
max_sectors_kb
指定 I/O 請求的最大位元組(kilobytes)大小。預設值為「 512」 KB。此參數的最小值是由儲存裝置的攔截大小來決定。此參數的最大值是由「max_hw_sectors_kb」的值來決定。
當 I/O 請求比內部消除攔截大小來的大,一些固態硬碟將執行不佳。在此情況下,Red Hat 建議降低「max_hw_sectors_kb」至內部消除攔截大小。
nomerges
請求的合併將有益於大多數的工作載量。然而,停用合併能夠有助於調適(除錯)目的。請設定此參數至「0」以停用合併。 在預設情況下,參數是啟動的(設定至「 1」)。
nr_requests
指定讀取與寫入請求一次能夠排入佇列的最大數量。預設值為「128」;亦即 128 個讀取請求與 128 個寫入請求能夠在下一個程序之前被排入佇列,以請求將一個讀取或寫入進入睡眠狀態。
對於延遲敏感的應用程式,請降低此參數值並限制指令佇列在儲存量的深度,以便返寫 I/O 不會用寫入請求佔用裝置佇列。裝置佇列佔滿時,其他程序嘗試去執行 I/O 的作業將會被設定進入睡眠狀態,直至有佇列空間。接著,請求會以循環的方式被分配,以避免程序持續消耗所有佇列空間。
optimal_io_size
一些儲存裝置通過此參數報告一個最佳 I/O 大小。若此值被提出,Red Hat 建議應用程式盡早配發 I/O ,此 I/O 是相應和最佳 I/O 大小的倍數。
read_ahead_kb
決定作業系統在一個循序讀取的作業中將預先讀取的 KB(kilobyte)數量,以儲存短期內在頁面快取可能需要的資訊。通常,一個高的「read_ahead_kb」值將有助於裝置對應程式;若各個裝置都對應到 128 KB 將會是好的起始點。
輪調
一些固態硬碟不會正確地告知其固體狀態,且以傳統輪調硬碟掛載。若您的硬體裝置沒有自動將此設定至「0」,請自行設定,以停止在排程器中非必要的搜尋減低邏輯。
rq_affinity
在預設情況下,I/O 完成的項目能夠在不同的處理器接受處理,並不一定需要在發行 I/O 指示的處理器中接受處理。請設定「rq_affinity」至「 1」以停用此功能,並且僅在發出 I/O指示的處理器中執行完成項目。此項動作能夠改善處理器資料快存的效率。

5.3.7. 為效能設定檔案系統

本章節涵蓋各檔案系統特定的微調參數,以支援 Red Hat Enterprise Linux 7。參數的分類是依照其值是否應該在您格式化儲存裝置時設定,或者當您掛載格式化裝置時設定。
當效能降低是由檔案分散或資源爭用而造成,效能通常能夠透過重新設定檔案系統而有所改善。然而在某些情況下,應用程式可能需要更改。在此情況下,Red Hat 建議您與客戶支援部聯繫,請求協助。

5.3.7.1. 微調 XFS

本章節涵蓋一些在 XFS 檔案系統格式化,和掛載時能夠使用的微調參數。
XFS 的預設格式化以及掛載設定,適用於大部分的工作載量。Red Hat 建議您僅在特定設定更改有益於您的工作載量時才做出更動。
5.3.7.1.1. 格式化選項
更多有關以上格式化選項的詳細資訊,請參閱 man page:
$ man mkfs.xfs
目錄區塊大小
目錄區塊大小會影響每 I/O 作業能夠擷取或更改的目錄資訊量。目錄區塊大小的最小值為檔案系統區塊大小(在預設情況下為 4 KB)。目錄區塊大小的最大值為「64」 KB。
在既定目錄區塊大小之下,一個較大的目錄比較小的目錄需要更多的 I/O。相較於有較小的目錄區塊大小的系統,有較大的目錄區塊大小的系統也會消耗更多每 I/O 作業的處理能源。因此,我們建議您盡可能地為您的工作載量使用較小的目錄和目錄區塊大小。
當檔案系統的寫入密集與讀取密集工作載量不超過以下列出的輸入項目數量,Red Hat 建議以下的目錄攔截大小:〈表格 5.1, “目錄區塊大小的建議最大目錄輸入項目”〉。
如需關於在不同大小的文件系統內目錄區塊大小對讀取和寫入工作負載的影響的詳細信息,請參考 XFS 文件。
請使用 mkfs.xfs -l 選項來配置目錄區塊大小。如需詳細信息,請參考 mkfs.xfs 主頁。
分配組
一個分配組是一個獨立結構,為文件系統的一區塊的自由空間編索引和分配內節點。每個分配組可以被獨立修改,從而允許 XFS 運行分配和接觸配置的操作,只要,與此同時,同時發生的操作影響不同的分配組。因此,在文件系統中能被運行的同時發生的操作數量等於分配組的數量。然而,既然運行同時發生的操作的能力受限於能運行這些操作的處理程序的數量,Red Hat 推薦分配組的數量大於或等於系統內處理程序的數量。
一個單一目錄不能同時被多個分配組修改。因此 Red Hat 建議創建和移除大量文件的應用程序不要將所有文件儲存至一個目錄中。
請使用 mkfs.xfs -d 選項配置分配組。如需詳細信息,請參考 mkfs.xfs man page。
擴展限制
在設置格式後,您可以擴大您文件系統的大小 (可以透過增加硬件,或通過自動精簡配置), 您必須仔細地考慮初始文件佈局,因為在格式設定之後,分配組的大小將不能更改。
分配組的大小必須按照文件系統最終容量設置。在一個完全擴展開來的文件系統中,分配組的數量不應超過數萬,除非分配組是在最大值(1 TB)。因此,對於大多數文件系統,對於一個文件系統,推薦的允許最大擴展量為初始大小的 10 倍。
擴展以 RAID 陳列的文件系統,需要格外小心,因為裝置大小必須和多個分配組的大小一致,這樣新的分配組標頭才能正確地與新加的儲存一致。新儲存必需於現有的儲存的幾何一樣,因為在格式設置後,幾何是不能被更改的,因此,在同一區塊裝置上,不能優化不同幾何結構的儲存。
inode 大小和行內屬性
如果 inode 有足夠可用的空間,那麼 XFS 可以直接寫入屬性名稱和值到內節點。這些行內屬性能夠被擷取和修改至一個比個別屬性區域快的數量級,因為不需要其他的 I/O。
inode 大小的預設值為 256 bytes(位元組)。只有在此值的 100 bytes (位元組)內才能使用屬性儲存,這取決於存在 inode 內的數據程度指示器。在您設置能增加儲存屬性可使用的空間量的文件系統格式時,增加 inode 大小。
屬性名稱和屬性值都受限於最大值 254 bytes。如果名稱或值長度上超過了254 bytes,屬性將會被推回到單獨的屬性區塊,而不是儲存到內聯裡。
請使用 mkfs.xfs -i 選項配置內節點參數。如需詳細信息,請參考 mkfs.xfs 主頁。
RAID
如果軟件 RAID 在使用中,mkfs.xfs 會自動為配置底層硬件合適的磁條單元和寬度。但是,如果硬件 RAID 在使用中,條形單元和寬度可能需要手動配置,因為不是所有的硬件 RAID 設備都輸出此信息。請使用 mkfs.xfs -d 選項配置條形單元和寬度。如需詳細信息,請參考 mkfs.xfs 主頁。
日誌大小
擱置更改是彙總至記憶體中,直至同步處理事件被啟動,在此時間點擱置更改會被編寫至日誌。日誌大小決定一次可以處理的並行修改數量。日誌大小也決定可以被彙總至記憶體的最大更改量,以及日誌資料被編寫至硬碟的頻率。相較於一個較大的日誌,較小的日誌將使資料更頻繁地被編寫回硬碟。然而,一個較大的日誌使用較多的記憶體去紀錄擱置修改,因此有著有限的記憶體的系統將不會受益於較大的日誌。
當日誌調整至與基本等量硬碟區單位一致,日誌會有較佳的效能。亦即,日誌在等量硬碟區單位界線開始和結束。欲調整等量硬碟區單位,請使用「mkfs.xfs -d」選項。更多詳情,請參閱「 mkfs.xfs」man page 。
如想配置日誌大小,請使用以下 mkfs.xfs 選項,用日誌的大小替換 logsize
# mkfs.xfs -l size=logsize
欲知詳情,請參考 mkfs.xfs 主頁:
$ man mkfs.xfs
將條帶單元寫入日誌
寫在使用 RAID5 或 RAID6 佈局的儲存裝置的日誌可能運行的更好,如果儲存裝置起始並終結與條帶單元界( 與基本條帶單元對齊。mkfs.xfs 試圖設置自動設置適當的日誌條帶單元,但這取決於 RAID 裝置輸出此信息。
如果您的工作負載引起同步活動非常頻繁,設置大的條帶單元可能會損害性能,因為較小的寫入需要填補日誌條帶單元的大小,而這會增加等待時間。如果您的工作負載受日誌寫入延遲的約束,Red Hat 推薦設置條帶單元為 1 區塊,如此能盡可能引起未調準的日誌寫入。
支持的日誌條帶單元最大大小為日誌緩衝區的最大值。因此, 有可能底層存儲可能有較大條帶單元可被配置到日誌上。此情況下,mkfs.xfs 發出警告並設置日誌條帶單元為 32 KB。
使用以下選項中的一個來配置日誌條帶單元,N 是區塊數值,作為條帶單元來使用, size是以 KB 為單元的條帶單元大小。
mkfs.xfs -l sunit=Nb
mkfs.xfs -l su=size
欲知詳情,請參考 mkfs.xfs 主頁:
$ man mkfs.xfs
5.3.7.1.2. 掛載選項
inode 配置
對於大小大於 1 TB 的文件系統,極力推薦。inode64 參數配置 XFS 以分配整個文件系統內的 inode 和資料。這確保大部分 inode 不被分配到文件系統的開端,大部分數據不被分配到文件系統的末端,從而提高大文件系統的性能。
日誌緩衝區的大小和數量
日誌緩衝區越大,寫入日誌所有改變所用的 I/O 的操作越少。較大的日誌緩衝區可以改善系統性能,並且 I/O 密集的工作負載沒有不穩定的寫入緩存。
日誌緩衝區的大小是用 logbsize 掛載選項來配置的,並決定能被存入日誌緩衝區的最大資訊量;如果日誌條帶單元為被設定,緩衝區寫入可能比最大的短,因此,無需減少為同步大工作量而減少日誌緩衝區大小。日誌緩衝區預設大小為 32 KB,最大為 256 KB,其他支持的大小為 64 KB、128 KB,或在 32 KB 和 256 KB 之間日誌條形單元的二倍數。
日誌緩衝區的數量由 logbufs 掛載選項來設定。預設值為 8 個日誌緩衝區(最多),但是,最少要配置兩個日誌緩衝區。通常不需要減少日誌緩衝區的數量,除非是在無法承擔將內存分配到另外的日誌緩衝區的有內存限度的系統。減少日誌緩衝區的數量通常會減少日誌性能,特別是對於日誌 I/O 時延敏感的工作負載。
延遲紀錄更改
XFS 有選項可以在改變寫入內存前,合計內存改變。delaylog 參數允許經常定期地更改被寫入到日誌中的 metadata,而不用每次更改時修改。此選項增加系統當機時失去作業的潛在數量,也增加用於追蹤 metadata 的記憶體使用量。然而,透過範圍順序,此選項亦增加 matadata 修改速度與可擴展性,且在使用fsyncfdatasyncsync 來確保資料和 metadata 被寫入硬盤時,不會降低數據或 metadata 的完整性。

5.3.7.2. 微調 ext4

本節包含設定ext4 文件系統的格式和掛載時可參考的調節參數。
5.3.7.2.1. 格式化選項
inode 表初始化
在非常大的文件系統上,初始化文件系統中的所有 inode 會需要很長時間。在預設情況下,初始化過程會被推遲 (懶惰 inode 表 - lazy inode table - 被啟動)。然而,如果您的系統沒有 ext4 驅動程序,懶惰內節點表初始化將被預設為禁用。可以通過設置 lazy_itable_init1 來啟用。在此情況下,內核進程繼續在文件系統掛載後初始化文件系統。
本節僅描述了一些設置格式時可使用的一些選項。如需瞭解更多格式設置參數,請參考 mkfs.ext4 主頁:
$ man mkfs.ext4
5.3.7.2.2. 掛載選項
inode 初始化速度
如果懶惰內節點表初始化已啟用,您可以通過指定 init_itable 參數的值來控制初始化的速度。運行背景初始化的所用的時間量大約等於 1,由此參數值劃分。預設值為10
自動文件同步
一些應用程序在重命名、或刪減、重寫現存文件後不會正確進行fsync。ext4 預設情況下會自動在每個操作後同步文件。但是,這可能會耗費時間。
如果不需要此等級同步,您可以在掛載時指定 noauto_da_alloc 選項以停用此操作。如果 noauto_da_alloc 已設定,應用程序必須明確使用 fsync 以保證數據持久性。
日誌 I/O 優先級
在預設情況下,日誌 I/O 優先級為 3,比正規 I/O 的優先級稍高。您可以在掛載時用 journal_ioprio 參數來控制日誌 I/O 的優先級。journal_ioprio 的有效值範圍為 070 為 I/O 最高優先級。
本節僅描述在掛載時刻可使用的一些選項。如需更多掛載選項,請參考 mount man page:
$ man mount

5.3.7.3. 微調 btrfs

關於 Red Hat Enterprise Linux 7.0, btrfs 僅為技術預覽。如果將來完全支持 btrfs ,本節將在未來版本中更新。

5.3.7.4. 微調 GFS2

本節為 GFS2 文件系統的格式和掛載介紹一些可用的微調參數。
目錄間隔
GFS2 掛載點最高級目錄中所創建的目錄都會被自動以規定距離排列,以減少儲存殘片並增加這些目錄中的寫入速度。如想像最高級目錄一樣間隔另一目錄用 T 屬性標出目錄,如同所示,用你想間隔的目錄的目錄路徑替換 dirname
# chattr +T dirname
chattr 只是 e2fsprogs 程序包的一部分。
減少競逐
GFS2 使用能要求集群節點間溝通的全局鎖定機制。在多個節點間的文件和目錄衝突會降低性能。您可通過最小化多個節點間共享的文件系統空間將交叉緩存無效的風險降到最低。