Docker Container 리소스 할당

category DevOps/Docker 2023. 7. 27. 00:03
728x90
반응형

개요

Container는 Host의 리소스 사용 제한을 받지 않는다. 그러므로 사용 제한이 없으면 호스트 리소스를 마음대로 갖다 쓸 수 있다는 이야기이다.

제한 방법

RAM

옵션 설명
--memory, -m 컨테이너 사용할 최대 메모리 양을 지정한다. 512m 이런식으로 할당이 가능하다.
--memory-swap 컨테이너가 swap할 사용 메모리 영역에 대한 설정이다.
memory + swap으로 반드시 메모리가 포함된 값으로 설정해야한다.
(예) memory가 200m, swap이 100m이라면 300m으로 설정해야한다.)
생략시는 memory의 2배로 설정된다. 
--memory-reservation --memory 작은 값으로 구성해야되며 이 값까지는 soft 제한을 하겠다는 뜻
--oom-kill-disable 운영체제가 oom (out of memory) kill을 하지 못하도록 하는 옵션

CPU

옵션 설명
--cpus 컨테이너가 할당할 CPU core 개수를 설정함
--cpus=0.5 이런식으로도 할당이 가능하다.
--cpuset-cpus 컨테이너가 사용할 코어 번호를 할당한다.
범위로 설정시는 - 하이픈을 넣어서 0-4 이런식으로 가능하다.
--cpuset-cpus=0-4
--cpu-share 컨테이너는 사용하는 cpu 비중을 설정한다.
기본적으로 1024이며 --cpu-share=2048로 설정이 가능하다.

Block I/O

옵션 설명
--blkio-weight
--blkio-weight-device
Block IO Quota를 설정할 수 있으며 100~1000까지 설정이 가능하다.
기본값은 500이다.
--device-read-bps
--device-write-bps
특정 디바이스에 대한 쓰기, 작업의 초당 제한을 kb, mb, gb 단위로 할당할 수 있다.
--device-read-iops
--device-write-iops
컨테이너 read/write 속도의 쿼터를 설정한다.
초당 quota를 제한해서 I/O를 발생시키며 0이상의 정수로 표기
초당 데이터 전송량 = IOPS x 블럭크기

 

이제 테스를 해보자

목표

docker에 자원을 할당하는 방법을 실험하고자하며 stress Docker 이미지를 사용하여 실제로 리소스를 점유하고 있는지 확인해보자.

 

시나리오

메모리 관점

  • memory와 memory-swap이랑 동일한 사이즈를 설정하여 killed 되는 것을 확인한다.
  • memory-swap을 memory보다 조금 더 높은 사이즈를 설정하여 정상 동작을 확인한다.


CPU 관점

  • cpu core 번호를 지정하고 100%를 주어 htop으로 점유율을 확인한다.
  • -c <옵션>를 설정하여 사용량을 확인한다. --cpu-share 옵션은 CPU 리소스를 컨테이너에 할당하는 방법 중 하나이다. 이 옵션을 사용하여 컨테이너가 호스트 시스템의 CPU 시간을 상대적으로 얼마나 할당받을지를 설정할 수 있다.

 

테스트

사전 준비

Dockerfile을 빌드하자.

$ vi Dockerfile 
FROM ubuntu
RUN apt-get update; apt-get install stress -y
CMD ["/bin/sh", "-c", "stree -c 2"]

$ docker build -t stress .
...
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
 ---> 5a81c4b8502e
Step 2/3 : RUN apt-get update; apt-get install stress -y
 ---> Running in 856edfc7f019
...

 

메모리 관점

memory와 memory-swap를 동일한 사이즈를 설정하고 더 많은 메모리 크기 120m를 발생 시키면 process가 killed이 되는 것을 알 수 있다.

$ docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 120m -t 5s

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (416) <-- worker 7 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s

memory-swap을 memory보다 조금 더 큰 사이즈를 주고 똑같은 메모리 크기 120m를 발생시키면 정상동작 확인하는 것을 알 수 있다.

$ docker run -m 100m --memory-swap 150m stress:latest stress --vm 1 --vm-bytes 120m -t 5s

stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: info: [1] successful run completed in 5s

 

위의 실험으로부터는 memory-swap은 memory 포함으로 설정을 해야된다는것을 알 수 있다.

 

 

CPU 관점

cpu 1번에 (htop에서는 2번으로 표시됨. 인덱스 관점에서는 1번) 설정하고 부하를 발생시켜본다.

$ docker run --cpuset-cpus 1 --name c1 -d stress:latest stress --cpu 1
cb1f9542a3324b404ccf3fd56c564349e6747585ac0da5b06afa408b405ba3a2

2번째가 100% 차는 것을 확인할 수 있다.

  1  [|                                                                                                  0.7%]   Tasks: 31, 46 thr; 2 running
  2  [|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||100.0%]   Load average: 0.98 0.54 0.25 
  3  [                                                                                                   0.0%]   Uptime: 10:48:53
  Mem[||||||||||||||||||||                                                                         529M/7.45G]
  Swp[|                                                                                           29.2M/4.94G]

 

이번에는 다음과 같이 생성하여 상대적으로 c1부터 2배/1배/0.5배/0.5배씩 생성해보자

$ docker run -c 2048 --name c1 -d stress:latest
$ docker run --name c2 -d stress:latest
$ docker run -c 512 --name c3 -d stress:latest
$ docker run -c 512 --name c4 -d stress:latest

다음과 같이 CPU 통계를 확인해보면 아래와 같이 사용량을 볼 수 있다.

$ docker stats

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
62158a684efa   c4        39.14%    268KiB / 7.452GiB   0.00%     656B / 0B   0B / 0B     4
08558d725fcf   c3        35.40%    280KiB / 7.452GiB   0.00%     656B / 0B   0B / 0B     4
ede3e48f27a6   c2        68.70%    276KiB / 7.452GiB   0.00%     656B / 0B   0B / 0B     4
9ce05f293d13   c1        136.21%   264KiB / 7.452GiB   0.00%     656B / 0B   0B / 0B     4
728x90
반응형

'DevOps > Docker' 카테고리의 다른 글

VirtualBox에 Docker 환경 구성  (0) 2022.05.11
Window 10 Home Hyper-V 활성화 방법  (0) 2022.05.10