meta data for this page
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.
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