blkio 서브시스템은 특정 block device에 대한 접근을 제한하거나 제어하기 위한 서브시스템 입니다. 자세한 내용은 ** Documentation/cgroup-v1/blkio-controller.txt ** 를 참고해주세요.
I/O 작업이 많은 몇몇의 어플리케이션이 하나의 서버에서 동작한다고 가정합니다. 각 어플리케이션에 대해 다른 우선순위와 I/O 대역폭을 설정해주는 예제를 살펴보겠습니다.
$ sudo mkdir -p /cgroup/blkio
$ sudo mount -t cgroup -o blkio blkio /cgroup/blkio
$ 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
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 권한이 있는 파일들을 유심히 보면 될 것 같습니다.
$ 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
으로도 설정할 수 있습니다.
$ echo 200 > /cgroup/blkio/high_io/blkio.weight
$ echo 100 > /cgroup/blkio/low_io/blkio.weight
2:1 비율로 가중치를 설정하였습니다.
아래 몇 가지 파일에 대한 내용을 표로 작성해두었습니다. 그 외 다른 파일에 대한 설명은 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을 꼭 참고해주세요.