CLOVER🍀

That was when it all began.

Ubuntu Linux 20.04 LTSについての、IOスケジューラーに関する情報を見てみる

これは、なにをしたくて書いたもの?

LinuxのIOスケジューラーについて、ちょっと調べてみたいなと思いまして。

手元の環境が、こんな感じのUbuntu Linux 20.04 LTSなので、カーネル5.4のドキュメントとUbuntu Linuxのドキュメントを
中心に見ていこうと思います。

$ uname -srvmpio
Linux 5.4.0-52-generic #57-Ubuntu SMP Thu Oct 15 10:57:00 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.1 LTS
Release:    20.04
Codename:   focal

カーネルのドキュメントから見るIOスケジューラー

カーネルのドキュメントで、IOスケジューラーに関する情報がまとまっているのは、こちらのページですね。

Block — The Linux Kernel documentation

章が"Block"なので、IOスケジューラー以外のことも書いているのですが。

IOスケジューラーには、マルチキューIOスケジューラーと、そうでないIOスケジューラーがあるようです。今回は、Ubuntu Linux
ドキュメントで紹介されているスケジューラーを見ていこうと思います。

Kernel/Reference/IOSchedulers - Ubuntu Wiki

Red Hat Enterprise Linuxのドキュメントも参考にしつつ。

第14章 ディスクスケジューラーの設定 Red Hat Enterprise Linux 8 | Red Hat Customer Portal

マルチキューIOスケジューラー

マルチキューIOスケジューラーは、マルチキューデバイス用に設計されたスケジューラーです。SSDなどで効果を発揮する、と。

参考)

Kernel/Reference/IOSchedulers - Ubuntu Wiki

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

非マルチキューIOスケジューラー

なお、非マルチキューIOスケジューラーは、カーネル 5.3でサポートされなくなったようです。

5.0の時点でこんな記述もありますし。

Remove all the non-mq code. Remaining drivers have been converted

Block layer

参考)

Kernel/Reference/IOSchedulers - Ubuntu Wiki

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

Red Hat Enterprise Linux 8も、マルチキュースケジューラーのみに対応しているようですね。

Ubuntu Linuxから見るIOスケジューラー

Kernel/Reference/IOSchedulers - Ubuntu Wiki

Prior to Ubuntu 19.04 with Linux 5.0 or Ubuntu 18.04.3 with Linux 4.15, the multiqueue I/O scheduling was not enabled by default and just the deadline, cfq and noop I/O schedulers were available by default.

Ubuntu Linux 19.04やUbuntu Linux 18.04 LTSより前では、マルチキューIOスケジューラーはデフォルトでは有効になっていません。
deadline、cfq、noopが利用可能です。

For Ubuntu 19.10 with Linux 5.0 or Ubuntu 18.04.3 with Linux 5.0 onwards, multiqueue is enabled by default providing the bfq, kyber, mq-deadline and none I/O schedulers. For Ubuntu 19.10 with Linux 5.3 the deadline, cfq and noop I/O schedulers are deprecated.

Ubuntu Linux 19.10、Ubuntu Linux 18.04 LTS以降では、マルチキューIOスケジューラーがデフォルトで有効になっています。
bfq、kyber、mq-deadline、nonoが利用可能です。また、Ubuntu Linux 19.10ではdeadline、cfq、noopは非推奨になりました。

Ubuntu 19.10以降は非マルチキューIOスケジューラーが使えなくなっているので、今後はマルチキューIOスケジューラーを気にすればよいでしょう。

で、どれが最適なスケジューラーか?ですが、

  • SSD
    • mq-deadline、none、bfqのいずれを使ってもほとんど変わらない
    • CPUオーバーヘッドを削減するために、noneを使うと有効なケースもある
  • HDD
    • noneは使わないこと
    • mq-deadlineが有利かもしれない
    • デスクトップユーザーにはbfqが有効な場合もある

ということが書かれています。

Red Hat Enterprise Linuxでの各スケジューラーに対するユースケースの記載も、参考に。

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

高パフォーマンスのSSDまたはCPUが使えるならnone、kyber、HDDならmq-deadlineかbfq、デスクトップならbfq、
仮想マシンのゲストならmq-deadline、none、だそうです。

ちなみに、Red Hat Enterprise Linuxではudevまたはtunedでスケジューラーを設定することを推奨しているようです。

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

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

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

IOスケジューラーを変更してみる

手元の環境の、ファイルシステムをちょっと見てみます。

$ df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  951M     0  951M   0% /dev
tmpfs          tmpfs     199M  684K  199M   1% /run
/dev/vda3      ext4      124G  2.7G  115G   3% /
tmpfs          tmpfs     994M     0  994M   0% /dev/shm
tmpfs          tmpfs     5.0M     0  5.0M   0% /run/lock
tmpfs          tmpfs     994M     0  994M   0% /sys/fs/cgroup
/dev/vda1      ext4      456M  196M  227M  47% /boot
tmpfs          tmpfs     199M     0  199M   0% /run/user/1000

あるデバイスのIOスケジューラーを見てみます。

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

mq-deadlineに設定されているようです。というか、2種類しかないですね。

Switching Scheduler — The Linux Kernel documentation

echoで、IOスケジューラー名を書き込めばいいみたいです。

$ echo none | sudo tee /sys/block/[device]/queue/scheduler 
none

IOスケジューラーが変更されました。

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

deadlineと指定すると、mq-deadlineになるようです。

$ echo deadline | sudo tee /sys/block/[device]/queue/scheduler 
deadline

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

ところで、現在の選択肢ではkyberとbfqがありません。

これは、modprobeでインストールするようです。

kyberをインストール。

$ sudo modprobe kyber-iosched

選択肢にkyberが増えました。

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

bfqもインストールします。

$ sudo modprobe bfq

選択肢にbfqが増えました。

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

切り替えてみましょう。

## kyberに切り替え
$ echo kyber | sudo tee /sys/block/[device]/queue/scheduler 
kyber
$ cat /sys/block/[device]/queue/scheduler 
mq-deadline [kyber] bfq none


## bfqに切り替え
$ echo bfq | sudo tee /sys/block/[device]/queue/scheduler 
bfq
$ cat /sys/block/[device]/queue/scheduler 
mq-deadline kyber [bfq] none

今回は調べものと簡単な確認、切り替えでしたが、こういうのを調べるのも勉強になりますね。