SW Engineering/DevOps, SRE

Docker Container 리소스 제한-CPU, Memory, Disk I/O 리소스 사용량 설정

SungWookKang 2019. 3. 27. 07:19
반응형

Docker Container 리소스 제한

-         CPU, Memory, Disk I/O 리소스 사용량 설정

 

·         Version : Docker

 

컨테이너를 생성할 다양한 옵션으로 컨테이너 리소스 사용량을 조절할 있다. 아무런 옵션을 입력하지 않으면 기본적으로 호스트의 모든 리소스를 제한없이 사용할 있게 되어, 여러 컨테이너 실행 리소스 사용의 불균형이 발생할 수도 있다.

 

이번 포스트에서는 시스템 리소스(CPU, MEMORY, Disk I/O) 컨테이너 실행시 설정하거나 이미 운영중인 컨테이너에서 리소스를 수정하는 방법에 대해서 살펴 본다.

 

현재 컨테이너에 설정된 리소스를 확인하는 방법은 docker inspect 명령을 사용한다. docker inspect 많은 항목을 나타내는데 “HostConfig” 항목에서 리소스를 확인할 있다.

docker inspect nginx

 

 

[메모리 제한]

메모리는 m(Megabyte), g(Gigabyte) 단위로 설정 있으며 최소 메모리는 4MB이다. 컨테이너 내부에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되므로 적절한 메모리를 설정해야한다. 아래 스크립트는 컨테이너 실행 메모리를 1 GB 제한한다.

docker run -d –name nginx1g --memory=1g nginx

 

컨테이너가 실행되었으면 해다 컨테이너의 메모리를 확인한다. docker inspect 많은 정보를 나타내므로 grep 명령어를 함께 사용하여 Memory 부분만 표시하였다.

docker inspect nginx1g | grep "Memory"

 

 

컨테이너의 swap메모리는 기본적으로 설정된 메모리의 2배로 설정되지만 별도로 설정할 있다. 아래 스크립트는 swap메모리를 4GB 설정한다.

docker run -d –name nginx1g --memory=1g --memory-swap=4g nginx

 

 

[CPU제한]

컨테이너 CPU 전체 CPU 사용량에서 리소스 할당을 설정한다. , 가상머신의 경우 특정 갯수의 CPU 할당 받지만 컨테이너의 경우 전체 사용량에서 얼마나 사용할지를 결정한다. 또한 CPU 사용하는 다양한 옵션이 있다.

·         --cpu-shares : 기본값은 1024 CPU 할당에서는 1 뜻한다. 2048 설정할 경우 기본 컨테이너보다 2 많은 시간을 할당 받을 있다.

docker run -d –name nginx --cpu-share=2048 nginx

 

·         --cpuset-cpus : 호스트에 여러개의 CPU 있을 컨테이너가 특정 CPU 사용하도록 설정한다. 아래 스크립트는 컨테이너가 3번째 CPU 사용하도록 설정한다.

#3번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=2

 

#1, 4 번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=”0,3”

 

#1,2,3번째 CPU 사용

docker run -d –name nginx --cpuset-cpus=”0-2”

 

 

·         --cpu-period, --cpu-quota : CPU 주기를 설정하며 -period 기본값은 100000이며 100ms 뜻한다, -quota -period 설정된 시간 CPU 스케줄링에 얼마나 할당할 것인지 설정한다. 예를 들어 -period = 100000이고 -quota=25000 할당하면 CPU주기가 ¼ 줄어 일반적인 컨테이너보다 CPU성능이 ¼ 감소한다. 컨테이너는 -period/-quota만큼 CPU 할당을 받는다.

docker run -d --name nginx --cpu-period=100000 --cpu-quota= 100000 nginx

 

·         --cpus : 이전의 --cpu-period, --cpu-quota, --cpu-share 비슷하지만 좀더 직관적으로 CPU사용량을 정의할 있다. 예를 들어 --cpus=0.1이라고 한다면 해당 컨테이너는 전체 CPU 중에 10% 사용한다는 뜻이다.

Docker run -d --name nginx --cpus=0.1 nginx

 

 

[I/O 제한]

컨테이너 생성시 아무런 제한을 하지 않으면 디스크I/O또한 모든 대역폭을 하나의 컨테이너가 사용할 있으므로 상황에 따라 I/O 제한 설정이 필요하다.  사용 형식은 [디바이스이름]:[] 이다.

·         --device-write-bps, --device-read-bps :  초당 읽기, 쓰기를 MB 단위로 설정하여 대역폭 제한한다. 아래 스크립트는 초당 쓰기를 10MB 제한한다.

docker run -it --name nginx --device-write-bps /var/data:10mb nginx

 

 

·         --device-write-iops, --device-read-iops : IO 대한 상대적인 값으로 아래 스크립트는 디스크에 대해 10IOPS 제한한다는 뜻이다.

docker run -it --name nginx --device-write-iops /var/data:10 nginx

 

 

[실행중인 컨테이너 리소스 재설정]

이미 실행중인 컨테이너의 리소스 설정을 변경할 때에는 docker update 명령을 사용한다. 아래 예제는 CPU 사용량을 10% 제한한다.

docker update [리소스 설정] [컨테이너이름]

docker update --cpus=0.1 nginx

 

 

[참고자료]

·         docker run : https://docs.docker.com/engine/reference/commandline/run/

 

 

 

2019-02-06 / Sungwook Kang / http://sqlmvp.kr

 

Docker, 컨테이너 리소스 제한, 도커 자원 할당, 컨테이너 설정, 컨테이너 CPU, 컨테이너 메모리, 컨테이너 I/O

반응형