본문 바로가기
INFRA/DevOps

[Docker] Docker container resource 관리

by BTC_프로틴 2022. 7. 5.
  • 기본적으로 container는 호스트 하드웨어 리소스의 사용 제한을 받지 않는다.
  • 따라서 container가 필요로 하는 만큼의 리소스만 할당해야 한다

 

Docker command를 통해 제한할 수 있는 resource

  • CPU
  • Memory
  • Disk I/O (Block I/O)
  • docker run command로 실행

 

Memory 리소스 제한

  • --memory, -m : container가 사용할 최대 memory 양을 지정
  • --memory-swap : container가 사용할 swap memory 영역에 대한 설정
    memory+swap
    생략 시 memory의 2배가 설정됨
  • --memory-reservation : --memory값보다 적은 값으로 구성하는 소프트 제한 값 설정
  • --oom-kill-disable : OOM Kiiler가 프로세스를 kill하지 못하도록 보호
  • 제한 단위는 b,k,m,g로 할당

 

CPU 리소스 제한

  • --cpus : container에 할당할 CPU core수를 지정
    --cpus=”1.5” container가 최대 1.5개의 CPU 사용가능
  • --cpuset-cpus : container가 사용할 수 있는 CPU나 core를 할당
    cpu index는 0부터
    --cpuset-cpus=0-4
  • --cpu-share : container가 사용하는 CPU비중을 1024값을 기반으로 설정
    --cpu-share 2048 : 기본 값보다 두 배 많은 CPU 자원을 할당

 

Block I/O

  • --blkio-weight, --blkio-weight-device : Blockl I/O의 Quota를 설정할 수 있으며 100~1000까지 선택
    default는 500
  • --device-read-bps, --device-write-bps : 특정 디바이스에 대한 읽기와 쓰기 작업의 초당 제한을 kb, mb, gb 단위로 설정
  • --device-read-iops, --device-write-iops : 컨테이너의 read/write 속도의 quota를 설정
    초당 quota를 제한해서 I/O를 발생
    0 이상의 정수로 표기
    초당 데이터 전송량 = IOPS*블럭크기(단위 데이터 용량)

 

Docker monitoring commands

  • 실행 중인 container의 runtime 통계를 확인
docekr stats [OPTIONS] [CONTAINER...]
 
  • docker host의 실시간 event 정보를 수집해서 출력
docker events
 
  • cAdvisor

GitHub - google/cadvisor: Analyzes resource usage and performance characteristics of running containers.

 

[ Hands-on ]

부하 테스트 프로그램 생성

  • dockerfile 생성
    • stress --cpu 2 : 2개의 cpu core를 100% 사용하도록 부하 발생
    • stress --vm 2 --vm-bytes <사용할 크기> : 프로세스 수 2개와 사용할 메모리만큼 부하 발생
cat >> dockerfile << EOF
FROM debian
RUN apt-get update && \
    apt-get install -y stress
CMD ["/bin/sh", "-c", "stress -c 2"]
EOF
  • 부하 테스트 container image 빌드
docker build -t stress .

 

Memory resource 제한 실습

docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s

docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s

docker run -d -m 100m --name m4 --oom-kill-disable=true nginx

docker inspect m4

cat /sys/fs/cgroup/memory/docker/{containerUUID}/memory.oom_control

 

CPU resource 제한 실습

  • CPU 1에 100% 부하를 적용
docker run --cpuset-cpus 1 --name c1 -d stress:latest stress --cpu 1
  • CPU 1에서 실행 중인지 확인
htop

  • CPU 0에 100% 부하를 적용
docker run --cpuset-cpus 0 --name c1 -d stress:latest stress --cpu 1
  • CPU 0에서 실행 중인지 확인
htop

  • CPU 0 또는 1에 100% 부하를 적용
docker run --cpuset-cpus 0-1 --name c2 -d stress:latest stress --cpu 1
  • CPU 0 또는 1에서 상시적으로 부하가 다르게 적용 중인지 확인
htop

  • container별로 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
  • resource 사용 통계량 확인
docker stats

 

Block I/O resource 제한 실습

  • write 속도의 초당 quota를 제한해서 I/O write를 발생 (lsblk command를 통해 device명 확인)
docker run -it --rm --device-write-iops /dev/sda:10 ubuntu:latest /bin/bash
  • dd command 실행 (원하는 파일의 크기를 생성)
dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct

  • write 속도의 초당 quota를 증가시켜서 I/O write를 발생
docker run -it --rm --device-write-iops /dev/sda:100 ubuntu:latest /bin/bash
  • dd command 실행 (원하는 파일의 크기를 생성)
dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct

 

cAdvisor 실행

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
  • http://localhost:8080으로 접속 (NSG port 8080 open)

 

 

참고 :

[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편

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

'INFRA > DevOps' 카테고리의 다른 글

[Docker] Docker container storage  (0) 2022.07.11
GitHub Script란 무엇일까요?  (0) 2022.07.06
Github의 이해 1  (0) 2022.07.01
Ingress 란? - 1  (0) 2022.06.27
[Docker] Container Registry & Container 사용  (0) 2022.06.27

댓글