본문 바로가기

Linux/Container

[cgroup] blkio

Cgroup (Control Group)

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을 꼭 참고해주세요.

참고자료

'Linux > Container' 카테고리의 다른 글

[cgroup] memory  (0) 2019.08.11
[cgroup] blkio  (0) 2019.08.11
[cgroup] 1. cgroup 이란?  (0) 2019.08.06
6. UTS namespace  (0) 2019.08.05
5. Mount namespace  (0) 2019.08.05
[QEMU] Introduction  (0) 2019.07.01