====== 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]]