web-dev-qa-db-ja.com

BFQスケジューラーを有効にして使用するには?

Linuxカーネルバージョン4.12をUbuntu 17.04にukuu(Ubuntu Kernel Update Utility https://doc.ubuntu-fr.org/ubuntu_kernel_upgrade_utility )を使用してインストールしました。

問題は、利用可能なI/Oスケジューラーを確認したところ、BFQもKyber I/Oスケジューラーも見つからないようです。

cat /sys/class/block/sda/queue/scheduler
> noop deadline [cfq]

では、このLinuxバージョンで新しいスケジューラの1つを使用するにはどうすればよいでしょうか。

18
Sidahmed

私はUbuntuにはいませんが、Fedoraでやったことが役立つかもしれません。

BFQはblk-mq(マルチキューブロックIOキューイングメカニズム))スケジューラであるため、起動時にblk-mqを有効にし、/ etc/default/grubファイルを編集してscsi_mod.use_blk_mq=1を追加する必要がありますあなたのGRUB_CMDLINE_LINUXに、これは例として私のgrubファイルです:

GRUB_TIMEOUT=3
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=false
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="quiet vt.global_cursor_default=0 scsi_mod.use_blk_mq=1"
GRUB_DISABLE_RECOVERY="true"

その後、grubを更新する必要があります。 FedoraではSudo grub2-mkconfig -o /path/to/grub.cfgを使用する必要があります。これは ブート方法によって異なります によって異なります。 Ubuntuでは、次のコマンドを実行するだけです。

Sudo update-grub

再起動し、これを取得した場合:

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

おそらくあなたのカーネルはモジュールとしてBFQでコンパイルされました、そしてこれはKyberにも当てはまる可能性があります。

Sudo modprobe bfq
Sudo cat /sys/block/sda/queue/scheduler
[mq-deadline] bfq none

bfqを含む/etc/modules-load.d/bfq.confファイルを追加することにより、ブート時に追加できます。

blk_mqを有効にすると、blk_mq以外のスケジューラを使用できなくなることに注意することが重要です。そのため、noop cfqとnon mqの期限が失われます

どうやらblk_mqスケジューリングシステムはgrubのエレベーターフラグをサポートしていないため、代わりにudevルールを使用できます。

存在しない場合は/etc/udev/rules.d/60-scheduler.rulesを作成し、追加します。

ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/scheduler}="bfq"

先に述べたように、 ここ 必要に応じて、属性ATTR{queue/rotational}を使用して、udevルールで回転(HDD)デバイスと非回転(SSD)デバイスを区別できます。 LinuxCon EuropeでBFQ開発者のPaolo Valenteが、BFQはnoopまたはdeadlineスケジューラーよりも低レイテンシの保証という点でより良い選択である可能性があると指摘しました。 SSDの場合も同様です。

Paoloの比較: https://www.youtube.com/watch?v=1cjZeaCXIyM&feature=youtu.be

それを保存し、再ロードしてudev rulesをトリガーします。

Sudo udevadm control --reload
Sudo udevadm trigger
24

素晴らしい拡張 RomuloPBenedettiの回答

UdevルールでPROGRAM=="/bin/grep -E -q '(^|[[:space:]])bfq($|[[:space:]])' '$sys$devpath/queue/scheduler'"を使用して、bfqスケジューラが実際に特定のデバイスで使用可能かどうかをテストできます。これにより、実際にDRIVERS=="sd|sr"が置き換えられ、scsi_mod.use_blk_mq=1を忘れた場合は起動しません

トリビア:

  • PROGRAM-プログラムを実行して、一致するかどうかを判断します。プログラムが正常に戻る場合、キーはtrueです。絶対パスが指定されていない場合、プログラムは/ lib/udevにあると予想されます。
  • $sys-sysfsマウントポイント(/sys)。
  • $devpath-デバイスのdevpath(/ devices/pci/...)。
1
Arano-kai