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
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개 만들어라
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 확인
'Cloud Native > Docker' 카테고리의 다른 글
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 11(컨테이너 스토리지) (0) | 2022.02.18 |
---|---|
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 10+(문제풀이/성공) (0) | 2022.02.18 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 9+(문제풀이/성공) (0) | 2022.02.17 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 9(컨테이너 사용하기) (0) | 2022.02.17 |
도커(Docker) - 유튜브 'TTABAE-LEARN' 따라하기 8(컨테이너 보관창고) (0) | 2022.02.17 |