I/O Scheduler
- 작성자
- 고친과정
2010년 10월 28일 : 처음씀
1.1. 개요
I/O를 처리하기 위해서는 일련의 Seek, Read, Write, Sort, Merge등의 과정이 필요합니다.
이것을 좀더 효율적으로 흐름제어를 위해서 I/O처리에 대한 특화된 Scheduler의 고안이 필요했습니다.
이것을 좀더 효율적으로 흐름제어를 위해서 I/O처리에 대한 특화된 Scheduler의 고안이 필요했습니다.
1.2. 문제의 고민
Writes-Starving-Reads
- Write동작은 버퍼에 밀어넣고 버퍼에서 Merge 및 Sort를 하여 일련의 연속된 Write동작으로 처리될수 있습니다. 하지만 이 과정에서 Read동작이 끼어들게 되면 I/O요청순서에 입각하여 처리되면서 연속적인 Read동작을 하지 않게 되고 자주 Seek하면서 성능이 극대화 되기 힘들게 됩니다. 이러한 I/O Scheduler의 동작에 의한 현상을 "Writes-starving-reads"라고 합니다.
- 논리적으로 연속적인 커다란 Data를 Read하는 중에 작은 Data를 읽는 동작이 끼어들게 되면 작은 Data를 Read하는것에 대하여 어떤것에 성능의 초점을 맞춰야 하는지에 대한 갈등의 문제가 생깁니다. 이것을 "Effects of High Read Latency"라고 합니다.
1.3. Linux Elevator
요청된 I/O를 Sort하면서 Queue에 넣었다가 오래된 요청을 먼저 처리하는 방식입니다.
1.4. Deadline I/O Scheduler
Read와 Write가 별도의 Queue로 Sort되어 넣었다가 요청순서대로 처리하게 되는데 이때 각 요청에는 제한시간이 있어서 제한시간을 넘어서까지 처리되지 않은 요청이 있는 경우 해당 요청을 먼저처리하도록 하여 처리하는 방식입니다.
1.5. Anticipatory I/O Scheduler
논리적인 연속적인 Data A와 B가 있을때 한번의 Read요청으로 A를 Read하고 다음 요청이 B를 Read하고 그 다음 요청이 이전의 A Read위치의 다음에 위치한 부분인 경우를 위해서 처음 A의 Read요청이 완료된후 일정시간 Seek위치를 유지하는 방식으로 연속적인 Data Read에 대한 성능에 초점을 맞춘 방식입니다.
1.6. CFQ(Complete Fair Queue) I/O Scheduler
각 Process별로 Queue를 소유하고 주어진 Time Slice동안 Round robin방식으로 작업을 처리하도록 하는 방식인데 만약 Time Slice를 전부 소모하지 않은 상태에서 Queue를 모두 처리한 경우 일정시간을 기다리면서 다른 요청을 추가적으로 기다려주는 조건을 포함합니다. 동기적인 요청(Read)이 비동기적인 요청(Write)보다 우선순위가 높게 처리되는 특성을 가지고 있고 Writes-Starving-Reads 현상을 어느정도 개선하는 방식입니다.
1.7. No-op I/O Scheduler
요청된 I/O를 Sort하지는 않고 Merge만 하여 처리하는 것으로 Sort동작이 필요없는 경우에 (예를 들어서 Seek동작이 무시할정도로 빠른 Flash같은 장치들) 대해서 사용하는 방식입니다.