Post

Docker없이 컨테이너 만들기 Part3

Docker없이 컨테이너 만들기 Part 3: 자원 제한

아래의 내용은 Kakao 발표자료와 영상을 기반으로 작성했습니다.

들어가며

컨테이너는 논리적으로 잘 격리된 프로세스이다. 여기서는 컨테이너 상태를 만들기 위해 필요한 필요한 프로세스 격리 기술을 하나씩 알아보고 실습을 진행해보고자 한다. 앞선 포스팅에서 디렉터리를 격리하는 방법과 네임스페이스에 대해 이번편에서는 시리즈의 마지막인 자원 할당을 격리하는 방법을 알아본다.

자원제한

Cgroup

cgroup은 프로세스의 자원 사용을 제한하고 격리시키는 기능이다.

image.png

출처: https://speakerdeck.com/kakao/ige-dwaeyo-dokeo-eobsi-keonteineo-mandeulgi?slide=189

💡 cgroups인가? cgroup 인가?
여러 개의 control group을 명시적으로 언급할 때는 복수형인 “cgroups”을 사용한다고 한다.

그리고 앞에 c는 대문자로 쓰이지 않는다고 한다.

(스터디원 분이 용어에 대해 정리해주셨다.)

실습

프로세스 자원 제한을 진행해보자. 그리고 이를 확인하기 위해 부하 관련 패키지를 설치한다.

  • 부하 패키지 설치
1
apt install cgroup-tools stress -y
  • 부하 생성
1
stress -c 1

부하 발생 확인

다른 터미널에서 htop 명령어를 통해 부하를 확인할 수 있다. stree -c 1 명령어로 인해 CPU를 거의 90% 사용하는 것을 확인할 수 있다.

image.png

옵션 추가

  • cgroup이 지원하는 리소스 확인
1
2
root@MyServer:/sys/fs/cgroup/test_cgroup_parent# cat cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc
  • sub control에 cpu 추가
1
2
3
4
5
root@MyServer:/sys/fs/cgroup/test_cgroup_parent# cat cgroup.subtree_control
cpu
root@MyServer:/sys/fs/cgroup/test_cgroup_parent# echo "+cpu" >> /sys/fs/cgroup/test_cgroup_parent/cgroup.subtree_control


  • cpu.max 제한 설정 : 첫 번쨰 값은 허용된 시간(마이크로초) 두 번째 값은 총 기간 길이 > 1/10 실행 설정
1
2
3
4
5
6
7
root@MyServer:/sys/fs/cgroup/test_cgroup_parent# echo 100000 1000000 > /sys/fs/cgroup/test_cgroup_parent/cpu.max
root@MyServer:/sys/fs/cgroup/test_cgroup_parent# mkdir test_cgroup_child && cd test_cgroup_child

root@MyServer:/sys/fs/cgroup/test_cgroup_parent/test_cgroup_child# cat /proc/$$/cgroup
0::/test_cgroup_parent/test_cgroup_child
root@MyServer:/sys/fs/cgroup/test_cgroup_parent/test_cgroup_child# stress -c 1
stress: info: [18875] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

옵션을 주고 나서는 CPU를 많이 작아먹지 못하는 모습이다.

  • CPU 활용량이 지속적으로 6.5%혹은 13.9% 상태를 보인다.

image.png

image.png

Docker 옵션을 이용한 컨테이너 자원 제한

docker update 명령어를 확인해보면, cpu 및 메모리를 제한할 수 있다.

image.png

  • cpu 제한 테스트
1
2
3
4
5
6
7
8
9
docker run -it --rm --name cpu vish/stress -cpus "1"
Unable to find image 'vish/stress:latest' locally
latest: Pulling from vish/stress
2ce2382a5646: Pull complete
Digest: sha256:b6456a3df6db5e063e1783153627947484a3db387be99e49708c70a9a15e7177
Status: Downloaded newer image for vish/stress:latest
I0831 05:44:08.118939       1 main.go:26] Allocating "0" memory, in "4Ki" chunks, with a 1ms sleep between allocations
I0831 05:44:08.119009       1 main.go:39] Spawning a thread to consume CPU
I0831 05:44:08.119023       1 main.go:29] Allocated "0" memory
  • 부하를 거의 100프로 잡아먹는다.

image.png

  • 이제 여러 컨테이너를 실행시키고, 점유를 확인해본다.
    • cpu 점유율은 $\frac{\text{cpu-quota}}{\text{cpu-period}}$ x 100으로 계산된다.
1
2
3
4
5
6
7
8
docker run -d --cpu-period=100000 --cpu-quota=100000 --name cpu1 vish/stress -cpus "1"
docker run -d --cpu-period=100000 --cpu-quota=25000  --name cpu2 vish/stress -cpus "1"
docker run -d --cpu-period=200000 --cpu-quota=25000  --name cpu3 vish/stress -cpus "1"
docker run -d --cpu-period=50000  --cpu-quota=25000  --name cpu4 vish/stress -cpus "1"
105d0b7129dbb5dbb80b7eec5b30180e6612c596e4a9676a983cbc92ae31f44e
1b30b1e45a8b3feb2a106d6d7946dccd9af3dac0be50031302394e002019d7c6
a7e42052522f1752ef6bff51f877351444876834fbb0b55f4f4a9f9fdd0283af
4c61e45e85463a10650a3691282384a9e750e4a05c78dc0ab85e05f181b4f34b

아래의 사진과 같이, cpu-quota/cpu-period 값과 유사하게 점유를 가져간 것을 알 수 있다.

cpu1 ~= 100, cpu2 ~= 25, cpu3 ~= 8, cpu4 ~= 50

image.png

cpu3의 경우 40%이상 차이가 난다. 하지만 그래도 값과 얼추 수렴하는 모습이다.

마치며

이번 시리즈를 통해 컨테이너에 필요한 필요한 프로세스 격리 기술을 자세하게 알아볼 수 있었다. 특히 별도의 컨테이너 엔진없이 리눅스 격리기술을 이용해 실제 컨테이너와 유사한 프로세스를 만들어보는 과정이 꽤 재밌었다.

This post is licensed under CC BY 4.0 by the author.