Linuxカーネル5.0ではCFQ, Deadlineと言ったシングルキュースケジューラが全て削除されてカーネルのデフォルトIOスケジューラ設定も無くなっていました
Linux 5.0での変更
5.0での全体の変更はここで見れます.
今回ビックリしたのは block/cfq-iosched.c と block/deadline-iosched.c の削除です.
CFQが主にSSDで性能が良くないことは知っていましたが, Deadlineが削除されるとは思っていませんでした.
まあパフォーマンスの最大化 - ArchWiki を信じるならCFQとDeadlineはマルチスレッドに対応していないので削除は時代の流れでしょう.
言及はコミット上ではここでされています.
すごい破壊的変更なのに,
Linux 5.0のリリースニュースにもチェンジログをまとめたサイトでも全然取り上げられて無くて,
make menuconfig
して初めて気がついてびっくりしました.
LKMLはメーリングリストは購読するのメールが溢れそうですし, あんな分量の英語を読めないので私は読んでません…
またそれに伴ってカーネルのデフォルトのIOスケジューラ設定も削除されました.
そしてカーネルのmenuconfig
でもこれまではEnable the block layer/IO Schedulers
と位置していたのが,
最上位に設定項目が入るようになりました.
マルチキュースケジューラは起動時に設定するしか使えないからですね.
またこれまで(いつまでかは調べてないです)はカーネルパラメータに
scsi_mod.use_blk_mq=1
を設定しないとマルチキュースケジューラは使えませんでしたが,
少なくともLinux 5.0では不要になりました.
マルチキュースケジューラを使うとシングルスケジューラを使えなくなる副作用がありますが,
どうせシングルスケジューラを削除するなら気にする必要はありませんからね.
どれが良いの?
SSDだけしか使わないならNone(Noopのマルチキュー版)で良いかもしれません.
ただ私のデスクトップマシンにはHDDも刺さっているのと, SSDでも遅いIOを一度中断したいことを考えると, 一応IOスケジューラは設定した方が良いと考えました.
それで, SSDとかにはMQ deadlineかKyber, HDD向けにはBFQが良いみたいですね.
SSD向けにMQ deadlineかKyberのどっちが良いかはよくわかりません. 枯れてそうなMQ deadlineを選びました.
起動時に設定する
またパフォーマンスの最大化 - ArchWiki
からの引用変更なんですが,
以下の設定ファイルを
/etc/udev/rules.d/60-ioschedulers.rules
に書きました.
# set scheduler for non-rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]|mmcblk[0-9]*|nvme*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# set scheduler for rotating disks
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
ArchWikiの記述に加えてnvmeを追加しました.
これで基本的にはMQ deadline, 回転メディアにはBFQが使われるようになります.
再起動したら
% cat /sys/block/{sd*,nvme*}/queue/scheduler
mq-deadline kyber [bfq] none
mq-deadline kyber [bfq] none
[mq-deadline] kyber bfq none
[mq-deadline] kyber bfq none
のように何が適用されてるか確認できるようになります.
しかしあのBFQがCFQを押し退けてHDD向けにはついに事実上の標準になったのは感慨深いですね.