WHEREIS

- 설명
입출력 스케줄링(I/O scheduling)은 운영 체제가 다수의 프로세스들로부터 디스크를 읽거나 쓰려는 요청을 받았을 때, 우선순위를 정해주고 이를 관리하는 것


- 종류
1. CFG
이 I/O 스케줄러의 목표는 각 프로세스에 공정한 I/O 우선 순위를 제공하는 것
이 스케줄러의 요지는 디스크 탐색을 줄이기 위해 큐를 주문한 후 "라운드 로빈 방식"으로 이러한 프로세스별 I/O 큐를 서비스한다는 것
동일한 우선순위를 각 프로세스에 제공하려고 한다는 것입니다. 
그러나 이렇게 하면 단일 프로세스에서 하나의 요청 유형(예: 읽기)의 우선 순위를 지정해야 하는 환경에 대해서는 최적화되지 못 함

2. Deadline 
읽기 대기열과 쓰기 대기열의 두 가지 대기열을 생성하여 작동
각 I/O 요청에는 만료 시간 동안 커널에서 사용하는 타임 스탬프가 연결
I/O 요청이 기한에 도달하면 가장 높은 우선 순위로 푸시
기본 "deadline" 값은 읽기 작업의 경우 500ms 이고 쓰기 작업의 경우 5,000ms
이러한 값을 기반으로 Deadline 스케줄러가 읽기가 많은 워크로드에 최적의 스케줄러로 간주
데이터베이스 시스템에서 효과적

3. Noop
특정 I/O 작업의 우선 순위를 지정하는 대신 모든 I/O 요청을 FIFO(선입 선출) 대기열에 배치
NOOP는 외부 RAID 컨트롤러 또는 SAN 컨트롤러와 같은 다른 장치가 I/O 성능을 최적화할 것이라고 가정합니다.
탐색 시간이 매우 짧은 플래시 드라이브, SSD 드라이브, USB 스틱 등과 같은 저장 장치는 NOOP I/O 스케줄러의 이점을 얻을 수 있습니다.


* VM 의 경우 host OS 의 영향을 받는다는 글도 있고

NOOP 또는 Deadline 이 가상화된 Linux 게스트에 대해 더 나은 성능을 발휘한다는 내용도 있어서 가상화 적용 여부는 테스트를 진행해야 할 것으로 보임.

 

 ==> PC VMware 에서 테스트 시, deadline 으로 했을 경우가 read,write 성능이 좋음 (랜덤 읽기/쓰기에 대해서는 cfq 보다 다소 떨어짐) noop 은...?

 

[root@localhost fioData]# grep READ */read_0.log
cfq/read_0.log:   READ: bw=35.4MiB/s (37.1MB/s), 35.4MiB/s-35.4MiB/s (37.1MB/s-37.1MB/s), io=1024MiB (1074MB), run=28931-28931msec
dead/read_0.log:   READ: bw=56.8MiB/s (59.6MB/s), 56.8MiB/s-56.8MiB/s (59.6MB/s-59.6MB/s), io=1024MiB (1074MB), run=18013-18013msec
noop/read_0.log:   READ: bw=739KiB/s (757kB/s), 739KiB/s-739KiB/s (757kB/s-757kB/s), io=1024MiB (1074MB), run=1418155-1418155msec


[root@localhost fioData]# grep WRITE */write_0.log
cfq/write_0.log:  WRITE: bw=33.9MiB/s (35.5MB/s), 33.9MiB/s-33.9MiB/s (35.5MB/s-35.5MB/s), io=1024MiB (1074MB), run=30218-30218msec
dead/write_0.log:  WRITE: bw=34.4MiB/s (36.1MB/s), 34.4MiB/s-34.4MiB/s (36.1MB/s-36.1MB/s), io=1024MiB (1074MB), run=29778-29778msec
noop/write_0.log:  WRITE: bw=741KiB/s (759kB/s), 741KiB/s-741KiB/s (759kB/s-759kB/s), io=1024MiB (1074MB), run=1415175-1415175msec


[root@localhost fioData]# grep WRITE */ran*write_0.log
cfq/randwrite_0.log:  WRITE: bw=32.8MiB/s (34.4MB/s), 32.8MiB/s-32.8MiB/s (34.4MB/s-34.4MB/s), io=1024MiB (1074MB), run=31183-31183msec
dead/randwrite_0.log:  WRITE: bw=31.9MiB/s (33.5MB/s), 31.9MiB/s-31.9MiB/s (33.5MB/s-33.5MB/s), io=1024MiB (1074MB), run=32097-32097msec
noop/randwrite_0.log:  WRITE: bw=748KiB/s (766kB/s), 748KiB/s-748KiB/s (766kB/s-766kB/s), io=1024MiB (1074MB), run=1402395-1402395msec


[root@localhost fioData]# grep READ */ran*read_0.log
cfq/randread_0.log:   READ: bw=35.0MiB/s (36.7MB/s), 35.0MiB/s-35.0MiB/s (36.7MB/s-36.7MB/s), io=1024MiB (1074MB), run=29223-29223msec
dead/randread_0.log:   READ: bw=35.5MiB/s (37.2MB/s), 35.5MiB/s-35.5MiB/s (37.2MB/s-37.2MB/s), io=1024MiB (1074MB), run=28869-28869msec
noop/randread_0.log:   READ: bw=741KiB/s (759kB/s), 741KiB/s-741KiB/s (759kB/s-759kB/s), io=1024MiB (1074MB), run=1415066-1415066msec

 

 

 

 


- 적용 방법
1. 온라인으로 적용

# echo "cfq" > /sys/block/sda/queue/scheduler
# deadline /sys/block/sda/queue/scheduler
noop deadline [cfq]

즉시 적용되며, 프로세스를 재기동하지 않아도 됨.

2. 부팅 시에도 옵션 유지(grub)
# vi /etc/default/grub
 GRUB_CMDLINE_LINUX="elevator=noop"
# update-grub2


출처 : https://www.cloudbees.com/blog/linux-io-scheduler-tuning
        https://www.admin-magazine.com/HPC/Articles/Linux-I-O-Schedulers

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band
loading