Docker Container 리소스 제한-CPU, Memory, Disk I/O 리소스 사용량 설정
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