Search
Duplicate
📒

[Docker Container] 06. Docker Container 모니터링과 자원 할당 관리

상태
미진행
수업
Docker Container
주제
Docker
4 more properties
참고

컨테이너 리소스 모니터링을 위한 cadvisor

NOTE
cadvisor ⇒ 구글에서 제공하는 오픈 소스 컨테이너 모니터링 도구
다음과 같은 구조로 보통 모니터링을 진행한다.
docker run \ --restart=always \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=9559:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:latest
Bash
복사
cadvisor 실행

컨테이너 리소스 제한(resource limit)

NOTE
컨테이너는 기본 설정으로 리소스 자원(CPU, Memory, IO)을 제한 없이 사용한다!
자원 소비 제한을 하지 않으면 상대적으로 다른 컨테이너의 자원 사용에 제한을 주어 전반적인 성능에 영향을 줄 수 있다.
도커는 명령어를 통해 CPU, Memory, Disk I/O에 대한 리소스를 제한할 수 있다.

CPU 자원소비 제어

NOTE
CPU 제어방법 ⇒ CPU 가중치, CPU 코어 설정등으로 제어가 가능하다!
대표적인 명령어들

CPU 가중치 설정

docker run -d --name cpu_1024 --cpu-shares 1024 \ leecloudo/stress:1.0 stress --cpu 4 docker run -d --name cpu_512 --cpu-shares 512 \ leecloudo/stress:1.0 stress --cpu 4
Bash
복사
CPU 가중치 테스트, CPU4개 할당
4개의 CPU가 stree로 인해 과부화 걸리는중

CPU 코어 선택

# 2번 CPU를 갈궈라 docker run -d --name cpuset_1 --cpuset-cpus=2 \ leecloudo/stress:1.0 stress --cpu 1 # 0, 3번 CPU를 존나 써라 docker run -d --name cpuset_2 --cpuset-cpus=0,3 \ leecloudo/stress:1.0 stress --cpu 2 docker stop cpuset_1 docker rm cpuset_1
Bash
복사
--cpuset-cpus ⇒ Host가 보유한 CPU 수에서 몇번째를 사용할 것인지 지정
2번을 겁나 쓰는중
docker run -d --name cpuset_1 --cpuset-cpus=2 \ leecloudo/stress:1.0 stress --cpu 1 # cpu 사용량 제한 20% # 단 cpu가 여러개인경우 합쳐서 20% docker update --cpus=0.2 cpuset_1
Bash
복사
2번 CPU의 사용량이 20%로 제한된 상황

메모리 자원 소비 제어

NOTE
메모리 제어방법 ⇒ 최대 메모리 제한, 스왑 메모리 설정등으로 제어가 가능하다!
메모리와 스왑 메모리 확인

최대 메모리 제한

docker run -d --memory=1g --name=nginx_mem_1g nginx docker inspect nginx_mem_1g | grep -i memory
Bash
복사
최대 메모리 1000
메모리 1GB, 스왑 메모리 2GB(설정 안하면 자동으로 2배먹음)

최대 메모리 + 스왑 메모리

docker run -m=200m --memory-swap=300m -itd --name=mem-test ubuntu:14.04 docker inspect mem-test | grep -i memory
Bash
복사
최대 메모리 200, 메모리 스왑 300 ⇒ 사실상 100의 여유를 가짐

메모리 트러블 슈팅

docker run -itd --memory=6m --name=mydb -e MYSQL_ROOT_PASSWORD=pass123# mysql:5.7-debian docker ps -a | grep mydb docker logs mydb docker update --memory=300m --memory-swap=600m mydb
Bash
복사
mysql의 경우 최소 200m이 필요한데 초기에 6으로 설정하고 이후 업데이트하는 과정
# 메모리 200, 스왑 200 , 과부하 250 (메모리 과부하) docker run -it --rm \ --memory=200m \ --memory-swap=200m \ leecloudo/stress:1.0 stress \ --vm 1 --vm-bytes 250m -t 10s # 메모리 200, 스왑 200, 과부하 150 (정상) docker run -it --rm --memory=200m \ --memory-swap=200m leecloudo/stress:1.0 stress \ --vm 1 --vm-bytes 150m -t 10s
Bash
복사
메모리 과부하 테스트
메모리 과부하로 인해 컨테이너 내려감
정상적으로 과부하 테스트 성공

디스크 자원 관리

NOTE
DIS I/O 제어방법 ⇒ BPS, IOPS 제한 설정등으로 제어가 가능하다!
BPS (Bytes Per Second) ⇒ 초당 전송되는 바이트 수 IOPS (Input/Output Operations Per Second) ⇒ 초당 수행되는 입출력 작업의
sudo apt install sysstat iostat 2 1000 # 2초마다 1000번 디스크 정보 출력
Bash
복사
Disk I/O 측정 도구 (iostat)

BPS 제한

# 제한없음 docker run -it --rm ubuntu:14.04 bash dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct # 제한 1MB docker run -it --rm --device-write-bps /dev/sdb:1mb ubuntu:14.04 bash dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct # 제한 10MB docker run -it --rm --device-write-bps /dev/sdb:10mb ubuntu:14.04 bash dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct
Bash
복사
MBPS(Mega Byte per second) 초당 처리량
제한 없는 경우
MBS 1mb 제한인 경우 10초걸림
MBS 10mb 제한인 경우 1초걸림

IOPS 제한

docker run -it --rm ubuntu:14.04 bash dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct docker run -it --rm --device-write-iops /dev/sdb:10 ubuntu:14.04 bash dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct docker run -it --rm --device-write-iops /dev/sdb:1 ubuntu:14.04 bash dd if=/dev/zero of=blkio.out bs=1M count=10 oflag=direct
Bash
복사
초당 데이터 전송량 = IOPS * 블록크기(단위 데이터 용량)
10으로 제한