第14章 ディスクスケジューラーの設定

ディスクスケジューラーは、ストレージデバイスに送信された I/O 要求を順序付けます。

スケジューラーは以下の複数の方法で設定できます。

14.1. RHEL 8 におけるディスクスケジューラーの変更

RHEL 8 では、ブロックデバイスはマルチキュースケジューリングのみに対応しています。これにより、高速ソリッドステートドライブ (SSD) およびマルチコアシステムのブロックレイヤーのパフォーマンスが向上します。

RHEL 7 以前のバージョンで利用できた従来のシングルキュースケジューラーが削除されました。

14.2. 利用可能なディスクスケジューラー

RHEL 8 では、以下のマルチキューディスクスケジューラーに対応しています。

none
FIFO (First-in First-out) スケジューリングアルゴリズムを実装します。これにより、汎用のブロック層で単純な last-hit キャッシュを介して要求がマージされます。
mq-deadline

これにより、要求がスケジューラーに到達した時点からの要求のレイテンシーが保証されます。

mq-deadline スケジューラーは、キュー待ちの I/O リクエストを読み取りバッチまたは書き込みバッチに分類します。そして、論理ブロックアドレス (LBA) を増大順に実行するためのスケジュール設定を行います。デフォルトでは、アプリケーションは読み取り I/O 操作でブロックする可能性の方が高いため、読み取りバッチの方が書き込みバッチより優先されます。mq-deadline がバッチを処理すると、このプロセスは書き込み動作が待機している長さを確認して、次の読み取りバッチまたは書き込みバッチをスケジュールします。

このスケジューラーはほとんどのユースケースに適していますが、必要に応じて特に書き込み動作より読み取り動作の方が頻繁に起こるユースケースに適しています。

bfq

デスクトップシステムおよび対話式のタスクを対象とします。

bfq スケジューラーは、単一のアプリケーションがすべての帯域幅を使用しないようにします。これにより、ストレージデバイスがアイドル状態であるかのように常に応答できるようになります。デフォルトの設定では、bfq は、最大スループットを実現するのではなく、レイテンシーを最小限に抑えることに焦点を合わせています。

bfqcfq コードに基づいています。固定タイムスライスについて、ディスクは各プロセスに付与されることはありませんが、セクター数を測定する budget をプロセスに割り当てます。

このスケジューラーは、大きなファイルをコピーしても、システムが応答しなくなります。

kyber

スケジューラーは、ブロック I/O レイヤーに送信されたすべての I/O 要求のレイテンシーを計算することで、レイテンシーゴールを達成するために自身を調整します。cache-misses の場合、および同期書き込みリクエストの場合は、読み取りのターゲットレイテンシーを設定できます。

このスケジューラーは、NVMe、SSD などの低レイテンシーデバイスなど、高速なデバイスに適しています。

14.3. 各種ユースケースで異なるディスクスケジューラー

システムが実行するタスクに応じて、分析タスクおよびチューニングタスクの前に、以下のディスクスケジューラーがベースラインとして推奨されます。

表14.1 各種ユースケースのディスクスケジューラー

ユースケースディスクスケジューラー

SCSI インターフェースを備えた従来の HDD

mq-deadline または bfq を使用します。

高速ストレージで高パフォーマンスの SSD または CPU がバインドされたシステム

特にエンタープライズアプリケーションを実行する場合は none を使用します。または kyber を使用します。

デスクトップまたはインタラクティブなタスク

bfq を使用します。

仮想ゲスト

mq-deadline を使用します。マルチキューに対応しているホストバスアダプター (HBA) ドライバーでは、none を使用します。

14.4. デフォルトのディスクスケジューラー

ブロックデバイスは、別のスケジューラーを指定しない限り、デフォルトのディスクスケジューラーを使用します。

注記

NVMe (Non-volatile Memory Express) ブロックデバイスの場合、デフォルトのスケジューラーは none であり、Red Hat ではこれを変更しないことを推奨します。

カーネルは、デバイスのタイプに基づいてデフォルトのディスクスケジューラーを選択します。自動的に選択されたスケジューラーは、通常、最適な設定です。別のスケジューラーが必要な場合、Red Hat は、udev ルールまたは Tuned アプリケーションを使用して設定することを推奨されます。選択したデバイスを一致させ、そのデバイスのスケジューラーのみを切り替えます。

14.5. アクティブなディスクスケジューラーの決定

この手順では、特定のブロックデバイスで現在アクティブなディスクスケジューラーを確認します。

手順

  • /sys/block/device/queue/scheduler ファイルの内容を読み取ります。

    # cat /sys/block/device/queue/scheduler
    
    [mq-deadline] kyber bfq none

    ファイル名の device を、sdc などのブロックデバイス名に置き換えます。

    アクティブなスケジューラーは、角括弧 ([ ]) に一覧表示されます。

14.6. Tuned でディスクスケジューラーの設定

この手順では、選択したブロックデバイスに対して特定のディスクスケジューラーを設定する Tuned プロファイルを作成し、有効にします。この設定は、システムを再起動しても持続します。

以下のコマンドと設定で、次の内容を置き換えます。

  • device を、ブロックデバイスの名前 (例: sdf) に置き換えます。
  • selected-scheduler を、デバイスに設定するディスクスケジューラー (例: bfq) に置き換えます。

手順

  1. 必要に応じて、プロファイルのベースとなる既存の Tuned プロファイルを選択します。利用可能なプロファイルの一覧は、「Tuned の使用」を参照してください。

    現在アクティブなプロファイルを確認するには、次のコマンドを実行します。

    $ tuned-adm active
  2. Tuned プロファイルを保存するディレクトリーを新たに作成します。

    # mkdir /etc/tuned/my-profile
  3. 選択したブロックデバイスのシステム固有の識別子を見つけます。

    $ udevadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
    
    ID_WWN=0x5002538d00000000
    ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    ID_SERIAL_SHORT=20120501030900000
    注記

    この例のコマンドは、指定したブロックデバイスに関連付けられた World Wide Name (WWN) またはシリアル番号として識別されるすべての値を返します。WWN を使用することが推奨されますが、WWNN は常に特定のデバイスで利用できる訳ではなく、コマンド例で返される値は、デバイスのシステム固有の ID として使用することが許容されます。

  4. /etc/tuned/my-profile/tuned.conf 設定ファイルを作成します。このファイルで、以下のオプションを設定します。

    • 必要に応じて、既存のプロファイルを追加します。

      [main]
      include=existing-profile
    • WWN 識別子に一致するデバイスに対して選択したディスクスケジューラーを設定します。

      [disk]
      devices_udev_regex=IDNAME=device system unique id
      elevator=selected-scheduler
      • IDNAME を、使用されている識別子名 (例: ID_WWN) に置き換えます。
      • device system unique id を、選択した識別子の値 (例: 0x5002538d00000000) に置き換えます。

      devices_udev_regex オプションで複数のデバイスと一致させるには、識別子を括弧で囲み、垂直バーで区切ります。

    devices_udev_regex=(ID_WWN=0x5002538d00000000)|(ID_WWN=0x1234567800000000)
  5. プロファイルを有効にします。

    # tuned-adm profile my-profile
  6. Tuned プロファイルがアクティブで適用されていることを確認します。

    $ tuned-adm active
    
    Current active profile: my-profile
    $ tuned-adm verify
    
    Verification succeeded, current system settings match the preset profile.
    See tuned log file ('/var/log/tuned/tuned.log') for details.

14.7. udev ルールでディスクスケジューラーの設定

この手順では、udev ルールを使用して、特定ブロックデバイスに、特定のディスクスケジューラーを設定します。この設定は、システムを再起動しても持続します。

以下のコマンドと設定で、次の内容を置き換えます。

  • device を、ブロックデバイスの名前 (例: sdf) に置き換えます。
  • selected-scheduler を、デバイスに設定するディスクスケジューラー (例: bfq) に置き換えます。

手順

  1. ブロックデバイスのシステム固有の識別子を見つけます。

    $ udevadm info --name=/dev/device | grep -E '(WWN|SERIAL)'
    E: ID_WWN=0x5002538d00000000
    E: ID_SERIAL=Generic-_SD_MMC_20120501030900000-0:0
    E: ID_SERIAL_SHORT=20120501030900000
    注記

    この例のコマンドは、指定したブロックデバイスに関連付けられた World Wide Name (WWN) またはシリアル番号として識別されるすべての値を返します。WWN を使用することが推奨されますが、WWNN は常に特定のデバイスで利用できる訳ではなく、コマンド例で返される値は、デバイスのシステム固有の ID として使用することが許容されます。

  2. udev ルールを設定します。以下の内容で /etc/udev/rules.d/99-scheduler.rules ファイルを作成します。

    ACTION=="add|change", SUBSYSTEM=="block", ENV{IDNAME}=="device system unique id", ATTR{queue/scheduler}="selected-scheduler"
    • IDNAME を、使用されている識別子名 (例: ID_WWN) に置き換えます。
    • device system unique id を、選択した識別子の値 (例: 0x5002538d00000000) に置き換えます。
  3. udev ルールを再読み込みします。

    # udevadm control --reload-rules
  4. スケジューラー設定を適用します。

    # udevadm trigger --type=devices --action=change
  5. アクティブなスケジューラーを確認します。

    # cat /sys/block/device/queue/scheduler

14.8. 特定ディスクに任意のスケジューラーを一時的に設定

この手順では、特定のブロックデバイスに、特定のディスクスケジューラーを設定します。この設定は、システムを再起動すると元に戻ります。

手順

  • 選択したスケジューラーの名前を、/sys/block/device/queue/scheduler ファイルに書き込みます。

    # echo selected-scheduler > /sys/block/device/queue/scheduler

    ファイル名の device を、sdc などのブロックデバイス名に置き換えます。

検証手順

  • スケジューラーがデバイスでアクティブになっていることを確認します。

    # cat /sys/block/device/queue/scheduler

このページには機械翻訳が使用されている場合があります (詳細はこちら)。