개발/DevOps

Docker 컨테이너 리소스 관리

달리초이 2022. 12. 29. 11:11


[목차]

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 : 블록 단위로 파일을 복사하거나 파일 변환을 할 수 있는 명령어

I/O 속도 차이 확인 -&nbsp;초당 5.8MB 만듦

기존 우분투 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

초당 98.2MB 만듦

 

 

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

 

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

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 컨테이너 리소스를 관리해야지 - 이론편

https://youtu.be/7HA_00KNtbc

7-2. Docker 컨테이너 리소스를 관리해야지 - 실습편

https://youtu.be/TM3DvwwvsLg

 

728x90
반응형

'개발 > 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