I/O スケジューリングの制御とは、ストレージに対して送信される入出力操作をどのような順序にするのかを決めるものです。 openSUSE Leap では エレベータ
と呼ばれる様々な I/O アルゴリズムに対応しています。これにより、様々な使用環境に対応することができるようになっています。エレベータはシーク操作を減らすためのものであるほか、 I/O 要求に対する優先順位付けとしても使用されます。
最適な I/O エレベータを選択するにあたって、その根拠となるのは負荷だけではなく、ハードウエアの仕様も含みます。たとえば単一の ATA ディスクと SSD, RAID アレイやネットワークストレージシステムでは、それぞれ異なるチューニング戦略が必要となります。
openSUSE Leap では起動時に既定の I/O スケジューラを選択しますが、 I/O スケジューラはデバイス単位で即時に変更することができます。これにより、システムパーティションを含んでいるデバイスと、データベースを含んでいるデバイスで別々のアルゴリズムを設定したりすることができるようになっています。
既定の I/O スケジューラは、回転型のディスクであるかどうかによって異なります。回転型のディスクの場合は BFQ
I/O スケジューラが使用されます。それ以外の場合は、 MQ-DEADLINE
か NONE
のいずれかが使用されます。
動作中のシステム内で、特定のデバイスに対するエレベータを変更したい場合は、下記のコマンドを実行します:
>
sudo
echo スケジューラ > /sys/block/デバイス名/queue/scheduler
ここで、 スケジューラ には bfq
, none
, kyber
, mq-deadline
のいずれかを指定します。また デバイス名 には、ブロックデバイスのデバイス名 (例: sda
) を指定します。ただし、この手順で変更を行った場合、システムを再起動すると既定値に戻ってしまうことに注意してください。特定のデバイスに対して I/O スケジューラを恒久的に変更したい場合は、 /usr/lib/udev/rules.d/60-io-scheduler.rules
ファイルを /etc/udev/rules.d/60-io-scheduler.rules
ファイルにコピーしてから、コピー先のファイルを必要に応じて編集してください。
下記の表には、 openSUSE Leap で blk-mq I/O パスを使用する場合に、利用可能なエレベータの一覧を示しています。それぞれのエレベータにはさらに細かくチューニングを行うためのチューナブルパラメータが存在していますが、これらは下記のようなコマンドを実行することで、設定することができます:
echo 値 > /sys/block/デバイス名/queue/iosched/チューナブル名
ここで、 値 には チューナブル名 に対応する値を、 デバイス名 にはブロックデバイス名をそれぞれ指定します。
また、デバイス (例: sda
) に対して利用可能なエレベータを確認したい場合は、下記のようなコマンドを入力して実行します (なお、現在選択されているエレベータが [] で括られて出力されます):
>
cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none
MQ-DEADLINE
#Edit sourceMQ-DEADLINE
は遅延を重視した I/O スケジューラです。 MQ-DEADLINE
には下記のようなチューナブルパラメータが用意されています:
MQ-DEADLINE
でのチューナブルパラメータ #ファイル | 説明 |
---|---|
| 書き込み回数に対する読み込み回数の推奨値を制御します。たとえば 既定値は |
| ミリ秒単位で読み込み処理の期限 (現在時刻からの経過時間) を指定します。 既定値は |
| ミリ秒単位で書き込み処理の期限 (現在時刻からの経過時間) を指定します。 既定値は |
| フロントマージ要求の試行をする (1) かしない (0) かを指定します。 既定値は |
| 一括 (バッチ) 処理時の最大要求数を設定します (期限の判断がその単位で行われます) 。このパラメータは遅延とスループットのバランスを取るために使用されるもので、たとえば 既定値は |
NONE
#Edit sourceblk-mq 向けの I/O エレベータとして NONE
を選択した場合、 I/O スケジューラでは何も行わず、デバイスに対してそのまま I/O 要求が渡されるようになります。
NVM Express デバイスに対しては、 NONE
が既定値となっています。他の I/O エレベータオプションとは異なり、オーバーヘッドが存在しないため、これらのデバイスに対して最も高速に I/O リクエストを送信できるようになっています。
NONE
に対するチューナブルパラメータはありません。
BFQ
(Budget Fair Queueing) #Edit sourceBFQ
は公平性を重視したスケジューラです。大まかに説明すると、 "CFQ のスライス単位のサービス方式をベースにした、比例分配型のストレージ I/O スケジューリングアルゴリズム" であると言えるものです。ただし、 BFQ では CFQ のようなタイムスライスではなく、セクタ数をベースに割り当てを設定します (ソースコード: linux-4.12/block/bfq-iosched.c) 。
BFQ
では、スケジューリングの決定に対して影響を及ぼすことのできる、 I/O 優先順位を設定することができます (詳しくは 9.3.3項 「ionice
によるディスクアクセスの優先順位設定」 をお読みください) 。
BFQ
には下記のようなチューナブルパラメータが用意されています:
BFQ
でのチューナブルパラメータ #ファイル | 説明 |
---|---|
| 空のキューに対して次の要求が届くまでに待機する時間を、ミリ秒単位で指定します。 既定値は |
|
既定値は |
|
既定値は |
| 後方シーク処理に対する最大値 (キロバイト単位) を指定します。 既定値は |
| 後方シーク処理でのコスト値の算出に使用する値です。 既定値は |
| 非同期要求の期限切れを設定する際に使用する値 (ミリ秒単位) です。 既定値は |
| 同期要求の期限切れを設定する際に使用する値 (ミリ秒単位) です。 既定値は |
| タスク (キュー) が選択されてから処理されるまでの最大時間をミリ秒単位で指定します。 既定値は |
|
既定値は |
|
既定値は |
KYBER
#Edit sourceKYBER
は遅延時間の削減を重視した I/O スケジューラです。読み込みや同期書き込みに対して遅延の目標値を設定し、この目標値に適合するように I/O 要求の流量を調整します。
KYBER
でのチューナブルパラメータ #ファイル | 説明 |
---|---|
| 読み込み処理での遅延目標値をナノ秒単位で指定します。 既定値は |
| 書き込み処理での遅延目標値をナノ秒単位で指定します。 既定値は |
ext3, ext4 などのファイルシステムでは、 fsync やトランザクションのコミット時に、ディスクに対して書き込みバリアを送信します。書き込みバリアは書き込みの順序を保証するための仕組みで、これによって揮発性のあるディスクの書き込みキャッシュを安全に使用できるようにしています (ただし、これによって少しの性能劣化があります) 。お使いのディスクに何らかの方式によるバッテリーが搭載されている場合、バリアを無効化しても、安全に性能を改善することができます。
nobarrier
の廃止予定についてXFS における nobarrier
オプションは廃止される予定であり、 openSUSE Leap 15.2 もしくはそれ以降のバージョンでは正しいマウントオプションではなくなっていることにご注意ください。 XFS のファイルシステムをマウントする際、このオプションを指定してしまうと、マウントが失敗してしまいます。この問題を回避するには、スクリプトや fstab でマウントオプションを指定する際、 nobarrier
オプションを含むことがないようにしてください。
書き込みバリア送信の無効化は、 nobarrier
マウントオプションで行うことができます。
電源障害時にキャッシュからディスクへの書き込みが正しく保証されない環境でバリアを無効化すると、ファイルシステムの破壊やデータ損失が発生することがあります。