cgroups (Control Groups)
cgroups(Control Groups)는 자원(resources)에 대한 제어를 가능하게 해주는 리눅스 커널의 기능입니다. cgroups는 다음 리소스를 제어할 수 있습니다:
- 메모리
- CPU
- I/O
- 네트워크
- device 노드(
/dev/
)
실행중인 프로그램의 메모리를 제한해볼까요? 일단 "ssut" 유저가 소유하고 메모리를 제어할 testgrp
를 생성해봅시다.
ssut@ssut:~$ sudo cgcreate -a ssut -g memory:testgrp
ssut@ssut:~$ ls -alh /sys/fs/cgroup/memory/testgrp
합계 0
drwxr-xr-x 2 ssut root 0 8월 8 23:19 .
dr-xr-xr-x 8 root root 0 7월 7 15:30 ..
-rw-r--r-- 1 ssut root 0 8월 8 23:19 cgroup.clone_children
--w--w--w- 1 ssut root 0 8월 8 23:19 cgroup.event_control
-rw-r--r-- 1 ssut root 0 8월 8 23:19 cgroup.procs
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.failcnt
--w------- 1 ssut root 0 8월 8 23:19 memory.force_empty
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.failcnt
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.limit_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.max_usage_in_bytes
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.slabinfo
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.tcp.failcnt
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.tcp.limit_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.tcp.max_usage_in_bytes
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.tcp.usage_in_bytes
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.kmem.usage_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.limit_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.max_usage_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.move_charge_at_immigrate
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.numa_stat
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.oom_control
---------- 1 ssut root 0 8월 8 23:19 memory.pressure_level
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.soft_limit_in_bytes
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.stat
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.swappiness
-r--r--r-- 1 ssut root 0 8월 8 23:19 memory.usage_in_bytes
-rw-r--r-- 1 ssut root 0 8월 8 23:19 memory.use_hierarchy
-rw-r--r-- 1 ssut root 0 8월 8 23:19 notify_on_release
-rw-r--r-- 1 root root 0 8월 8 23:19 tasks
/sys/fs/cgroup/*/groupname
경로에 있는 파일을 통해 그룹의 여러 옵션을 변경할 수 있습니다. 최대 메모리 사용량을 2MB로 제한해볼까요? memory.kmem.limit_in_bytes
파일을 다음 명령어로 수정해줍시다:
ssut@ssut:~$ echo 2000000 > /sys/fs/cgroup/memory/testgrp/memory.kmem.lim
이제 우리가 생성한 cgroup에서 bash 셸을 실행시켜 메모리 제한이 잘 먹히나 확인해봅시다:
ssut@ssut:~$ sudo cgexec -g memory:testgrp bash
root@ssut:~# top
top: error while loading shared libraries: libgpg-error.so.0: failed to ma
메모리 제한이 잘 되는 것을 확인할 수 있습니다. 이를 통해 container에서는 VM에서와 동일하게 리소스 할당량을 제한할 수 있게 됩니다.
LXC, LibContainer, runC 등은 위에서 설명한 cgroups, namespaces를 표준으로 정의해둔 OCI(Open Container Initative) 스펙을 구현한 컨테이너 기술의 구현체입니다. LXC는 캐노니컬(Canonical)이 지원하고 있는 리눅스 컨테이너 프로젝트로 Docker의 경우 1.8 이전 버전까지 LXC를 이용해 구현해서 사용했었습니다. 이후에 Docker는 libcontainer -> runC (libcontainer의 리팩토링 구현체)로 자체 구현체를 갖게 되었습니다.
0 Comments