본문 바로가기
IT/Linux_리눅스

[Linux] I/O 스케줄러(I/O Scheduler), I/O 스케줄러의 역할

by 능보테 2020. 12. 29.
728x90
반응형

0. I/O 스케줄러란

리눅스 시스템 상에서 사용자가 발생시키는 여러가지 읽기, 쓰기와 같은 I/O 작업(Input/Output)작업들은 여러 시스템을 거쳐서 블록 디바이스까지 전달되기 전에 I/O스케줄러를 거치게 됩니다.

 

이 I/O 스케줄러는 시스템의 여러 요소들보다 상대적으로 접근 속도가 느린 디스크의 성능을 최대화시키기 위해서 구현되있는 커널의 일부분입니다.

 

모든 I/O 작업은 이 I/O 스케줄러를 통해서 블록 디바이스에 전달됩니다.

 

 


1. I/O 스케줄러가 필요한 이유

I/O 스케줄러가 필요한 이유를 보기 전에 그 이유가 되는 디스크의 작동방식에 대해서 간단히 알아볼 필요가 있습니다.

 

디스크 종류에는 크게 헤드와 플래터 등의 여러가지 기계식 부품으로 HDD라 불리는 하드 디스크와 플래시 메모리를 기반으로 만들어진 SSD 디스크가 있습니다.

 

HDD는 저장되어 있는 데이터를 읽기 위해서 디스크의 헤드를 디스크를 구성하는 우너판인 플래터의 특정 위치로 움직여야합니다.

 

HDD의 구성요소인 헤드는 기계적인 장치이기 떄문에 시스템의 여러 전자장치보다 속도가 상대적으로 느리고 가장 많은 시간을 소요합니다. 그래서 이 헤드의 움직임을 최소화하고, 한번의 움직임에 여러 처리를 해내야 I/O 성능을 극대화할 수 있습니다.

 

SSD는 HDD의 기계식 구조와 달리 헤드와 같은 기계 장치가 아닌 플래시 메모리로 구성되어 이 메모리를 통해서 데이터를 쓰거나 읽습니다.

 

SSD는 컨트롤러라는 장치를 이용해서 디스크로 유입되는 I/O를 조정하며 HDD의 기계장치보다 속도가 빠르고 전기적신호를 이용하기 때문에 임의로 특정 섹터의 데이터에 접근할 때, 소요되는 시간이 모두 동일합니다.

 

결론적으로 HDD와 SSD 모두 디스크와 관련된 작업은 이러한 이동시간등을 포함해서 시간이 오래 걸리기 때문에 커널은 I/O 스케줄러를 통해서 조금이라도 더 성능을 끌어올리려 합니다.

 

 


 

2. I/O 요청 병합과 정렬

위의 이유로 성능 극대화 작업을 위해서 I/O 스케줄러는 병합과 정렬이라는 두 가지의 방법을 사용합니다.

 

  • 병합
    Request Queue에 3개의 요청이 들어왔다고 가정합니다.
    1번 요청은 1번 블록의 1개의 블록, 2번 요청은 2번 블록의 1개의 블록, 3번 요청은 3번 블록의 1개의 블록으로 요청이 들어왔다고 할 때, 이들은 세 개의 각각 다른 요청이지만 하나의 요청으로 합칠 수 있습니다.
    1번 블록에서 3개의 블록을 읽으면 위의 3개의 요청을 모두 수행할 수 있기 때문에 I/O 스케줄러는 이 3개의 요청을 1개로 병합하여 움직임을 최소화 합니다.
  • 정렬
    Request Queue에 5개의 요청이 들어왔을 때, 그 순서가 1->10->5->9->2 의 순서로 블록을 참조해야 한다고 가정합니다. 만약 이 순서대로 요청을 수행하게 되면 각각의 블록의 거리를 모두 더한 (9+5+4+7)=25의 이동거리를 소요해야합니다.
    이 같은 낭비를 막기 위해서 I/O 스케줄러는 요청들의 블록 위치를 정렬하여
    1->2->5->9->10 과 같이 정렬합니다. 이 경우에는 (1+3+4+1)=9의 이동거리를 소요하고 소요되는 시간을 크게 감소시킬 수 있습니다.

위의 방법들은 HDD 기계식 장치들의 이동 지연시간을 줄이기 위한 방법이며 SSD에서는 헤드와 같은 기계식 장치가 없기 때문에 SSD 디스크에서는 사용되지 않는 방식입니다.

 


 

본 포스팅의 내용 및 이미지를 무단 전재, 재배포 또는 복사를 금지합니다.

인용 시 출처와 같이 공개해주세요!

도움이 되셨다면 댓글 또는 공감 부탁드립니다!

728x90
반응형

댓글