====== IO schedulers ======
==== single queue schedulers ====
There are 2 queues, one for read & one for write operations.
* **none** is just a First In First Out standard queue of I/O operations (it still merges some requests).
* **cfq** (Completely Fair Scheduling) is similar to the Round Robin algorithm and basically allots a fixed execution time for each I/O operation (they are implemented as a circular queue)
* **deadline** is like a priority queue with an aging concept. Basically it adds a deadline for each I/O operation & implements a priority queue
==== block multi-queue schedulers ====
Supported in kernel >=4.12. It is disabled by default.
To use multi-queue schedulers compile kernel with **CONFIG_SCSI_MQ_DEFAULT=y** or pass parameter **scsi_mod.use_blk_mq=1** in boot loader.
[[https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq)|Linux Multi-Queue Block IO Queueing Mechanism]]
===== set cfq/deadline scheduler =====
For older systems:
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="cfq"
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"
===== set bfq/deadline scheduler =====
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
# order matters - strict_guarantee:=1 cause slice_idle back to 8
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/rotational}=="1", ATTR{queue/iosched/strict_guarantees}="1"
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*", ATTR{queue/rotational}=="1", ATTR{queue/iosched/slice_idle}="0"
ACTION=="add|change", KERNEL=="sd*[!0-9]|sr*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="kyber"
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]*", ATTR{queue/scheduler}="kyber"
Check current schedulers:
cat /sys/block/sd*/queue/scheduler
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
sudo udevadm control --reload
sudo udevadm trigger --action=change --subsystem-match=block
cat /sys/block/sd*/queue/scheduler
cat /sys/block/sd*/queue/iosched/slice_idle
cat /sys/block/sd*/queue/iosched/strict_guarantees
===== more =====
* [[https://www.reddit.com/r/btrfs/comments/12qf09a/bfq_btrfs/|bfq & btrfs]]
* [[https://docs.kernel.org/block/bfq-iosched.html|bfq]]