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 |