1. 컨테이너 하드웨어 리소스 제한

하드웨어 리소스 = Disc + CPU + Memory

리소스 제한을 걸어두지 않으면 한 컨테이너가 모든 사이즈 사용 가능

따라서 컨테이너에 적절한 리소스 할당 제한이 필요함!

 

```

Docker command를 통해 제한할 수 있는 리소스

  • CPU
  • Memory
  • Disk I/O
$ docker run --help

```

 

1-1. Memory 리소스 제한

 

제한 단위는 b, k, m, g로 할당

--memory, -m	#컨테이너가 사용할 최대 메모리 양을 지정
--memory-swap	#컨테이너가 사용할 스왑 메모리 영역에 대한 설정, 메모리+스왑량을 제한하는 것, 생략 시 메모리의 2배가 설정됨
--memory-reservation	#--memory 값보다 적은 값으로 구성하는 소프트 제한 값 설정
--oom-kill-disable	#OOM Killer가 프로세스 kill 하지 못하게 보호

#리눅스 커널은 물리적 메모리 공간이 부족하게 되면 OOM(Out Of Memory) killer를 작동시켜 프로세스들을 kill하기 시작한다.
#가상메모리를 많이 사용하는 컨테이너를 죽이게 된다.


//Ex.
$ docker run -d -m 512m nginx:1.14	#nginx는 메모리를 최대 512MB 까지 쓸 수 있음.
$ docker run -d -m 1g --memory-reservation 500m nginx:1.14	#소프트 제한 = 500MB는 '보장', 최대 1GB 까지 사용가능
$ docker run -d -m 200m --memory-swap 300m nginx:1.14	#메모리 스왑 = 디스크를 메모리처럼, 메모리 최대 200MB, 실제 스왑메모리 100MB
$ docker run -d -m 200m --oom-kill-disable ngin:1.14	#물리적 메모리 공간이 부족하더라도 kill하지 마라

 

1-2. CPU 리소스 제한

 

CPU index는 0부터

--cpus	#컨테이너에 할당할 CPU core수를 지정, index 상관 없음
	--cpus="1.5" #컨테이너가 최대 1.5개의 CPU core 사용 가능
    
--cpuset-cpus	#컨테이너가 사용할 수 있는 CPU나 코어를 index로 할당
	--cpuset-cpus=0-4	# 0번부터 4번 CPU 할당
    
--cpu-share		#컨테이너가 사용하는 CPU 비중을 1024 값을 기반으로 설정(default)
	--cpu--share 2048 	# CPU 비중을 2048로 쓸 수 있다(2배 많은 리소스)

//Ex.
$ 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

 

1-3. Block I/O 리소스 제한

 

컨테이너가 동작할 때 동일한 IO Scheduling 값을 받음( = 동일한 쿼터, default 500)

 

--blkio-weight		#Block IO의 Quota(쿼터)를 설정할 수 있으며 100~1000까지 선택
--blkio-weight-device

--device-read-bps	#특정 디바이스에 대한 읽기/쓰기 작업의 초당 제한을 kb,mb,gb 단위로 설정
--device-write-bps

--device-read-iops	#컨테이너의 읽기/쓰기 속도의 쿼터를 설정한다. 초당 쿼터를 제한해서 I/O를 발생시킴. 자연수로 표기. 초당 데이터 전송량 = IOPS * 블럭크기(단위 데이터 용량)
--device-write-iops

//Ex.

$ 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

2. 컨테이너 사용 리소스 확인

Docker monitoring commands

  • docker stat = 실행중인 컨테이너의 런타임 통계를 확인. 실시간으로 하드웨어 리소스 할당량 확인
  • docker events = 컨테이너, 이미지, 볼륨, 네트워크 등 컨테이너와 관련된 event 확인
  • cAdvisor = 구글이 만든 모니터링 툴

[실습]

0. 부하 테스트 프로그램 'stress'

stress --cpu	# 2코어만큼의 작업부하를 일으킴
stress --vm 2 --vm-bytes <사용할 크기>	# 메모리 부하

0-1. stress 컨테이너 제작

 

dockerfile

FROM debian
MAINTAINER kindongsy <kindongsy@naver.com>
RUN apt-get update; apt-get install stress -y
CMD ["/bin/sh", "-c". "stress -c 2"]	# -c = --cpu, 실행될 때 cpu 2코어 만큼의 부하 설정

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 -m 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s

 

1. 컨테이너 리소스 제한 및 모니터링

1-1. 메모리 리소스 제한

swap 메모리 용량 제한 = 메모리 + 스왑 메모리

docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s	#스왑메모리 x, 5초동안 90메가 부하
docker run -m 100m --memory-swap 100m stress:latest stress --vm 1 --vm-bytes 150m -t 5s		#메모리보다 부하가 크므로 kill(fail)
docker run -m 100m stress:latest stress --vm 1 --vm-bytes 90m -t 5s		#스왑 메모리 생략시 메모리의 두배 할당

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

//리눅스에서 docker 리소스 제한을 걸어주는 것은 'cgroup'
docker ps
cat /sys/fs/cgroup/memory/docker/26bdea53bd337563ce9f7f9880fff57cef0bc980db0f767e5ece677de84f45e5/memory.oom_control

 

1-2. CPU 리소스 제한

CPU 개수를 제한하여 컨테이너를 실행한다.

lscpu	#cpu개수 확인
apt-get install htop	#htop 설치
alias crm='docker rm -f $(docker ps -aq)'		#컨테이너 전체 종료 alias

docker run --cpuset-cpus 1 --name c1 -d stress stress --cpu 1		#cpu index를 통해 할당
htop		#top과 같은데 색깔이 포함
docker run --cpuset-cpu 0-1 --name c2 -d stress stress --cpu 1		#0번 1번중 상황에 맞게 부하 적용
htop
docker rm c1

cpu 1번 사용량이 100프로임을 확인할 수 있다.

docker run -c 2048 --name cload1 -d stress:latest		# -c = --cpu-share
docker run --name cload2 -d stress:latest
docker run -c 512 --name cload3 -d stress:latest
docker run -c 512 --name cload4 -d stress:latest

//모니터링 툴

docker stats		#상대적인 비율로 확인 가능

 

1-3. Block I/O 리소스 제한

CPU 개수를 제한하여 컨테이너를 실행한다.

lsblk

docker run -it --rm --device-write-iops /dev/sda:10 ubuntu:latest /bin/bash
/# dd if=/dev/zero of=file1 bs=1M count=10 oflag=direct

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

ubuntu linux 하나 실행 후
/# dd	1M 짜리 10개 만들어라

쿼터를 100으로 주었을 때 10에서보다 속도는 늘어나고 시간은 짧아지는 것을 볼 수 있음

2. cAdvisor 설치 및 사용

# Google에서 만든 코드로 리소스들을 수집하여 GUI 형태로 Web 브라우저에 나타내는 형식

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
  
  hostname -I	#localhost ip 확인

 

https://youtu.be/7HA_00KNtbc

유튜브 - 'TTABAE-LEARN'