리눅스 I/O 스케줄러 선택: CFQ·Deadline·NOOP의 동작과 적용 환경

리눅스 I/O 스케줄러 CFQ, Deadline, NOOP의 큐 처리 방식과 스토리지·워크로드별 선택 기준을 정리한다.

2026-08-14 · 최초 발행 2026-01-19

요청 순서가 디스크 접근 비용을 바꾼다

스토리지 I/O 성능은 디스크의 물리적 특성뿐 아니라 운영체제가 요청을 다루는 방식에도 좌우된다. I/O 스케줄러는 애플리케이션에서 들어오는 요청을 병합하거나 순서를 바꾸고, 필요하면 우선순위를 적용한다.

HDD에서는 회전 지연과 탐색 시간이 병목이 된다. 무작위 접근은 순차 접근보다 100배 이상 느릴 수 있으며, 여러 프로세스가 동시에 요청을 내면 헤드 이동을 줄이는 요청 순서가 중요해진다. 스케줄러가 다루는 목표는 처리량, 응답 시간, 프로세스 간 공정성, 기아 상태 방지 사이의 균형이다.

애플리케이션 1I/O 요청애플리케이션 2애플리케이션 3I/O 스케줄러요청 병합순서 재배열우선순위 적용디스크 드라이버물리적 디스크

CFQ는 프로세스별 큐를 번갈아 처리한다

CFQ(Completely Fair Queuing)는 프로세스마다 별도 I/O 큐를 두고, 각 큐에 공정하게 시간을 배정하는 스케줄러다. 각 프로세스의 요청은 독립 큐에 쌓이며, 스케줄러는 라운드 로빈 방식으로 큐를 선택한다. ionice 우선순위에 따라 타임 슬라이스를 조정할 수 있고, 동일 프로세스에서 연속된 요청은 병합할 수 있다.

CFQ 스케줄러프로세스 C요청 1라운드 로빈 선택기프로세스 A요청 1요청 2프로세스 B요청 1요청 2요청 3디스패치디스크

ionice 클래스는 작업 성격에 따라 I/O 처리 우선순위를 나누는 수단이다.

클래스 ionice 값 용도 특징
Idle 3 백그라운드 작업 다른 I/O 없을 때만 실행
Best Effort 0-7 일반 프로세스 기본값, 우선순위별 차등
Real-time 0-7 중요 작업 최우선 처리

CFQ는 다중 프로세스 사이에 I/O 대역폭을 공정하게 나누고 기아 상태를 막는 데 강점이 있다. 우선순위에 따른 차등 서비스도 가능해 데스크톱 환경의 반응성에 유리하다. 반면 내부 구조가 복잡해 디버깅이 어렵고, 오버헤드가 처리량 감소로 이어질 수 있다. SSD에서는 그 이점이 제한적이다.

Deadline은 만료 요청을 먼저 보낸다

Deadline Scheduler는 요청이 지나치게 오래 대기하지 않도록 최대 지연 시간을 관리한다. 읽기 요청의 데드라인은 500ms, 쓰기 요청의 데드라인은 5000ms가 기본값이다. 읽기가 성능에 더 민감하다는 전제 아래 읽기를 우선하며, 데드라인을 넘긴 요청은 최우선으로 처리한다.

YesNoI/O 요청데드라인임박?긴급정렬(섹터 번호순)디스패치병합 시도디스크

읽기와 쓰기는 각각 FIFO 큐에서 다른 데드라인으로 관리된다. 읽기 FIFO 큐는 짧은 데드라인으로 응답을 빠르게 유지하고, 쓰기 FIFO 큐는 긴 데드라인을 이용해 배치 처리한다. 별도의 정렬 큐는 섹터 번호 순서로 요청을 다뤄 디스크 헤드 이동을 줄인다.

이 특성은 예측 가능한 응답 시간이 필요한 데이터베이스 서버, 지연 시간 보장이 필요한 미디어 스트리밍과 실시간 시스템, 균형 잡힌 성능이 필요한 RAID 컨트롤러에 맞는다.

디스크정렬 큐쓰기 FIFO읽기 FIFODeadline Scheduler애플리케이션디스크정렬 큐쓰기 FIFO읽기 FIFODeadline Scheduler애플리케이션loop[스케줄링]읽기 요청데드라인 500ms 설정섹터 순서로 삽입쓰기 요청데드라인 5000ms 설정섹터 순서로 삽입만료 확인긴급 요청 있음긴급 요청 처리정렬된 요청 배치 처리최적화된 순서로 전달

NOOP은 장치의 스케줄링에 맡긴다

NOOP(No Operation) Scheduler는 요청 병합만 하고 재배열은 하지 않는 단순한 알고리즘이다. FIFO 방식으로 요청 순서를 유지하면서 스케줄러의 오버헤드를 낮추고, 나머지 최적화는 하드웨어 자체 스케줄링에 맡긴다.

YesNo요청 1단일요청 2요청 3인접 섹터?요청 병합그대로 전달디스패치스토리지 장치

기계적 지연이 없고 무작위 접근 성능이 좋은 SSD/NVMe, 자체 스케줄링 기능을 가진 RAID 컨트롤러, 네트워크 계층에서 최적화하는 SAN 스토리지, 호스트에서 이미 스케줄링이 이뤄지는 가상 머신에서 고려할 수 있다.

메트릭 HDD SSD/NVMe
CPU 오버헤드 최소 최소
처리량 낮음 높음
지연 시간 높음 낮음
공정성 순서대로 순서대로

Multi-Queue 환경의 mq-deadline과 BFQ

Multi-Queue I/O Stack은 여러 소프트웨어 큐를 하드웨어 큐에 연결해 I/O를 처리한다.

Multi-Queue I/O Stack하드웨어소프트웨어HW 1 1 2 3HW 2 4NVMe SSD

mq-deadline은 Multi-Queue 환경에 맞춘 Deadline Scheduler다. CPU 코어별 독립 큐로 확장성을 높이고 NUMA 인식을 통해 메모리 지역성을 활용하며, NVMe SSD의 기본 스케줄러다.

BFQ(Budget Fair Queuing)는 CFQ의 후속 버전으로, 낮은 지연 시간과 높은 응답성에 초점을 둔다. 데스크톱과 모바일 환경에서 프로세스별 I/O 대역폭을 보장하는 용도로 최적화됐다.

장치와 I/O 패턴으로 고르는 기준

HDD에서는 워크로드 성격을 먼저 본다. 데스크톱 작업에는 CFQ 또는 BFQ, 서버·데이터베이스와 순차 I/O에는 Deadline이 대응한다. SSD/NVMe는 mq-deadline 또는 none, RAID/SAN은 NOOP을 선택지로 둘 수 있다.

HDDSSD/NVMeRAID/SAN데스크톱서버/DB순차 I/O스토리지유형?워크로드특성?mq-deadline또는 noneNOOPCFQ 또는 BFQDeadline

현재 스케줄러 확인과 변경, 부팅 시 설정, 개별 파라미터 조정은 다음과 같이 수행한다.

# 현재 스케줄러 확인
cat /sys/block/sda/queue/scheduler

# 스케줄러 변경 (런타임)
echo deadline > /sys/block/sda/queue/scheduler

# 부팅 시 자동 설정 (GRUB)
# /etc/default/grub에 추가
GRUB_CMDLINE_LINUX="elevator=deadline"

# 스케줄러별 튜닝 파라미터
# Deadline 읽기 데드라인 변경
echo 250 > /sys/block/sda/queue/iosched/read_expire

# CFQ 큐 깊이 조정
echo 128 > /sys/block/sda/queue/iosched/quantum

I/O 스케줄러 선택은 장치 유형 하나로 끝나지 않는다. 다중 프로세스 환경에서의 공정성, 서버 워크로드의 예측 가능한 응답 시간, 스토리지 장치가 이미 제공하는 스케줄링 기능을 함께 판단한 뒤 적절한 스케줄러와 파라미터를 적용해야 한다.

리눅스I/O 스케줄러CFQDeadline스토리지