- 기본적으로 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
[ 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)
참고 :
'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 |
댓글