これは、なにをしたくて書いたもの?
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などで効果を発揮する、と。
- mq-deadline(Multiqueue-Deadline)
- deadlineスケジューラーを拡張して、マルチキューに対応させたもの
- 書き込みよりも、読み込みが多いケースに有効
- ほとんどのユースケースに適している
- Deadline IO scheduler tunables — The Linux Kernel documentation
- bfq(Budget Fair Queuing)
- 単一のアプリケーションが、全帯域幅を専有しないようにスケジュールする
- スループットの最大化よりも、遅延の最小化を目的にしている
- BFQ (Budget Fair Queueing) — The Linux Kernel documentation
- kyber
- 読み込み、同期書き込みリクエストにターゲットレイテンシーを設定できる
- Kyber I/O scheduler tunables — The Linux Kernel documentation
- none(No-operation)
参考)
Kernel/Reference/IOSchedulers - Ubuntu Wiki
非マルチキューIOスケジューラー
- deadline
- 書き込みよりも、読み込みが多いケースに有効
- ほとんどのユースケースに適している
- Deadline IO scheduler tunables — The Linux Kernel documentation
- noop(No-operation)
なお、非マルチキューIOスケジューラーは、カーネル 5.3でサポートされなくなったようです。
5.0の時点でこんな記述もありますし。
Remove all the non-mq code. Remaining drivers have been converted
参考)
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でスケジューラーを設定することを推奨しているようです。
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
今回は調べものと簡単な確認、切り替えでしたが、こういうのを調べるのも勉強になりますね。