- 하드웨어 리소스 : DISK, CPU, RAM
- 기본적으로 컨테이너는 호스트 하드웨어 리소스 사용 제한을 받지 않음
- 컨테이너 리소스 제한 하기
- 특정 컨테이너의 무분별한 리소스 사용을 방지하기 위함. -> 사용량을 적절하게 분배.
- docker run을 통해 동작 될 컨테이너에 제한을 설정할 수 있음.
- docker command를 통해 제한할 수 있는 리소스
1) Memory 리소스 제한
- 제한 단위는 b,k,m,g 로 할당
- 옵션
--memory, -m => 컨테이너가 사용할 최대 메모리 양을 지정.
--memory-swap => 컨테이너가 사용할 스왑 메모리 영역에 대한 설정. (메모리 + 스왑, 생략 시 메모리의 2배가 스왑 값으로 설정 됨)
--memory-reservation => --memory 값보다 적은 값으로 구성하는 소프트 제한 값을 설정.
--oom-kill-disable => OOM Killer가 프로세스 kill 하지 못하도록 보호.
ex)
docker run -d -m 512m nginx => nginx 컨테이너 내부에서 최대로 사용할 수 있는 메모리의 양을 512M 로 제한함. (초과 시 컨테이너 스스로 kill 됨)
docker run -d -m 1g --memory-reservation 500m nginx => nginx 컨테이너 내부에서 최대로 사용할 수 있는 메모리의 양을 1g 로 제한, 최소 500M 사용은 보장받음. (500m ~ 1g)
docker run -d -m -m 200m --memory-swap 300m nginx => 총 300M에서 최대 메모리양 200M + 스왑 메모리 100M 을 의미함. (만약 명령어에서 스왑 메모리를 200M으로 지정하면, 스왑메모리는 0M 임)
docker run -d -m -m 200m --oom-kill-disable nginx => 실제 Physical 메모리가 부족하더라도 해당 컨테이너는 oom-kill 되지 않도록 함.
스왑 메모리란?
어플리케이션의 RAM 용량이 차면, swap 메모리가 자동으로 늘어난다.
하드 디스크의 일부를 RAM처럼 사용할 수 있게 만드는 방법으로 하드디스크의 공간을 활용하여 작업을 서포트한다.
하드디스크의 디스크 공간을 swap 메모리로 사용하기 때문에 속도가 느려진다. (RAM보다는 느리고, 하드보다는 빠름)
기본적으로 swap 메모리는 RAM의 2배 정도를 잡는것을 권장한다.
특히 DB 를 자주 사용하는 경우는 swap 이 많이 활용된다.
OOM killer?
Out Of Memory Killer의 축약.
리눅스 커널이 가지고 있는 기능으로 Physical한 메모리가 부족할 경우 특정 프로세스를 강제로 종료시키기 시작함.
2) CPU 리소스 제한
- 옵션
--cpus => 컨테이너에 할당할 CPU core 수를 지정함. ex) --cpus="1.5" => 컨테이너가 최대 1.5개의 CPU 파워를 사용할 수 있음.
--cpuset-cpus => 컨테이너가 사용할 수 있는 CPU나 코어를 할당함. (*cpu index는 0부터 시작함) => --cpuset-cpus=0-3
--cpu-shares => 모든 컨테이너가 사용하는 CPU의 비중은 기본값 1024 으로 설정됨. ex) --cpu-shares 2048 => 기본 값보다 두배 많은 CPU 자원을 할당함.
ex)
docker run -d --cpus=".5" ubuntu => ubuntu 컨테이너에 최대 cpu 사용량을 0.5개로 제한함. (core는 랜덤 할당됨)
docker run -d --cpu-shares 2048 ubuntu => ubuntu 컨테이너가 다른 컨테이너와 다르게 cpu 리소스를 2048 만큼 할당함.
docker run -d --cpuset-cpus 0-3 ubuntu => ubuntu 컨테이너가 사용할 코어를 설정함. (core 0-3을 사용, 해당 범위에서 동작하도록 제한)
3) Block I/O 리소스 제한
- 컨테이너 내부에서 파일을 읽고 쓰는 대역폭의 제한 설정.
- Direct I/O에서만 입출력이 제한되며 Buffered I/O는 제한되지 않음
* 참고
( Direct I/O: 운영체제의 버퍼를 거치지 않고 직접 IO를 실행 )
( Buffered I/O: 버퍼에 저장된 데이터를 I/O를 실행 )
- 옵션
--blkio-weight => Block IO의 Quota를 설정할 수 있으며, 100 ~ 1000 까지 선택함. (기본값은 500)
--blkio-weight-device 특정 device에 weight 을 할당
--device-read-bps, --device-write-bps => 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정함.
--device-read-iops, --device-write-iops => 컨테이너의 읽기/쓰기 속도의 쿼터를 설정함. 초당 쿼터를 제한하여 I/O를 발생시킴. 0 이상의 정수로 표기함. 초당 데이터 전송량 = IOPS * 블록크기 (단위 데이터 용량)
ex)
docker run -it --rm --blkio-weight 100 ubuntu /bin/bash => ubuntu 컨테이너에 Block I/O의 쿼터는 100으로 설정함.
docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu /bin/bash => ubuntu 컨테이너의 /dev/vda 에 write 할 때는 초당 1mb로 제한함.
docker run -it --rm --device-write-iops /dev/vda:10 ubuntu /bin/bash => ubuntu 컨테이너의 /dev/vda 에 write 할 때는 초당 100 만큼의 쿼터를 제한함.
docker monitoring commands
- docker stat : 실행중인 컨테이너의 런타임 통계 확인함.
- docker event : 도커 호스트의 실시간 event 정보를 수집해서 출력함. (컨네이너, 이미지, 볼륨, 네트워크 관련된 이벤트, 도커가 내부적으로 만들어내는 메세지를 출력)
- cAdvisor : 구글에서 만들 도커 모니터링 툴.