rueki
도커 컨테이너 리소스 관리 본문
여러 컨테이너가 동작 중일 때, 컨테이너 필요한 만큼의 리소스만 할당을 해야 서로 잘 동작할 것이다.
Docker 명령어로 하드웨서 리소스를 관리할 수 있다. (Cpu, 메모리 등등..)
* 메모리 리소스 제한
--memory, -m
: 컨테이너가 사용할 최대 메모리 양을 지정
docker run -d -m 512m "컨테이너:태그"
--memory-reservation
: 선언안 메모리 값보다 적은 값으로 구성하는 소프트 제한 값을 설정한다.
docker run -d -m 1g --memory-reservation 500m "컨테이너:태그"
최소 500은 보장해준다는 의미
--memory-swap
: 컨테이너가 사용할 스왑 메모리 영역 설정
swap 사이즈는 기존 메모리 사이즈 포함되어 있음
docker run -d -m 200m --memory-swap 300m "컨테이너:태그"
실질적으로 swap되는 것은 300-200 = 100 이다.
--oom-kill-disable
: OOM killer가 프로세스 kill 하지 못 하도록 보호
메모리가 부족해도 죽지 않게 됨
docker run -d -m 200m --oom-kill-disable "컨테이너:태그"
* 메모리 리소스 제한 실습
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
100메가의 메모리를 할당하고 바이트 전송에 5초동안 90메가를 할당시켰다면 이는 동작할까?

메모리 부하가 일어나지 않고 동작한다.
그러나 만약 90대신 150m를 사용하게 된다면?

할당한 것보다 많이 요구를 하면 부하가 걸려 죽게 된다.
이제 oom kill 되는 것을 방지해보자.
docker run -d -m 100M --name m4 --oom-kill-disable=true nginx
inspect 명령어를 통해서 컨테이너 세부정보를 아래와 같이 볼 수 있는데
OomKillDisable이 true로 되있는 것을 확인 할 수가 있었다.

cat /sys/fs/cgroup/memory/docker/6e97d951442f1f93ba985a89191feaa357bd518932a99f668e2e2ab0f5bc5ad5/memory.oom_control

* CPU 리소스 제한
--cpus
: 컨테이너에 할당할 cpu 코어 수 지정
docker run -d --cpus="1" "이미지:태그"
cpu 1개만 할당하게 된다.
--cpu-share
: 컨테이너가 사용하는 cpu 비중을 1024 값을 기반으로 설정
docker run -d --cpu-share 2048 "이미지:태그"
위의 명령어를 사용하게 되면 다른 컨테이너에 비해 2배를 할당받게 된다.
--cpuset-cpus
: 컨테이너가 사용할 수 있는 cpu나 코어를 할당 (index 0 ~3)
docker run -d --cpuset-cpus 0-3 "이미지:태그"
cpu 0~3번 모두 할당한다.
* CPU 제한 실습
docker run --cpuset-cpus 1 --name c1 -d stress:latest stress --cpu 1
--cpuset-cpus 통해서 원하는 cpu를 할당할 수 있었으며,
만든 stress 컨테이너가 cpu 1번만 할당된 것을 확인할 수가 있다. (htop 명령어 사용)

docker stats를 사용하면 컨테이너에 할당된 resource를 자세히 볼 수가 있다.
예제
200m, swap 300m
cpu는 1번 할당하는 mysql 컨테이너 실행하기
docker run -d -m 200M --memory-swap 300M --cpuset-cpus 1 --name db -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql:latest
* Blcok I/O 제한
--blkio-weight, --blkio-weight-device
: Block IO의 Quota 설정, 100~1000까지 선택 가능, default 500
docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash
--device-read-bps, --device-write-bps
: 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 걸어둔다.
docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash
--device-read-iops, --device-write-iops
: 컨테이너의 read/write 속도의 쿼터를 설정
초당 quota를 제한해서 I/O를 발생시킨다.
초당 데이터 전송량 : IOPS * 블럭크기
* 컨테이너 리소스 모니터링
docker stat : 사용중인 컨테이너의 런타임 통계를 확인
docker event : 도커 호스트의 실시간 이벤트 정보를 수집해서 출력
docker events -f container=""
docker image -f container=""
* cAdvisor 사용해보기
https://github.com/google/cadvisor
GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.
Analyzes resource usage and performance characteristics of running containers. - GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.
github.com
VERSION=v0.36.0 # use the latest release version from https://github.com/google/cadvisor/releases
sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:$VERSION
그대로 입력하고 8080포트로 접속하니 아래와 같은 화면이 뜬다.

컨테이너에 대한 resource를 확인하려면 docker containers를 누르고 들어가면 된다.
'쿠버네티스, 도커' 카테고리의 다른 글
도커 컨테이너 Storage (0) | 2021.11.19 |
---|---|
Kubernetes namespace (0) | 2021.11.19 |
도커 컨테이너 실행, 관리 명령어 (0) | 2021.11.17 |
Docker repository 운영하기 (0) | 2021.11.17 |
도커 컨테이너 만들어보기 (0) | 2021.11.17 |