Linux Disk I/O Schedulers Explained

The Linux kernel’s I/O scheduler determines the order disk read/write requests are actually processed — and the right choice genuinely depends on whether you’re running on an SSD or a spinning HDD.

# Check the current scheduler for a device
cat /sys/block/sda/queue/scheduler

# Change it temporarily
echo mq-deadline | sudo tee /sys/block/sda/queue/scheduler

# Persistent change via a udev rule
echo 'ACTION=="add|change", KERNEL=="sda", ATTR{queue/scheduler}="mq-deadline"' | \
  sudo tee /etc/udev/rules.d/60-scheduler.rules

Why It Matters for HDDs vs SSDs

  • HDDs — benefit genuinely from schedulers that reorder requests to minimize physical read-head movement (like the older CFQ or deadline schedulers)
  • SSDs — have near-uniform access time regardless of “location,” so request reordering for seek-time optimization provides little to no benefit; simpler, lower-overhead schedulers (like none/noop or mq-deadline) are usually the better choice

Modern kernels using the multi-queue block layer (mq-deadline, kyber, none) generally auto-select a reasonable default based on detected device type — manual tuning is worth doing specifically for latency-sensitive database workloads where the difference is actually measurable, not as a blanket “optimization” on every system.