Docs / Performance Optimization / Understanding and Tuning Linux I/O Schedulers

Understanding and Tuning Linux I/O Schedulers

By Admin · Feb 25, 2026 · Updated Apr 24, 2026 · 122 views · 2 min read

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

SchedulerBest ForDescription
none/noopNVMe SSDsNo reordering — passes requests directly to the device
mq-deadlineSSDs, databasesGuarantees request latency with deadlines
bfqDesktop, interactiveBudget Fair Queueing — prioritizes interactive I/O
kyberFast SSDsLow-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 none

Change Scheduler Temporarily

echo "mq-deadline" | sudo tee /sys/block/sda/queue/scheduler

Change 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_requests

General Recommendations

  • NVMe: Use none — the device has its own scheduler
  • SSD: Use mq-deadline for databases, kyber for general workloads
  • HDD: Use bfq for mixed workloads

Was this article helpful?