cgroups는 Control groups의 약자
프로세스들이 자원의 사용할 수 있게 CPU, Memory, Network, Device, I/O을 제한하고, 격리시켜 제공하고있는 리눅스 커널의 기능이다.
★ cgroup memory 제한 하는 방법
cgroup으로 사용할 가상파일시스템을 만든다.
# mkdir -p /dev/cgroup/memory
cgroup으로 사용할 가상파일시스템을 마운트 시킨다.
# mount -t cgroup -o memory memory /dev/cgroup/memory
마운트 여부확인
# mount | grep cgroup OR mount | grep memorty
cgroup memory 마운트 정상 확인
위 그림처럼 나오면 정상으로 마운트 되었다는 것이다.
cgroup을 마운트 하였던 경로(/dev/cgorup/memory) 디렉토리로 이동하면 아래와 같은 파일이 생성되었습니다.
[root@localhost memory]# ls -ltr
-rw-r--r--. 1 root root 0 5월 14 12:23 tasks
-rw-r--r--. 1 root root 0 5월 14 12:23 release_agent
-rw-r--r--. 1 root root 0 5월 14 12:23 notify_on_release
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.use_hierarchy
-r--r--r--. 1 root root 0 5월 14 12:23 memory.usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.swappiness
-r--r--r--. 1 root root 0 5월 14 12:23 memory.stat
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.soft_limit_in_bytes
----------. 1 root root 0 5월 14 12:23 memory.pressure_level
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.oom_control
-r--r--r--. 1 root root 0 5월 14 12:23 memory.numa_stat
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.move_charge_at_immigrate
-r--r--r--. 1 root root 0 5월 14 12:23 memory.memsw.usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.memsw.max_usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.memsw.limit_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.memsw.failcnt
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.max_usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.limit_in_bytes
-r--r--r--. 1 root root 0 5월 14 12:23 memory.kmem.usage_in_bytes
-r--r--r--. 1 root root 0 5월 14 12:23 memory.kmem.tcp.usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.tcp.max_usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.tcp.limit_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.tcp.failcnt
-r--r--r--. 1 root root 0 5월 14 12:23 memory.kmem.slabinfo
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.max_usage_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.limit_in_bytes
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.kmem.failcnt
--w-------. 1 root root 0 5월 14 12:23 memory.force_empty
-rw-r--r--. 1 root root 0 5월 14 12:23 memory.failcnt
-r--r--r--. 1 root root 0 5월 14 12:23 cgroup.sane_behavior
-rw-r--r--. 1 root root 0 5월 14 12:23 cgroup.procs
--w--w--w-. 1 root root 0 5월 14 12:23 cgroup.event_control
-rw-r--r--. 1 root root 0 5월 14 12:23 cgroup.clone_children
여기서 예시로 하나의 프로세스를 memory + swap 메모리 사용량의 제한을 설정해보겠습니다.
/dev/cgroup/memory/에서 하위 디렉토리를 만든다.
# mkdir /dev/cgroup/memory/test_process
-rw-r--r--. 1 root root 0 9월 17 15:56 tasks
-rw-r--r--. 1 root root 0 9월 17 15:56 notify_on_release
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.use_hierarchy
-r--r--r--. 1 root root 0 9월 17 15:56 memory.usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.swappiness
-r--r--r--. 1 root root 0 9월 17 15:56 memory.stat
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.soft_limit_in_bytes
----------. 1 root root 0 9월 17 15:56 memory.pressure_level
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.oom_control
-r--r--r--. 1 root root 0 9월 17 15:56 memory.numa_stat
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.move_charge_at_immigrate
-r--r--r--. 1 root root 0 9월 17 15:56 memory.memsw.usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.memsw.max_usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.memsw.limit_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.memsw.failcnt
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.max_usage_in_bytes
-r--r--r--. 1 root root 0 9월 17 15:56 memory.kmem.usage_in_bytes
-r--r--r--. 1 root root 0 9월 17 15:56 memory.kmem.tcp.usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.tcp.max_usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.tcp.limit_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.tcp.failcnt
-r--r--r--. 1 root root 0 9월 17 15:56 memory.kmem.slabinfo
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.max_usage_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.limit_in_bytes
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.kmem.failcnt
--w-------. 1 root root 0 9월 17 15:56 memory.force_empty
-rw-r--r--. 1 root root 0 9월 17 15:56 memory.failcnt
-rw-r--r--. 1 root root 0 9월 17 15:56 cgroup.procs
--w--w--w-. 1 root root 0 9월 17 15:56 cgroup.event_control
-rw-r--r--. 1 root root 0 9월 17 15:56 cgroup.clone_children
-rw-r--r--. 1 root root 0 9월 17 15:58 memory.limit_in_bytes
조금 전에 /dev/cgroup/memory 디렉토리에 있던 파일들이 똑같이 생긴다.
여기서 메모리 사용량을 2MB로 제한한다.
# echo echo 2000000 > /dev/cgroup/memory/test_process/memory.limit_in_bytes
아래 파일을 열어보면 2MB로 값이 변경되었다.
[root@localhost test_process]# cat memory.limit_in_bytes
1998848
cgroup 적용
메모리 제한 설정을 적용하고 싶은 process pid가 '18001'이라고 할 때 아래 tasks파일에 적용해준다.
echo 18001 >> /dev/cgroup/memory/test_process/tasks
위에 memory.limit_in_bytes 말고도 더 많을 메모리를 제어할 수 있는 파일이 존재한다.
아래 Documentation을 참고하면 더 많은 파일의 내용을 알 수 있습니다.
tasks - 스레드 연결하고, 스레드 목록 표시
cgroup.procs - 프로세스 목록 표시
memory.stat - 다양한 통계(statistics) 표시
memory.limit_in_bytes - 메모리 사용량 제한
memory.kmem.limit_in_bytes - 커널 메모리에 대한 hand limit 설정
참고자료
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
https://sonseungha.tistory.com/537
https://tech.ssut.me/what-even-is-a-container/
https://events.static.linuxfound.org/sites/events/files/slides/cgroup_and_namespaces.pdf
'프로그래밍 공부 > Docker' 카테고리의 다른 글
0. Docker 및 Liunx 목차 (0) | 2019.09.17 |
---|---|
3. Liunx Namespace (0) | 2019.09.13 |
1. LXC(Liunx Containers) 무엇인가? (0) | 2019.09.05 |