이 포스팅은 위키북스의 시작하세요! 도커/쿠버네티스 를 보고 공부한 내용을 바탕으로 하고 있습니다. (문제가 된다면 비공개 처리하겠습니다😂😂)
컨테이너를 생성하는 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 코어의 개수를 할당하는 것이 아닌 시스템에 존재하는 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를 나눠서 사용하고 있는 것을 알 수 있습니다.
호스트에 CPU가 여러 개 있을 때 --cpuset--cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용하도록 설정
할 수 있습니다. AWS EC2 인스턴스 제가 쓰고 있는거는 cpu가 한개이기 때문에 테스트를 못하겠네요..
참고로, htop 도구
를 쓰면 cpu나 메모리 사용량을 파악할 수 있습니다.
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는 --cpu-quota, --cpu-period와 동일한 기능을 하지만 좀 더 직관적으로 cpu의 개수를 직접 지정할 수 있습니다. 예를들어, 0.5는 cpu-quota와 cpu-period의 비율을 0.5로 설정하는 의미입니다. 그래서 여기에는 50000(quota)/100000(period)와 같은 뜻입니다.
컨테이너를 생성할 때 아무런 옵션도 설정하지 않으면 내부에서 파일을 읽고 쓰는 대역폭에 제한
이 설정되지 않습니다. 하나의 컨테이너가 너무 많은 입출력을 독점하여 사용하지 않게 하기 위해서는 --device-write-bps, --device-read-bps, --device-write-iops, --device-read-iops옵션을 지정해 블록 입출력을 제한할 수 있습니다. 단 Direct I/O에서만 입출력이 제한되며 Buffered I/O는 제한되지 않습니다.
구체적인 방법은 책을 참고!!
이번시간에는 도커 컨테이너 자원 할당 제한하는 방법에 대해 알아봤습니다. 다음시간에는 도커 이미지에 대해 자세히 배워보도록 하겠습니다.