読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【カーネル】読み書き(I/O)のスケジューラ

Linux

なんか書いていたひとがいたのでつい

qiita.com

Linux カーネルの、補助記憶装置への読み書き(Input/Output)の順序を制御するスケジューラには、現在は3種類あります。

  • CFQ
  • Deadline
  • NoOp

「I/Oスケジューラ」とは、読み書きの順序を組み替える(スケジューリング)機能ということです。

cfq

長年に亘って、多くのシステムでは一般的に、補助記憶装置にはハードディスクを採用していました。

ハードディスクは読み書きに、ヘッドの移動を要します。 そのヘッド移動には時間がかかります。

ヘッド移動を最小限に食い止めるために、読み書きの順序を適度に組み替えれば、読み書きの実時間は短くなります。

その際に、読み書きをする各データの重要度を考慮しない(平等;Fair)で、読み書き位置が効率よくなる範囲で順序を組み替えるのが、CFQ です。

deadline

スケジューリングはしますが、要求が来てから処理完了までのデッドラインを設け、それまでに完了するように努めます。 デッドラインが近づいたら、その読み書きを優先的に完了させるということです。

デッドラインは、負荷の大きなサーバや、処理が後れるとトラブルが発生するようなシステムに向いています。

デッドラインスケジューラが設けられたのは、読み書きが多くて暇のないシステムにCFQでは、読み書き位置の孤立したデータの処理がずっと後回しにされてしまうことが起こりうるからです。 デッドラインスケジューラは、いくら後回しにされるといっても限度ってものがあるでしょう、ということです。

noop

ノー・オペレーションです。何もスケジューリングせずに、要求が来た順に矢継ぎ早に処理します。

ヘッド移動のない SSD には CFQ の意味がないので、デッドラインかnoopのほうが速いと思われます。 最近のカーネルならば、 SSD には noop を設定することを奨めます。

こうしたチューニングが可能なのも、フリーソフトウェアの良さです。

anticipatory

anticipatory は現在はありません

anticipatory は、データの読み書き要求を予測して効率化を測ります。

記録位置の連続するデータの読み書き要求が来ないか予測するわけですので、それぞれの要求の重み付けがあるという点で CFQ と異なります。 例えば、物凄く遠いヘッド移動なんてしたくないので、後回しにします。

しかし、要求が来ると予測したものが待てど暮らせど来なければかえって遅くなります。

このようなスケジューラがあったのは、往時のハードディスクがそれほどまでに遅かったからです。回転数も記録密度も低かったので、遅かったんです。 これは前時代的なスケジューラなわけで、(バージョン2.6.33で)削除されました。

CFQ が無難

CFQ がデフォルトです。

今でもハードディスクが一般的には使用されています。

ハードディスクに noop はトラブルの元です。 低負荷の一般的な用途では、 デッドラインより CFQ が速いです。

SSD は CFQ でも使えます。

よく解らなければ CFQ にしときましょう。

まあ、リアルで考えれば、列に割り込まれるって方がおかしいわけですが(笑)、人間社会の話ではないので最終的な効率優先ってことです。 人間社会で、人権より社会全体の公共の福祉優先とか言う国には怒りますが(笑)。