본문 바로가기
개발/개발공부

cgroups / 컨테이너 기초, 프로세스 제어, 자원 제한

by 치킨개발자 2023. 1. 3.
728x90

Container는 보통 리눅스의 프로세스로 실행이 된다.

한 프로세스가 다른 프로세스들에게 영향을 끼치면 안되기 때문에 cgroup을 통해서 제한을 할 수 있다.

 

cgroup 제어그룹, 구조


리눅스 커널은 보통 /sys/fs/cgroup에서 위계구조를 갖고 있음

/sys/fs/cgroup$ ls
blkio    cpu,cpuacct    freezer    memory...

memory쪽을 자세히 보면

/sys/fs/cgroup$ ls memory/
cgroup.clone_children               memory.memsw.limit_in_bytes
cgroup.event_control                memory.memsw.max_usage_in_bytes
cgroup.procs                        memory.memsw.usage_in_bytes
cgroup.sane_behavior                memory.move_charge_at_immigrate
kubepods.slice                      memory.numa_stat
memory.failcnt                      memory.oom_control
...

다양한 제어그룹이 있는데 tcp버퍼의 사이즈, 커널관련된 제어그룹 등등 다양

파일 이름이 명확하여 이해하기 쉬움

모든 프로세스의 정보를 담고있는 상태이고, 제어그룹을 따로 생성하여 그룹에 배정해야함

/sys/fs/cgroup/memory/dev-chicken# ls
cgroup.clone_children               memory.memsw.failcnt
cgroup.event_control                memory.memsw.limit_in_bytes
cgroup.procs                        memory.memsw.max_usage_in_bytes
memory.failcnt                      memory.memsw.usage_in_bytes
memory.force_empty                  memory.move_charge_at_immigrate
memory.kmem.failcnt                 memory.numa_stat
memory.kmem.limit_in_bytes          memory.oom_control
...

이렇게 원하는 자원의 하위에 디렉토리를 만들면 자동으로 채워줌

이 안에서 컨테이너를 위한 제어정보를 저장하는데, 예를들어 memory.usage_in_bytes는 현재 메모리 사용량을 담고 있음

제어하는 것이 목적이기 때문에 한계도 설정할 수 있는데, memory.limit_in_bytes를 보면 확인 가능

 

process 배정


제어그룹의 특정 파일에 프로세스 ID를 추가하면 해당 프로세스가 제어그룹에 설정이 됨

앞서 설명한 것들과 합쳐 차례대로 설명하면

 

1. 원하는 자원의 위치에서 하위 디렉토리를 생성

2. 사용할 프로세스에 원하는 limit값을 설정

3. 프로세스ID를 제어 그룹의 cgroup.procs파일에 추가

/sys/fs/cgroup/memory/dev-chicken# echo {process_id} > cgroup.procs

이렇게 하면 원하는 프로세스의 자원을 제한하게 됨

 

cgroup version1 vs version2


cgroup version 1 version2
Simplicity 하나의 프로세스를 자원별 그룹에 배정하다 보니 복잡할 수 있음 자원이 아닌 cgroup자체의 제어그룹에 배정하여 좀 더 simple한 그룹화가 가능함
Rootless Containers 지원이 빈약 지원이 조금 더 잘 되어있음
Runtime Support 새로운 Container표준에 잘 맞지 않음 새로운 Container표준에 좀 더 가까움

대부분 version2에서 개선이 많이 진행되었고 설명이 부족한 Rootless Containers, Runtime Support를 보면,

Rootless Containers는 보안상 좀 더 유리하기 때문에 version2에서 좀 더 이점이 있는 것

추가로 Runtime Suppport는 보면 kubernetes에서 Docker가 이제 deprecated되는데 해당 변화점에 대해서는 version2가 더 잘 지원해주는 것으로 보면 될 것 같음

세부 비교 참고글

 

Linux cgroups v2 Brings Rootless Containers, Superior Memory Management

Containers and container management tools have a lot of moving parts. Although you could very quickly deploy a single Docker

thenewstack.io

 

반응형

댓글