8장. 컨테이너 자원 제한

기운찬곰·2020년 9월 5일
0

Docker

목록 보기
8/13
post-thumbnail

시작하기에 앞서서...

이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)


컨테이너 자원 할당 제한

컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 입력할 수 있습니다. 아무런 옵션을 입력하지 않으면 호스트의 자원을 제한 없이 사용할 수 있습니다. 하지만 모든 자원을 사용하게 된다면 호스트에 영향을 끼칠 뿐더러 다른 컨테이너에도 영향을 끼치게 됩니다.

자원 제한 확인하기

현재 컨테이너에 설정된 자원 제한을 확인하는 방법은 docker inspect입니다.

$ docker inspect 컨테이너_이름(id)


메모리 자원제한

docker run 명령어에 --memory를 사용하여 컨테이너의 메모리를 제한할 수 있습니다. 아래와 같은 명령어 실행 시 1g의 용량을 가진 컨테이너를 제작합니다.

$ docker run -d --memory="1g" --name memory_1g nginx

잘 제한 되었는지 확인해봅니다.

$ docker inspect memory_1g | grep "Memory"

이렇게 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되므로 애플리케이션에 따라 적절히 할당해주는게 좋습니다.


cpu 제한

--cpu-shares

컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지 설정할 수 있습니다. cpu 코어의 개수를 할당하는 것이 아닌 시스템에 존재하는 CPU를 어느 비중만큼 나눠 쓸 것인지 명시하는 옵션입니다.

$ docker run -it --name cpu_1024 --cpu-shares 1024 ubuntu:18.04

--cpu-shares 옵션은 상대적인 값을 가집니다. 아무런 설정을 하지 않았을 때 설정 값은 1024로 이는 할당량 1을 뜻합니다.


테스트를 해보려면 생성된 컨테이너 안에서 아래와 같이 stress 를 설치한 다음 실행시킵니다. 코어 수를 1로 지정하면 정확하게 그 코어는 100% 잡아먹습니다.

$ apt-get update
$ apt-get install stress
$ stress --cpu <코어수>

호스트에서 확인해볼 수 있습니다. 현재는 생성된 컨테이너가 하나뿐이 없기 때문에 거의 100%를 잡아먹는 것을 확인할 수 있습니다.

$ ps aux | grep stress

테스트를 위해 이번에는 512만큼 할당받는 컨테이너를 하나 더 생성한 다음 stress를 줘봅니다.

$ docker run -it --name cpu_512 --cpu-shares 512 ubuntu:18.04

결과적으로 대략 1:2만큼 cpu를 나눠서 사용하고 있는 것을 알 수 있습니다.


--cpuset-cpu

호스트에 CPU가 여러 개 있을 때 --cpuset--cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용하도록 설정 할 수 있습니다. AWS EC2 인스턴스 제가 쓰고 있는거는 cpu가 한개이기 때문에 테스트를 못하겠네요..

참고로, htop 도구를 쓰면 cpu나 메모리 사용량을 파악할 수 있습니다.


--cpu-period, --cpu-quota

cpu-period는 한 컨테이너에 일반적으로 100ms 할당되지만 --cpu-period를 통해 변경할 수 있습니다. 그리고 --cpu-quota를 통해 할당된 100ms동안 얼마나 cpu를 할당할지 결정할 수 있습니다.

$ docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000
ubuntu:18.04

위에처럼 생성된 컨테이너는 기존 100000에서 25000으로 줄었기 때문에 cpu성능이 1/4로 감소합니다. 즉 컨테이너는 cpu-quota / cpu-period 값으로 cpu시간을 할당 받습니다.


--cpus

--cpus는 --cpu-quota, --cpu-period와 동일한 기능을 하지만 좀 더 직관적으로 cpu의 개수를 직접 지정할 수 있습니다. 예를들어, 0.5는 cpu-quota와 cpu-period의 비율을 0.5로 설정하는 의미입니다. 그래서 여기에는 50000(quota)/100000(period)와 같은 뜻입니다.

Block I/O 제한

컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면 내부에서 파일을 읽고 쓰는 대역폭에 제한이 설정되지 않습니다. 하나의 컨테이너가 너무 많은 입출력을 독점하여 사용하지 않게 하기 위해서는 --device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops옵션을 지정해 블록 입출력을 제한할 수 있습니다. 단 Direct I/O에서만 입출력이 제한되며 Buffered I/O는 제한되지 않습니다.

구체적인 방법은 책을 참고!!

마침

이번시간에는 도커 컨테이너 자원 할당 제한하는 방법에 대해 알아봤습니다. 다음시간에는 도커 이미지에 대해 자세히 배워보도록 하겠습니다.

profile
배움을 좋아합니다. 새로운 것을 좋아합니다.

0개의 댓글