Table of Contents

IO schedulers

single queue schedulers

There are 2 queues, one for read & one for write operations.

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.

Linux Multi-Queue Block IO Queueing Mechanism

set cfq/deadline scheduler

For older systems:

/etc/udev/rules.d/60-schedulers.rules
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

/etc/udev/rules.d/60-schedulers.rules
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
/etc/udev/rules.d/60-schedulers.rules
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