# IOスケジューラ ## 定義 IOスケジューラ(I/Oスケジューラ)は、LinuxのブロックデバイスレイヤでI/O要求のキューイングと発行順序を制御するカーネルコンポーネントである。最適な書き込み順序に並べ替えることで、特にI/Oレイテンシの高いデバイス(回転磁気ディスク)のパフォーマンスを上げ、公平性を平準化する。Linux 5.0未満で使われた旧来のスケジューラには、スケジューリングを行わないNoop、レイテンシのデッドラインを強制しスタベーションを解決するDeadline(読み出しFIFO・書き込みFIFO・ソート済みキューの3独立キューを使用)、CPUスケジューリングのようにI/Oタイムスライスをプロセスに割り当てるCFQ(Completely Fair Queueing)がある。旧来のスケジューラは要求をセットするキューがひとつしかなくひとつのロックで保護されているため、I/O頻度が高いときにボトルネックになる問題があった。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 9 ディスク]] §9.4.4.2.2) Linux 3.13で追加されたマルチキュードライバ(blk-mq)は、CPUごとの独立サブミッションキューとデバイスの複数ディスパッチキューを使うことでこの問題を解決した。マルチキュースケジューラには、キューイングしないNone、CFQに似るがプロセスに帯域幅も与えcgroupをサポートするBFQ(Budget Fair Queueing)、旧DeadlineのblkmqバージョンであるMq-deadline、目標読み書きレイテンシ(read_lat_nsec・write_lat_nsec)のみで動作しNetflixがデフォルト採用しているシンプルなKyberがある。Linux 5.0からはマルチキュースケジューラがデフォルトになり旧来のスケジューラは削除された。マルチキュー化は数百万IOPSの処理能力を持つフラッシュメモリベースデバイスをサポートするために必要だった。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 9 ディスク]] §9.4.4.2.2) ## 横断的知見 (このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。) ## 未解決の問い - KyberがNetflixのクラウド本番環境でデフォルト採用されているとされるが、目標レイテンシ(read_lat_nsec・write_lat_nsec)のデフォルト値やチューニング事例は本章に記載がない。他のNetflix関連ソースで裏付けが取れるか確認したい。 - BFQのcgroupサポートは、[[USE メソッド]]で扱われるcgroupベースのリソースコントロール(9.9.1.2節のblkioサブシステム)とどのように統合されるか、両者の関係の詳細は本章の範囲外。 - SSD/NVMeデバイスではハードウェア自体が複数キューを持つため(NVMeは最大6万4千コマンド/キュー)、OS側のI/Oスケジューラ(特にNone)の選択がパフォーマンスに与える実測上の影響はどの程度か。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 9 ディスク]] — I/Oスケジューラの原典解説(§9.4.4.2.2)。 - [[詳解 システム・パフォーマンス 第2版]] — 書籍本体。 - [[RAID]] — 同じくブロックI/O層のパフォーマンスに関わる概念。 - [[Brendan Gregg]] — 著者。 ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 9 ディスク]] §9.4.4.2.2