IT/리눅스마스터1급

i/o 스케줄러

알콩달콩아빠 2022. 4. 29. 09:42
728x90
반응형

I/O 스케줄러의 종류

1. The NOOP scheduler
- 리눅스 I/O 스케줄러의 가장 간단한 형태로 우선순위 없이 FIFO 으로 처리된다.
- 큰 캐싱 시스템을 가진 스토리지 환경에 적합, solid-state storage 에 적합하다.

2. The Deadline scheduler
- 들어오는 요청의 처리 완료 시간을 기준으로 우선적으로 처리한다.
- 리얼타임 어플리케이션, 데이타베이스, 디스크 집약 어플리케이션에 효과적이다.

3. The Anticipatory scheduler [2.6.33 Linux에서 제거 됨]
- 현재 작성하고 있는 블록의 인접한 블록을 우선적으로 처리한다.
- 싱글 IDE/SATA 디스크에서 웹서버, 파일 서버, 데스크탑에서 최고의 포퍼먼스를 보여줍니다.

4. The Completely Fair Queuing (CFQ) scheduler [2.6.18 부터 Linux 기본값으로 사용됨]
- 대부분의 읽기,읽기에 대해서 최악의 경우를 최소화하는 스케줄러로 대부분 사용합니다.
- 다중 사용자 환경으로 광범위한 어플리케이션에서 효과적이다.

* 스케줄링 확인 방법
# cat /sys/block/*DEV*/queue/scheduler

* 스케줄링 적용 방법
# echo SCHEDNAME > /sys/block/*DEV*/queue/scheduler

 

 

리눅스 커널 I/O 스케줄링 우선순위

리눅스 커널 CPU 스케줄링과 마찬가지로 I/O 스케줄링에 적용되는 스케줄링 클래스와 우선순위도 ioprio_set() 시스템콜을 이용해 사용자가 제어할 수 있습니다. 하지만 리눅스 커널이 제공하는 여러가지 I/O 스케줄러 중에서 CFQ(Completely Fair Queuing) 스케줄러에서만 사용할 수 있습니다. 물론 리눅스 커널은 블럭 장치마다 다른 I/O 스케줄러를 사용할 수 있도록 허용하므로 필요한 경우 적절하게 시스템을 구성하는 것도 가능합니다.[1]

I/O 스케줄링 클래스는 CPU 스케줄링과 비슷하게 나누어집니다. 첫번재 IOPRIO_CLASS_RT(1) 클래스는 실시간(real-time) I/O 클래스로서, 이 클래스에 속한 태스크는 다른 클래스에 속한 태스크보다 항상 디스크에 먼저 접근합니다. 클래스 내부 우선순위는 가장 높은 0부터 가장 낮은 7까지 지정할 수 있습니다. 두번째 IOPRIO_CLASS_BE(2) 클래스는 최선노력(best-effort) I/O 클래스로서, 특별히 I/O 우선순위를 지정하지 않은 대부분의 태스크가 이 클래스에 속합니다. 첫번째 클래스와 마찬가지로 0부터 7까지 내부 우선순위를 지정할 수 있으며, 이 우선순위에 따라 얼마나 많은 I/O 대역폭을 할당할지 결정합니다. 마지막 IOPRIO_CLASS_IDLE(3) 클래스에 속한 태스크는 위의 두 클래스에 속한 어떤 태스크도 해야할 I/O 작업이 없을때만 I/O 작업을 수행하고, 내부 우선순위는 무시됩니다.

I/O 스케줄링 클래스와 우선순위는 읽기 작업과 동기화 쓰기 작업(O_DIRECT, O_SYNC)에만 반영됩니다. 즉, 일반적인 비동기 쓰기 작업에는 적용되지 않습니다.

ioprio_set(), ioprio_get() 시스템콜은 리눅스 표준 C 라이브러리에 대응하는 함수가 없기 때문에 다음과 같이 직접 syscall() 함수를 이용해 호출해야 합니다.[2]

#define _GNU_SOURCE      /* or _BSD_SOURCE or _SVID_SOURCE */
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */

static inline int ioprio_set (int which, int who, int ioprio)
{
  return syscall (__NR_ioprio_set, which, who, ioprio);
}

static inline int ioprio_get (int which, int who)
{
  return syscall (__NR_ioprio_get, which, who);
}

위와 같이 프로그램 소스 코드를 수정하지 않아도 ionice 프로그램을 이용하면 셸(shell)이나 스크립트에서 직접 다른 태스크의 I/O 스케줄링 클래스와 우선순위를  변경할 수도 있습니다.

이와 더불어 리눅스 커널 cgroups 시스템의 blkio 서브시스템을 이용하면 태스크 / 디스크별 대역폭(bandwidth)을 할당하거나 그룹별로 더 다양한 I/O 정책을 세밀하게 적용할 수 있습니다.

 

출처 : http://joonlinux.blogspot.kr/2011/02/linux-io.html

http://sunjinyang.wordpress.com/2010/10/05/linux-kernel-io-scheduler-priority/ 

728x90
반응형

'IT > 리눅스마스터1급' 카테고리의 다른 글

probe 구조체 platform_driver, platform_device  (0) 2022.05.02
am 명령어  (0) 2022.04.29
프로세스 스케줄링  (0) 2022.04.28
txqueuelen  (0) 2022.04.25
mmap  (0) 2022.04.25