Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

13 I/O 性能のチューニング Edit source

I/O スケジューリングの制御とは、ストレージに対して送信される入出力操作をどのような順序にするのかを決めるものです。 openSUSE Leap では エレベータ と呼ばれる様々な I/O アルゴリズムに対応しています。これにより、様々な使用環境に対応することができるようになっています。エレベータはシーク操作を減らすためのものであるほか、 I/O 要求に対する優先順位付けとしても使用されます。

最適な I/O エレベータを選択するにあたって、その根拠となるのは負荷だけではなく、ハードウエアの仕様も含みます。たとえば単一の ATA ディスクと SSD, RAID アレイやネットワークストレージシステムでは、それぞれ異なるチューニング戦略が必要となります。

13.1 I/O スケジューリングの切り替え Edit source

openSUSE Leap では起動時に既定の I/O スケジューラを選択しますが、 I/O スケジューラはデバイス単位で即時に変更することができます。これにより、システムパーティションを含んでいるデバイスと、データベースを含んでいるデバイスで別々のアルゴリズムを設定したりすることができるようになっています。

既定の I/O スケジューラは、回転型のディスクであるかどうかによって異なります。回転型のディスクの場合は BFQ I/O スケジューラが使用されます。それ以外の場合は、 MQ-DEADLINENONE のいずれかが使用されます。

動作中のシステム内で、特定のデバイスに対するエレベータを変更したい場合は、下記のコマンドを実行します:

> 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 ファイルにコピーしてから、コピー先のファイルを必要に応じて編集してください。

13.2 blk-mq I/O パスで利用可能な I/O エレベータ Edit source

下記の表には、 openSUSE Leap で blk-mq I/O パスを使用する場合に、利用可能なエレベータの一覧を示しています。それぞれのエレベータにはさらに細かくチューニングを行うためのチューナブルパラメータが存在していますが、これらは下記のようなコマンドを実行することで、設定することができます:

echo  > /sys/block/デバイス名/queue/iosched/チューナブル名

ここで、 には チューナブル名 に対応する値を、 デバイス名 にはブロックデバイス名をそれぞれ指定します。

また、デバイス (例: sda) に対して利用可能なエレベータを確認したい場合は、下記のようなコマンドを入力して実行します (なお、現在選択されているエレベータが [] で括られて出力されます):

> cat /sys/block/sda/queue/scheduler
[mq-deadline] kyber bfq none

13.2.1 MQ-DEADLINE Edit source

MQ-DEADLINE は遅延を重視した I/O スケジューラです。 MQ-DEADLINE には下記のようなチューナブルパラメータが用意されています:

表 13.1: MQ-DEADLINE でのチューナブルパラメータ

ファイル

説明

writes_starved

書き込み回数に対する読み込み回数の推奨値を制御します。たとえば 3 という値であれば、同じ選択範囲のディスクに対して、書き込み 1 回に対して読み込みを 3 回までまとめて実施できるようになります。

既定値は 3 です。\t

read_expire

ミリ秒単位で読み込み処理の期限 (現在時刻からの経過時間) を指定します。

既定値は 500 です。\t

write_expire

ミリ秒単位で書き込み処理の期限 (現在時刻からの経過時間) を指定します。

既定値は 5000 です。\t

front_merges

フロントマージ要求の試行をする (1) かしない (0) かを指定します。

既定値は 1 です。

fifo_batch

一括 (バッチ) 処理時の最大要求数を設定します (期限の判断がその単位で行われます) 。このパラメータは遅延とスループットのバランスを取るために使用されるもので、たとえば 1 に設定する (一括処理で 1 つずつ処理する) と、 "最初に到着したものを最初に処理する" 動作になり、最も遅延を少なくすることができます。逆により大きな数値にすると、一般にスループットを改善することができます。

既定値は 16 です。\t

13.2.2 NONE Edit source

blk-mq 向けの I/O エレベータとして NONE を選択した場合、 I/O スケジューラでは何も行わず、デバイスに対してそのまま I/O 要求が渡されるようになります。

NVM Express デバイスに対しては、 NONE が既定値となっています。他の I/O エレベータオプションとは異なり、オーバーヘッドが存在しないため、これらのデバイスに対して最も高速に I/O リクエストを送信できるようになっています。

NONE に対するチューナブルパラメータはありません。

13.2.3 BFQ (Budget Fair Queueing) Edit source

BFQ は公平性を重視したスケジューラです。大まかに説明すると、 "CFQ のスライス単位のサービス方式をベースにした、比例分配型のストレージ I/O スケジューリングアルゴリズム" であると言えるものです。ただし、 BFQ では CFQ のようなタイムスライスではなく、セクタ数をベースに割り当てを設定します (ソースコード: linux-4.12/block/bfq-iosched.c) 。

BFQ では、スケジューリングの決定に対して影響を及ぼすことのできる、 I/O 優先順位を設定することができます (詳しくは 9.3.3項 「ionice によるディスクアクセスの優先順位設定」 をお読みください) 。

BFQ には下記のようなチューナブルパラメータが用意されています:

表 13.2: BFQ でのチューナブルパラメータ

ファイル

説明

slice_idle

空のキューに対して次の要求が届くまでに待機する時間を、ミリ秒単位で指定します。

既定値は 8 です。

slice_idle_us

slice_idle と同じ意味ですが、こちらはマイクロ秒単位で指定します。

既定値は 8000 です。

low_latency

BFQ を低遅延モードで動作させる (1) か動作させない (0) かを設定します。低遅延モードで動作させると、特定のアプリケーション (たとえば対話的なアプリケーション) を低遅延で動作させることができるようになります。

既定値は 1 です。

back_seek_max

後方シーク処理に対する最大値 (キロバイト単位) を指定します。

既定値は 16384 です。

back_seek_penalty

後方シーク処理でのコスト値の算出に使用する値です。

既定値は 2 です。

fifo_expire_async

非同期要求の期限切れを設定する際に使用する値 (ミリ秒単位) です。

既定値は 250 です。

fifo_expire_sync

同期要求の期限切れを設定する際に使用する値 (ミリ秒単位) です。

既定値は 125 です。

timeout_sync

タスク (キュー) が選択されてから処理されるまでの最大時間をミリ秒単位で指定します。

既定値は 124 です。

max_budget

timeout_sync 内で処理する最大セクタ数を制限するための設定です。この値を 0 に設定すると、 BFQtimeout_sync の値と予測されるピークレートを元に内部計算を行うようになります。

既定値は 0 (自動チューニング) です。

strict_guarantees

BFQ において、特定の条件下で帯域の共有をより厳密に行うための処理を行う (1) か行わない (0) かを設定します。

既定値は 0 です。

13.2.4 KYBER Edit source

KYBER は遅延時間の削減を重視した I/O スケジューラです。読み込みや同期書き込みに対して遅延の目標値を設定し、この目標値に適合するように I/O 要求の流量を調整します。

表 13.3: KYBER でのチューナブルパラメータ

ファイル

説明

read_lat_nsec

読み込み処理での遅延目標値をナノ秒単位で指定します。

既定値は 2000000 です。

write_lat_nsec

書き込み処理での遅延目標値をナノ秒単位で指定します。

既定値は 10000000 です。

13.3 I/O バリアのチューニング Edit source

ext3, ext4 などのファイルシステムでは、 fsync やトランザクションのコミット時に、ディスクに対して書き込みバリアを送信します。書き込みバリアは書き込みの順序を保証するための仕組みで、これによって揮発性のあるディスクの書き込みキャッシュを安全に使用できるようにしています (ただし、これによって少しの性能劣化があります) 。お使いのディスクに何らかの方式によるバッテリーが搭載されている場合、バリアを無効化しても、安全に性能を改善することができます。

重要
重要: XFS での nobarrier の廃止予定について

XFS における nobarrier オプションは廃止される予定であり、 openSUSE Leap 15.2 もしくはそれ以降のバージョンでは正しいマウントオプションではなくなっていることにご注意ください。 XFS のファイルシステムをマウントする際、このオプションを指定してしまうと、マウントが失敗してしまいます。この問題を回避するには、スクリプトや fstab でマウントオプションを指定する際、 nobarrier オプションを含むことがないようにしてください。

書き込みバリア送信の無効化は、 nobarrier マウントオプションで行うことができます。

警告
警告: バリアの無効化によるデータ損失の危険性について

電源障害時にキャッシュからディスクへの書き込みが正しく保証されない環境でバリアを無効化すると、ファイルシステムの破壊やデータ損失が発生することがあります。

このページを印刷