Linux

I/O 스케줄러

studioesso 2025. 12. 19. 10:52

 

기본적으로 디스크 입출력은 CPU의 관점에서 매우 느린 작업이다.

따라서, 디스크 입출력이 발생하면 캐시/버퍼, 스케줄러 등 OS에서는 여러 가지 방법을 통해 성능 보완을 한다.

 

그런데, 사실 예전의 HDD는 디스크 헤더가 물리적으로 이동하면서 데이터를 읽는 방식, 쉽게 말하면 기계적인 방식으로 I/O가 처리됐기 때문에 커널의 I/O 스케줄러는 매우 중요한 요소였다.

 

하지만 플래시 메모리 기반의 SSD는 전기적 신호로 데이터가 입출력되기 때문에 스케줄러가 사실상 필요가 없다. 오히려 커널에서 입출력을 병합하고 정렬하는 것이 더 병목일 수 있다.

 

cat /sys/block/sda/queue/scheduler 명령을 실해하면 현재 OS에서 사용중인, 사용할 수 있는 스케줄러를 확인할 수 있는데, 대괄호 표시 된게 사용중인 스케줄러다.

 

none -> 스케줄러 아예 사용 안함 (고성능 nvme나 대부분 ssd는 이게 베스트)

noop -> 가장 단순한 스케줄러만 사용(기초적인 병합), 과도기에 사용한 구식 스케줄러

cfq -> 완전 공정 스케줄러, 모든 프로세스들의 io 요청들이 공정하게 실행

deadline -> 모든 io에 데드 라인을 지정, 지연 방지

 

보통 noop 아니면 deadline을 적용하는 듯 하다.

 

변경 방법 : echo noop > /sys/block/sda/queue/scheduler

 

참고로 변경하면 관련 튜닝 파라미터들이 알아서 바뀐다.

 

 


 

deadline I/O 스케줄러

I/O 작업에 데드 라인을 부여하고, 최대한 데드 라인에 맞춰 작업이 완료될 수 있게 한다. (보장하진 않는다.)

 

I/O 작업에는 각각 읽기/쓰기 작업이 있고, 각 작업에는 sorted list와 FIFO list가 있다.

 

sorted list는 I/O 작업 요청을 디스크 섹터 기준으로 정렬해놓은 것인데, HDD는 당연히 정렬된 섹터대로 작업을 처리해야 효율적이고, SSD 또한 병합 처리를 위해 sorted list를 우선적으로 처리한다.

 

FIFO list는 요청이 들어온 순서대로 정렬되어 있는 리스트다.

 

여기서 deadline I/O는 sorted list를 기반으로 처리하되, FIFO list 중에 데드라인을 넘긴 작업이 있다면, 그 작업을 먼저 처리하고 다시 sorted list를 재정렬하여 처리하는 방식으로 진행된다.

 

현재 선택된 스케줄러에 관한 파라미터는 /sys/block/sda/queue/iosched 에서 확인이 가능한데,

deadline I/O에서 read_expire와 write_expire는 각각 읽기/쓰기에 대한 만료를 의미하는데, write_expire가 훨씬 길다.

그래서 쓰기 작업이 읽기에 비해 계속 밀릴 가능성이 있는데, 이 때 write_starved 값을 조정해서 읽기 값이 n번 이루어지면 쓰기 작업이 꼭 처리될 수 있도록 설정할 수 있다.

 

 


 

noop I/O 스케줄러

noop 스케줄러는 I/O 요청에 병합 여부만 체크해서 가능하면 병합하는 처리만 진행한다.

별도로 섹터 별 정렬을 하는 작업은 없다.

 

SSD 장착 장비에서 쓰는 스케줄러인데, SSD는 전기적 신호로 접근하기 때문에 섹터 별 접근 시간이 동일하다.

그래서 정렬하는데 시간을 쓰는 것은 오히려 낭비이다.

 

별도 튜닝 값은 없다.

 

 


 

 

I/O는 서버의 워크로드 유형에 따라 효율적인 스케줄러와 성능에 차이가 있기 때문에 이를 고려해야 한다.

'Linux' 카테고리의 다른 글

Load Average  (0) 2025.12.26
interrupt와 context switch  (0) 2025.12.22
rrqm과 wrqm  (0) 2025.12.18
Dirty Page  (0) 2025.12.16
[linux] 프로세스 상태 및 명령어  (0) 2025.05.29