[목차]
1. Memory 리소스 제한
2. CPU 리소스 제한
3. Block I/O 제한
4. 리소스 모니터링
5. stress container 생성
6. cAdvisor 실행
1. Memory 리소스 제한
- 제한 단위는 b, k, m, g로 할당
옵션 | 의미 |
--memory, -m | 컨테이너가 사용할 최대 메모리 양을 지정 |
--memory-swap | 컨테이너가 사용할 스왑 메모리 영역에 대한 설정 메모리+스왑. 생략 시 메모리의 2배가 설정됨 |
--memory-reservation | --memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정 |
--oom-kill-disable | OOM Killer가 프로세스 kill 하지 못하도록 보호 |
docker run -d -m 512m nginx:1.14
docker run -d -m 1g --memory-reservation 500m nginx:1.14
docker run -d -m 200m --memory-swap 300m nginx:1.14
docker run -d -m 200m --oom-kill-disable nginx:1.14
2. CPU 리소스 제한
옵션 | 의미 |
--cpus | 컨테이너에 할당할 CPU core수를 지정 --cpus="1.5" 컨테이너가 최대 1.5개의 CPU 파워 사용가능 |
--cpuset-cpus | 컨테이너가 사용할 수 있는 CPU나 코어를 할당. cpu index는 0부터. --cpuset-cpus=0-4 |
--cpu-share | 컨테이너가 사용하는 CPU 비중을 1024 값을 기반으로 설정 --cpu-share 2048 기본값보다 두 배 많은 CPU 자원을 할당 |
docker run -d --cpus=".5" ubuntu:1.14
docker run -d --cpu-shares 2048 ubuntu:1.14
docker run -d --cpuset-cpus 0-3 ubuntu:1.14
3. Block I/O 제한
옵션 | 의미 |
--blkio-weight --blkio-weight-device |
Block IO의 Quota를 설정할 수 있으며 100~1000까지 선택 default 500 |
--device-read-bps --device-write-bps |
특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정 |
--device-read-iops --device-write-iops |
컨테이너의 read/write 속도의 쿼터를 설정한다. 초당 quota를 제한해서 I/O를 발생시킴. 0 이상의 정수로 표기 초당 데이터 전송량 = IOPS * 블럭크기(단위 데이터 용량) |
docker run -it --rm --blkio-weight 100 ubuntu:latest /bin/bash
docker run -it --rm --device-write-bps /dev/vda:1mb ubuntu:latest /bin/bash
docker run -it --rm --device-write-bps /dev/vda:10mb ubuntu:latest /bin/bash
docker run -it --rm --device-write-iops /dev/vda:10 ubuntu:latest /bin/bash
docker run -it --rm --device-write-iops /dev/vda:100 ubuntu:latest /bin/bash
4. 리소스 모니터링
docker monitoring commands
- docker stat : 실행중인 컨테이너의 런타임 통계를 확인
docker stats [옵션] [컨테이너이름...]
- docker event : 도커 호스트의 실시간 event 정보를 수집해서 출력
docker events -f container=<MAME>
docker image -f container=<MAME>
- cAdvisor
구글이 만든 모니터링 툴
https://github.com/google/cadvisor
5. stress container 생성
컨테이너 빌드 : 부하 테스트 프로그램 stress 를 설치하고 동작시키는 컨테이너 빌드
CPU 부하 테스트 : 2개 cpu core를 사용하도록 부하 발생 : stress --cpu 2
메모리 부하 테스트 : 프로세스 수 2개와 사용할 메모리만큼 부하 발생 : stress --vm 2 --vm-bytes <사용할 크기>
vi dockerfile
# dockerfile
FROM debian
MAINTAINER Dali Choi <clowncdi85@gmail.com>
RUN apt-get update; apt-get install stress -y
CMD ["/bin/sh", "-c", "stress -c 2"]
docker build -t stress .
- 테스트에 앞서 docker 컨테이너 stop 후 삭제를 한 번에 처리하는 alias 설정해서 편하게 사용
alias crm='docker rm -f $(docker ps -aq)'
- memory stress test
# 메모리 90m 스트레스 테스트 : 성공
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s
# 메모리 150m 스트레스 테스트 : 실패
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
# 메모리 100m(스왑 설정 없으면 기본 2배 설정됨) 스트레스 테스트 : 성공
docker run -m 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s
- oom-killer 설정
# OOM-Killer 설정
docker run -d -m 100M --name m4 --oom-kill-disable=true nginx
# 확인
cat /sys/fs/cgroup/memory/docker/컨테이너ID/memory.oom_control
#oom_kill_disable 1 #true
#under_oom 0
#oom_kill 0
- cpu stress test
먼저 lscpu 명령으로 cpu 갯수 확인
docker run --cpuset-cpus 0 --name c1 -d stress:latest stress --cpu 1
# CPU 사용량 확인(설치가 필요할 수도 있음)
htop
docker run --cpuset-cpus 0-1 --name c2 -d stress:latest stress --cpu 1
htop
docker rm c1
# cpu 상대적 가중치 할당 실행
docker run -c 2048 --name cload1 -d stress:latest
docker run --name cload2 -d stress:latest
docker run -c 512 --name cload3 -d stress:latest
docker run -c 512 --name cload3 -d stress:latest
- 컨테이너 리소스 사용량 모니터
docker stats cload1 cload2 cload3 cload4
- Block I/O stress test
먼저 lsblk로 디스크이름 확인 후 우분투 하나 실행 (쿼터 10)
docker run -it --rm --device-write-iops /dev/sda:10 ubuntu:latest /bin/bash
1m 짜리 10개 만드는 데 걸리는 속도 확인
dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct
*dd : 블록 단위로 파일을 복사하거나 파일 변환을 할 수 있는 명령어
기존 우분투 exit하고 우분투 두번째 실행 (이번엔 쿼터 100)
docker run -it --rm --device-write-iops /dev/sda:100 ubuntu:latest /bin/bash
dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct
6. cAdvisor 실행
먼저 테스트를 위해 블록 I/O 쿼터를 100으로 주고 메모리 500m(스왑 기본값 설정 : 2배)에 이름은 c1, 우분투 최신버전 백그라운드로 실행
docker run -it --rm --device-write-iops /dev/sda:100 -m 500m --name c1 -d ubuntu:latest /bin/bash
https://github.com/google/cadvisor
Quick Start: 위 페이지에서 가져옴
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
현재 컨테이너가 동작되고 있는 시스템의 웹브라우저로 접속하면 됨 (호스트IP:8080)
이처럼 gui 환경으로 컨테이너 모니터링을 편하게 할 수 있음
- 문제풀이
먼저 mysql 환경변수를 설정해 주어야 한다.
vi /etc/profile
# profile 편집. 파일 맨 아래에 mysql이 설치되는 path 설정 추가
export PATH=$PATH:/usr/local/mysql/bin
- docker mysql 컨테이너 실행 (메모리 300m가 부족해서 실패할 수 있다. 메모리나 스왑메모리를 늘려서 해결가능)
docker run --detach --name db --memory 200m --memory-swap 300m --cpuset-cpus 1 --env MYSQL_ROOT_PASSWORD=pass --publish 3306:3306 mysql
# 옵션 약자 표기
docker run -d --name db -m 200M --memory-swap 300M --cpus 0 -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql:latest
- mysql 접속 확인
docker exec -it db /bin/bash
mysql -u root -p
출처: 따배도
7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편
7-2. Docker 컨테이너 리소스를 관리해야지 - 실습편
'개발 > DevOps' 카테고리의 다른 글
Docker 컨테이너간 통신 (0) | 2022.12.29 |
---|---|
Docker Container Storage (0) | 2022.12.29 |
Docker Registry 컨테이너 보관창고 (0) | 2022.12.28 |
Docker 컨테이너 만들기 (1) | 2022.12.27 |
Docker 이미지와 컨테이너 관련 명령어 (0) | 2022.12.27 |