Skip to content

I/O Schedulers

The I/O scheduler is a critical component of the Linux kernel that manages the order in which disk I/O requests are processed. By optimizing request sequencing, it directly impacts disk throughput, latency, and overall system performance. The choice of scheduler can significantly affect workloads ranging from random read/write operations on SSDs to sequential data transfers on HDDs. This section compares the primary I/O schedulers—noop, cfq, deadline, and mq-deadline—and their suitability for different use cases.


Noop (No Operation) Scheduler

The noop scheduler is the simplest I/O scheduler, designed for systems where the underlying storage device (e.g., SSDs) already optimizes request ordering. It processes I/O requests in the order they are received, with no reordering or prioritization.

Use Cases:
- SSDs or NVMe devices, which inherently minimize seek times.
- Embedded systems or environments where minimal scheduling overhead is critical.

Example:

# Check available schedulers for a device (e.g., /dev/sda)
cat /sys/block/sda/queue/scheduler

# Set the noop scheduler for /dev/sda
echo noop > /sys/block/sda/queue/scheduler


CFQ (Completely Fair Queuing) Scheduler

The cfq scheduler prioritizes fairness among processes, ensuring that no single application monopolizes disk I/O. It is optimized for traditional HDDs and multitasking environments, balancing latency and throughput.

Use Cases:
- Desktop systems with mixed workloads (e.g., web browsing, file transfers).
- HDDs where random I/O is common.

Example:

# Verify CFQ is enabled (default in older kernels)
cat /sys/block/sda/queue/scheduler

Note: cfq is deprecated in newer kernels (e.g., 5.1+), replaced by mq-deadline in the blk-mq framework.


Deadline Scheduler

The deadline scheduler focuses on meeting deadlines to prevent I/O starvation, making it ideal for workloads requiring predictable latency. It uses a two-queue approach (read and write) to prioritize requests based on their deadlines.

Use Cases:
- Databases and applications requiring consistent latency.
- Sequential workloads (e.g., log files, video streaming).

Example:

# Set the deadline scheduler for /dev/sda
echo deadline > /sys/block/sda/queue/scheduler


MQ-Deadline Scheduler

The mq-deadline scheduler is part of the blk-mq (block multi-queue) framework, designed for modern storage devices with high IOPS (e.g., NVMe, SSDs). It improves upon deadline by supporting multiple queues and reducing context-switching overhead.

Use Cases:
- High-performance environments (e.g., cloud storage, databases).
- NVMe or SSDs with sequential or random I/O.

Example:

# Check if mq-deadline is available (requires kernel 4.9+)
cat /sys/block/sda/queue/scheduler

# Set mq-deadline for /dev/sda
echo mq-deadline > /sys/block/sda/queue/scheduler


Key Takeaways

  • Use noop for SSDs or embedded systems with minimal scheduling needs.
  • Opt for deadline in latency-sensitive applications like databases.
  • Choose mq-deadline for modern NVMe/SSD workloads requiring high throughput.
  • Avoid cfq in newer kernels; it’s deprecated in favor of blk-mq-based schedulers.
  • Always test scheduler changes in production environments to validate performance impacts.