Red Hat Training

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

6.4. 配置

您需要作的第一個決策,是要使用哪一種 I/O 排程器。本節將對幾種主要排程器作簡介,看看何者最是用於您的負載。

6.4.1. 完全公平佇列(CFQ)

CFQ 會根據啟動 I/O 請求的程序,為 I/O 請求進行公平的排程。排程類型有三種:即時(RT)、盡其所能(BE)以及閒置。您可透過 ionice 指令來手動指定排程類型,或是透過 ioprio_set 系統呼叫來進行程式性的指定。就預設值,程序會被指定為「BE」排程類型。接著,「RT」與「BE」排程類型會更進一步被分成八個 I/O 優先順序,0 代表最高,7 則代表最低。排程類型為「RT」的程序,其排程性質一般會比「BE」或是閒置的程序要來得重要,因此所有排程為「RT」的 I/O 請求總是會在「BE」或是閒置的 I/O 請求之前進行。這代表擁有「即時」優先順序的 I/O 請求可能會使「BE」與閒置類型的 I/O 請求資源不足。「BE」排程為預設的排程類型,而「4」為此類型中的預設優先順序。閒置排程類型的程序,僅會在系統中沒有其它等待處理的 I/O 請求之後,才會被處理。因此請切記,只有在程序的 I/O 請求完全不會影響順向進度的情況下,才將該程序的 I/O 排程類型設為閒置。
CFQ 會藉由為各項執行 I/O 請求的程序指定時間配量,以達到公平佇列的效果。程序在被指定的時間配量之間,(預設值)能進行八項請求。排程器會根據紀錄資料,預先檢查應用程式是否在近期內會發出更多 I/O 請求。若預期程序將會發出更多 I/O 請求,則 CFQ 將會處於閒置狀態並等待該 I/O 請求(儘管有來自於其它程序的 I/O 請求正等待發出)。
CFQ 所執行的閒置動作,並不適合不會受到高度搜尋罰則(seek penalty)影響的硬體,例如高速的外部儲存裝置陣列或是固態硬碟。若需要在這類型的儲存裝置上使用 CFQ(比方說若您希望使用 cgroup 的等比例權重 I/O 排程器),您將需要微調部分設定,以改善 CFQ 的效能。請在位於 /sys/block/device/queue/iosched/ 中,相同名稱的檔案裡,設置下列參數:
slice_idle = 0
quantum = 64
group_idle = 1
group_idle 設為 1 的時候,I/O 依然會有停止的可能性(基於後端儲存裝置因閒置而不忙碌)。然而,這些停止情況在系統中的所有佇列上發生的頻率,會比閒置的情況要來得低。
CFQ 是個非工作守恒(non-work-conserving)的 I/O 排程器,這代表就算有等待處理的請求,它也可處於閒置狀態中(如以上所討論)。將非工作守恒的排程器組合使用,可能會在 I/O 路徑上造成嚴重的遲緩。此類型的組合,就像是在一個基於主機的硬體 RAID 控制器上使用 CFQ。RAID 控制器本身可能會實作自己的非工作守恒排程器,也因此會造成組合中出現兩個層級的延遲。非工作守恒的排程器在擁有較多資料,並能根據這些資料做決定時,效能會較佳。若要組合這類型的演算法,最下面的排程器僅會看見上方的排程器所傳下的請求。因此,較低的層級所看見的 I/O 模式,並不代表實際的工作量。

微調參數

back_seek_max
反向搜尋一般會影響效能,因為與正向搜尋相較之下,它們可能會因為要重新調整位置,而導致更嚴重的延遲。然而,若是工作量不大,CFQ 還是會執行它們。此微調選項能控制 I/O 排程器允許進行反向搜尋的最大距離(單位為 KB)。預設值為 16 KB。
back_seek_penalty
基於反向搜尋的低效率,各項反向搜尋皆有與其相聯的罰則。此罰則乃一項乘數;比方說,若有個磁頭位於 1024KB。假設佇列中有兩項請求,一個位於 1008KB 而另一個則為 1040KB。這兩項請求與目前的磁頭位置乃是等距離的。然而,在套用了反向搜尋罰則(預設值:2)之後,在磁碟後方位置上的請求,現在其距離便將會與先前的請求接近兩倍。因此,磁頭將會往前移。
fifo_expire_async
此微調選項能控制一項 async(緩衝寫入)請求能等待多久。在經過了這段有效時間(單位為 ms)之後,一項資源不足的 async 請求將會被移至分派清單中。預設值為 250 ms。
fifo_expire_sync
對於同步(讀取和 O_DIRECT 寫入)請求來說,這與 fifo_expire_async 微調選項相同。預設值為 125 ms。
group_idle
當設置後,CFQ 將會閒置在控制群組中,最後一個發出 I/O 請求的程序上。當使用等比例權重 I/O cgroup 時,這應設為 1,並將 slice_idle 設為 0(一般在高速的儲存裝置上會這麼做)。
group_isolation
若啟用了群組隔離(設為 1),它會藉以犧牲傳輸量來換取較強大的隔離機制。一般來講,若群組隔離被停用的話,公平機制則只會套用在循序的工作量上。啟用群組隔離,將能為循序和隨機的工作量同時提供公平機制。預設值為 0(停用)。欲取得更多資訊,請參閱 Documentation/cgroups/blkio-controller.txt
low_latency
當啟用了低度延遲時(設為了 1),CFQ 會嘗試提供 300 ms 的等待時間最大值。這將會注重公平機制多過於傳輸量。停用低度延遲(設為 0)將會忽略目標延遲,並讓系統中的各項程序取得完整的時間配量。預設值將會啟用低度延遲。
quantum
定量(quantum)可控制 CFQ 在一段時間內會傳送至儲存裝置的 I/O 請求數量,基本上就是限制裝置的佇列深度。就預設值,這將會設為 8。儲存裝置可能能夠支援極深的佇列深度,不過增加 quantum 將會負面影響延遲,尤其是當有大量的循序寫入工作時。
slice_async
此微調選項可控制撥給各項發出非同步(緩衝寫入)I/O 請求之程序的時間配量。就預設值,它會被設為 40 ms。
slice_idle
這指定 CFQ 在等待進一步需求時,應該閒置多久。RHEL 6.1 以前的預設值為 8 ms。RHEL 6.2 以後的預設值為 0。這個 0 改進了外部 RAID 儲存裝置的總處理能力,方法是移除所有佇列與服務樹等級的閒置時間。然而,設定為 0 會降低內部非 RAID 儲存裝置的效能,因為這會增加整體搜尋數目。對於非 RAID 儲存裝置,我們建議使用大於 0 的值來設定 slice_idle
slice_sync
此微調選項可決定撥給多少時間配量給發出同步(讀取或直接寫入)I/O 請求的程序。預設值為 100 ms。