I/O Scheduler

I/O 스케줄러가 무엇이고 어떤 역할을 하는지와 시스템에서 발생하는 I/O 워크로드를 확인하는 방법을 알아본다.

I/O Sheduler

I/O 스케줄러는 상대적으로 접근 속도가 느린 디스크에 대한 성능을 최대화하기 위해 구현된 커널의 일부분이다. 모든 I/O 작업은 이 I/O 스케줄러를 통해서 블록 디바이스에 전달된다. HDD I/O 스케줄러는 이 때 성능을 극대화하기 위해서 병합과 정렬이라는 두가지 방법을 사용한다.

AWS EC2 Ubuntu 머신 위에서 현재 시스템에 적용 가능한 I/O 스케줄러와 설정되어있는 정보는 다음과 같이 확인할 수 있다.

$ cd /sys/block/xvda/queue/
$ cat scheduler
noop [deadline] cfq

[]로 표시되어 있는 부분이 현재 설정되어 있는 I/O 스케줄러이다.

  • cfq: Completely Fair Queueing의 약자로 프로세스들이 발생시키는 I/O 요청ㄷ르이 모든 프로세스에서 공정하게 실행된다.
  • deadline: I/O 요청별로 완료되어야 하는 deadline을 가지고 있는 스케줄러이다.
  • noop: 가장 간단한 형태의 스케줄러이며 정렬 작업 없이 병합 작업만 하는 것이 특징이다. 그래서 플래시 디스크의 경우 noop을 가장 많이 사용한다.

I/O Workload

얼마나 많은 프로세스가 I/O를 일으키는지에 대한 워크로드는 iotop 명령어로 확인할 수 있다. 없을 경우에는 apt으로 설치한다.

$ iotop -P
Total DISK READ :       0.00 B/s | Total DISK WRITE :       6.23 M/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:      26.58 M/s
  PID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
  298 be/3 root        0.00 B/s    0.00 B/s  0.00 % 94.93 % [jbd2/xvda1-8]
 3134 be/4 ubuntu      0.00 B/s    6.23 M/s  0.00 % 92.56 % python io_bound.py
 2806 be/4 ubuntu      0.00 B/s    0.00 B/s  0.00 %  0.04 % stress --cpu 2 --io 4 --vm 2 --vm-bytes 128M
 3112 be/4 ubuntu      0.00 B/s    0.00 B/s  0.00 %  0.03 % stress --cpu 2 --io 4 --vm 2 --vm-bytes 128M
    6 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.01 % [kworker/u30:0]
  512 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [loop3]
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init

다수의 프로세스가 I/O 요청을 일으키는 웹 서버의 경우 프로세스들이 모두 공평하게 I/O를 사용하도록 cfq 스케줄러를 사용하는 것이 좋다.

comments powered by Disqus