2. blkio

Subsystem - blkio

blkio 서브시스템은 특정 block device에 대한 접근을 제한하거나 제어하기 위한 서브시스템 입니다. 자세한 내용은 ** Documentation/cgroup-v1/blkio-controller.txt ** 를 참고해주세요.

예제 살펴보기

I/O 작업이 많은 몇몇의 어플리케이션이 하나의 서버에서 동작한다고 가정합니다. 각 어플리케이션에 대해 다른 우선순위와 I/O 대역폭을 설정해주는 예제를 살펴보겠습니다.

  1. cgroup 가상파일시스템을 마운트합니다.
$ sudo mkdir -p /cgroup/blkio
$ sudo mount -t cgroup -o blkio blkio /cgroup/blkio
  1. 마운트 여부 확인하기. 아래 명령어를 수행해서 결과가 표시된다면 정상적으로 마운트되었습니다.
$ mount | grep cgroup
blkio on /cgroup/blkio type cgroup (rw,relatime,blkio)
or
$ cat /proc/mount | grep cgroup
blkio /cgroup/blkio cgroup rw,relatime,blkio 0 0
  1. mount 상태 확인해보기.
linuxias@linuxias-VirtualBox:/cgroup/blkio$ ls -al
total 4
dr-xr-xr-x 2 root root    0  8월 11 13:35 .
drwxr-xr-x 3 root root 4096  8월  6 17:07 ..
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_merged
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_merged_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_queued
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_queued_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_service_bytes
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_service_bytes_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_serviced
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_serviced_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_service_time
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_service_time_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_wait_time
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.io_wait_time_recursive
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.leaf_weight
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.leaf_weight_device
--w------- 1 root root    0  8월 11 13:55 blkio.reset_stats
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.sectors
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.sectors_recursive
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.io_service_bytes
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.io_serviced
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.read_bps_device
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.read_iops_device
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.write_bps_device
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.throttle.write_iops_device
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.time
-r--r--r-- 1 root root    0  8월 11 13:55 blkio.time_recursive
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.weight
-rw-r--r-- 1 root root    0  8월 11 13:55 blkio.weight_device
-rw-r--r-- 1 root root    0  8월 11 13:55 cgroup.clone_children
-rw-r--r-- 1 root root    0  8월 11 13:35 cgroup.procs
-r--r--r-- 1 root root    0  8월 11 13:55 cgroup.sane_behavior
-rw-r--r-- 1 root root    0  8월 11 13:55 notify_on_release
-rw-r--r-- 1 root root    0  8월 11 13:55 release_agent
-rw-r--r-- 1 root root    0  8월 11 13:55 tasks

마운트한 디렉토리에서 내부 리스트를 확인해보니 위와 같이 많은 파일들이 생성되었습니다. 그 중 우리가 write할 수 있는 파일은 몇 개 되지 않네요. 나머지는 모두 read만 할 수 있습니다. 그 말은 우리가 cgroup blkio 서브시스템을 사용하여 제어할 수 있는 요소들은 write 권한이 있는 파일들을 유심히 보면 될 것 같습니다.

  1. 특정 프로세스들을 high_io와 low_io 그룹에 할당하기. 특정 프로세스의 PID가 각각 10001, 10002 라고 해봅시다.
$ echo 10001 >> /cgroup/blkio/high_io/tasks
$ echo 10002 >> /cgroup/blkio/high_io/tasks

위와 같이 설정하거나 프로세스의 이름이 test 라고 할 때

$pidof test | while read PID; do echo $PID >> /cgroup/blkio/high_io/tasks; done

으로도 설정할 수 있습니다.

  1. high_io 와 low_io에 대해 가중치 비율 설정하기
$ echo 200 > /cgroup/blkio/high_io/blkio.weight
$ echo 100 > /cgroup/blkio/low_io/blkio.weight

2:1 비율로 가중치를 설정하였습니다.

blkio 파일 설명

아래 몇 가지 파일에 대한 내용을 표로 작성해두었습니다. 그 외 다른 파일에 대한 설명은 Documentation을 보시면 좋습니다.

파일 설명
blkio.weight cgroup에 제공되는 장치에 대한 접근 가중치를 적용할 수 있습니다. 상대적인 비율로 100에서 1000까지 설정이 가능하며 설정하지 않을 시 기본 가중치입니다.
blkio.weight_device blkio.weight와 동일하지만 가중치를 적용할 블록 장치를 지정합니다.
blkio.time device 당 cgroup에 할당된 disk time으로 msec 단위입니다. 특정 장치로의 I/O access 시간을 설정할 수 있습니다. 설정을 위해선 디바이스의 major, minor 번호와 msec가 필요합니다.
blkio.io_service_bytes cgroup에 의해 지정된 디바이스에서 송수신한 바이트 수 입니다.
blkio.serviced cgroup에 의해 디바이스에 실행된 I/O 작업의 수 입니다.
blkio.service_time cgroup에 의해 수행된 I/O 작업 요청의 시작부터 완료까지의 총 시간으로 nsec 단위입니다.
blkio.io_wait_time I/O 작업이 지정된 장치에 대해 스케줄러 큐에서 대기한 전체 시간입니다.
blkio.io_merged I/O 작업에 대한 요청으로 병합된 읽기, 쓰기, 동기화 또는 비동기의 수 입니다.

이 외에도 매우 많은 파일들이 존재하는데요. 필요한 내용은 Documentation을 꼭 참고해주세요.

참고자료