참고
컨테이너 리소스 모니터링을 위한 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으로 제한