There are 2 queues, one for read & one for write operations.
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.
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"
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