I/O 排程器(I/O scheduler)
當許多程式同時想要磁碟 I/O,區塊層握著一個待處理請求的佇列,而某人必須決定把它們送往裝置的順序。在旋轉磁碟上那個順序極為要緊,因為把磁頭橫越碟片移動才是慢的部分——以聰明的順序而非到達順序服務請求,能大幅削減尋道時間。挑選那個順序、決定哪個請求下一個走的元件,就是 I/O 排程器。
經典的洞見是電梯類比:一部升降梯不會照按鈕被按下的順序鋸齒狀地跑到每一層;它向上掃、沿途服務請求,再向下掃,把行程最小化。舊的磁碟排程器(電梯/CFQ 家族)按磁區排序請求以最小化磁頭尋道。現代 Linux 的多佇列排程器服務不同的目標:mq-deadline 讓請求保持排序、但為每個附上一個截止期限,使任何請求都不會在磁頭追逐一個繁忙區域時餓死,於吞吐與延遲之間取得平衡;BFQ(預算公平佇列)給每個行程一份公平的磁碟頻寬、並保護互動回應性,使一個龐大的背景複製無法凍結你的桌面;而 none 排程器基本上什麼都不做——只是 FIFO——這對極快的 NVMe SSD 往往最佳,因為在那裡重新排序毫無所得、排程器自己的工作只會徒增延遲。
為何重要:在旋轉媒體上,對的排程是「近乎串流的吞吐」與「磁頭來回顛簸」之別。對現代硬體的誠實更新:SSD 與 NVMe 沒有尋道懲罰——任何區塊都一樣快——所以那套幫助旋轉磁碟的精巧尋道最小化邏輯,反而可能有害,徒增 CPU 負擔與延遲卻無益處。這正是為何快速快閃裝置常跑 none(或極輕量)的排程器,以及為何最好的排程器確實取決於你的裝置到底有沒有一個會動的磁頭。
$ cat /sys/block/nvme0n1/queue/scheduler [none] mq-deadline bfq # none 對快速 NVMe 最佳(沒有尋道可最佳化) $ cat /sys/block/sda/queue/scheduler none [mq-deadline] bfq # 旋轉磁碟受益於排序+截止期限
方括號中的項目是作用中的排程器;none 適合無尋道的快閃,mq-deadline/BFQ 適合會動磁頭的磁碟。
尋道最小化的排程在旋轉磁碟上是勝利、在 SSD/NVMe 上是淨虧損,因為那裡每個區塊一樣可達、重新排序的工作只徒增 CPU 與延遲。沒有放諸四海皆準的最佳排程器——對的選擇取決於裝置在實體上會不會尋道。