What Are I/O Schedulers?
The I/O scheduler determines the order in which read and write requests are sent to storage devices. The right scheduler can significantly impact performance depending on your workload and storage type.
Available Schedulers
| Scheduler | Best For | Description |
|---|---|---|
| none/noop | NVMe SSDs | No reordering — passes requests directly to the device |
| mq-deadline | SSDs, databases | Guarantees request latency with deadlines |
| bfq | Desktop, interactive | Budget Fair Queueing — prioritizes interactive I/O |
| kyber | Fast SSDs | Low-overhead scheduler for high-IOPS devices |
Check Current Scheduler
# Shows active scheduler in brackets
cat /sys/block/sda/queue/scheduler
# Example output: [mq-deadline] kyber bfq noneChange Scheduler Temporarily
echo "mq-deadline" | sudo tee /sys/block/sda/queue/schedulerChange Scheduler Permanently
Create a udev rule at /etc/udev/rules.d/60-ioscheduler.rules:
# NVMe drives — use none
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# SATA SSDs — use mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# HDDs — use bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"Queue Depth Tuning
# Check current queue depth
cat /sys/block/sda/queue/nr_requests
# Increase for high-throughput workloads
echo 256 | sudo tee /sys/block/sda/queue/nr_requestsGeneral Recommendations
- NVMe: Use
none— the device has its own scheduler - SSD: Use
mq-deadlinefor databases,kyberfor general workloads - HDD: Use
bfqfor mixed workloads