6.4.3. Noop
Noop I/O スケジューラーは、シンプルな FIFO (first-in first-out) のスケジューリングアルゴリズムを実装します。要求のマージは 汎用ブロック層で発生しますが、これはシンプルな最後にヒットしたもののキャッシュです。システムが CPU にバインドされていてストレージが高速な場合、これが最良の I/O スケジューラーとなります。
ブロック層で利用可能なチューニング可能パラメーターは以下のとおりです。
/sys/block/sdX/queue のチューニング可能なパラメーター
- add_random
- いくつかのケースでは、
/dev/random
のエントロピープールに貢献している I/O イベントのオーバーヘッドは計測可能です。このような場合、この値を 0 に設定することが推奨されます。 max_sectors_kb
- デフォルトでは、ディスクに送信される要求の最大サイズは
512
KB です。このパラメーターは、この値を上げたり下げたりできます。最小値は論理ブロックサイズに制限されます。最大値はmax_hw_sectors_kb
で制限されます。I/O サイズが内部の消去ブロックサイズを超えるとパフォーマンスが悪化する SSD もあります。そのような場合には、max_hw_sectors_kb
を消去ブロックのサイズに下げることが推奨されます。これは、iozone や aio-stress などの I/O ジェネレーターでレコードサイズを512
バイトから1
MB に変えるなどしてテストすることができます。 nomerges
- このパラメーターは、基本的にデバッグの助けとなるものです。ほとんどのワークロードでは、要求のマージが役に立ちます (SSD などの高速ストレージでも)。しかし、マージを無効にすることがよい場合もあります。例えば、先読みを無効にしたりランダム I/O を実行することなく、ストレージバックエンドが処理できる IOPS の数を知りたい場合などです。
nr_requests
- 各要求キューには、読み取りもしくは書き込み I/O ごとに割り当て可能な要求記述子の合計数に制限があります。デフォルトではこれが
128
になっていて、プロセスをスリープにする前に 128 の読み取りと 128 の書き込みを一度にキュー待ちにすることができます。スリープ状態にされるプロセスは、要求の割り当てを試みる次のもので、必ずしも利用可能な要求のすべてを割り当てたプロセスではありません。待ち時間に影響を受けやすいアプリケーションがある場合は、要求キューのnr_requests
の値を引き下げ、ストレージ上のコマンドキューを (1
にまで) 低い数値に制限することが推奨されます。こうすると、ライトバック I/O は利用可能なすべての要求記述子を割り当てることができず、書き込み I/O でデバイスキューを満たすことができません。nr_requests
が割り当てられると、I/O の実行を試みている他のすべての プロセスがスリープになり、要求が利用可能になるまで待機します。これだと (1 つのプロセスが連続してすべてを消費するのではなく) 要求がラウンドロビン方式で分配されるので、公平性が維持されます。デッドラインもしくは Noop スケジューラーの使用時にのみ、これが問題となることに留意してください。これは、デフォルトの CFQ 設定がこの状況に対して保護するためです。 optimal_io_size
- 状況によっては、基礎的なストレージが最適な I/O サイズをレポートします。これは、最適な I/O サイズがストライプサイズであるハードウェアおよびソフトウェア RAID で最も一般的です。この値がレポートされると、アプリケーションは可能な限り、最適な I/O サイズに調整され、その倍数の I/O を発行します。
read_ahead_kb
- オペレーティングシステムは、アプリケーションがファイルやディスクから連続してデータを読み取っている際に、これを検出します。そのような場合、インテリジェントな先読みアルゴリズムを実行し、ユーザーが要求したデータよりも多くのデータをディスクから読み取ります。つまり、ユーザーが次のデータブロックを読み取ろうとする際には、そのデータはオペレーティングシステムのページキャッシュに既にあることになります。この動作の考えられるマイナス面は、オペレーティングシステムが必要以上のデータをディスクから読み取る可能性があるということです。この場合、メモリのプレッシャーが大きいという理由でデータが削除されるまで、このデータはページキャッシュのスペースをふさぐことになります。この状況では、複数のプロセスが間違って先読みを行うと、メモリのプレッシャーを高めることになります。デバイスマッパーのデバイスでは、
read_ahead_kb
の値を8192
などの大きいものにすることが推奨されます。これは、デバイスマッパーのデバイスが複数の基礎的デバイスで構成されていることが多いためです。チューニングの手始めとしては、デフォルト値 (128
KB) をマッピングするデバイス数で掛けたものにするとよいでしょう。 rotational
- 従来のハードディスクは回転式 (回転する円盤で構成) でしたが、SSD は違います。ほとんどの SSD は、これを適切にアドバタイズしますが、このフラグを適切にアドバタイズしないデバイスの場合は、rotational を手動で
0
に設定する必要がある場合があります。rotational が無効の場合は、非回転式メディアでのシーク操作にほとんどペナルティーがないことから、I/O エレベーターはシークを減らすための論理を使用しません。 rq_affinity
- I/O の完了は、その I/O を発行した CPU とは別の CPUで処理できます。
rq_affinity
を1
に設定すると、I/O が発行された CPU にカーネルが完了を配信します。これにより、CPU データのキャッシング効果が高まります。