docker

[Docker] 컨테이너 리소스 모니터링

수수한개발자 2023. 10. 24.
728x90

모니터링을 해야 하는 이유

 

모니터링은 시간의 흐름에 따른 시스템 및 여러 구성요소의 동작과 출력등을 관찰하고 확인하는 작업을 통해 자원의 효율적인 사용을 식별, 평가한다.

모니터링은 활용률 및 처리량 같은 Metric(지표)에 중점을 두고 시스템 전반의 성능을 알 수 있다.

- 메모리 사용량 급증, 캐시 적중률 감소, CPU 사용량 증가

 

cadvisor

google에서 제공하고 관리하는 오픈소스 컨테이너 모니터링 도구이다.

Docker 컨테이너와 다른 컨테이너 플랫폼에도 기본적으로 지원 가능

HostOS에서 실행 중인 컨테이너에 대한 정보를 수집하고 해당 데이터를 처리한 후 내보내는 단일 컨테이너 데몬으로 구성

이전 리소스 사용량, 리소스 격리 매개 변수 및 각 컨테이너 머신 전체에 대한 네트워크 통계 등을 기록한다.

 

매트릭을 전용 웹 인터페이스 또는 Google Big Query, ElasticSearch, Kafka, Prometheus, Redis와 같은 다른 수집 데이터 분석 가능 도구와 연동할 수 있다.

 

https://github.com/google/cadvisor

 

cadvisor 실행 명령어

24.03.26 user per core 차트 안나 오는 문제 해결process listing failed: failed to execute "/usr/sbin/chroot" command: exit status 1 문제 해결

docker run \
--platform linux/amd64 \
--restart=always \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=9559:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:latest

24.03.26 최신 도커에서는 위의 명령어로 usage per core 안나옴
https://github.com/google/cadvisor/issues/1565#issuecomment-718812180

docker run \
--platform linux/amd64 \
--restart=always \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \
--volume=/var/run/docker.sock:/var/run/docker.sock:rw \
--volume=/dev/disk/:/dev/disk:ro \
--publish=9559:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:latest

 

귀여운 부엉이가 나온다.

각 컨테이너에 대한 메모리, 네트워크 CPU에 대한 지표를 확인할 수 있습니다.

 

자원을 많이 잡아 먹게되는 컨테이너를 모니터링하게 되면 다른 컨테이너의 자원에도 영향이 가서 성능에도 영향을 주기 때문에   자원을 제한해야 됩니다. 사용 중인 컨테이너에 과도한 자원은. docker update를 통해 제한을 할 수 있습니다.

 

Docker Containers를 누르면 다음과 같이 현재 실행 중이 컨테이너를 확인할 수 있다.

 

새로운 nginx 컨테이너 실행

docker run -d --name=nginx -p 8081:80 nginx:1.25.0-alpine

 

 

localhost:8081로 접속해 새로고침을 막 누르면 거의 실시간으로 네트워크에 대한 메트릭 정보를 수집하여 차트로 보여준다.

 

컨테이너 리소스 측정 도구 - htop

자원 소비 측정을 위한 htop을 설치한다.

htop은 각 코어수를 확인해서 각 프로세스 정보를 좀 더 자세히 보여주는 실시간 모니터링 도구이다.

brew install htop
htop

 

CPU 자원 제한

CPU 스케줄링

CPU자원을 어떤 프로세스에 얼마나 할당하는지를 정책으로 만드는 것을 CPU 스케줄링이라고한다.

CPU 제한을 위해 CFS(Completely Fair Scheduler) 스케줄러를 사용한다.

말 그대로 프로세스가 공평하게 CPU 사용 기간을 제공 받도록 하는 OS 알고리즘이다.

 

--cpu-shares

컨테이너가 사용할 수 있는 CPU 사용시간에 대한 가중치를 설정. 기본 값 1024, 2048 설정 시 다른 컨테이너에 비해 2배의 사용 시간 할당

docker run -d --name ${name} --cpu-shares 1024 ${image} --cpu 4
docker run -d --name ${name} --cpu-shares 512 ${image} --cpu 4

 

--cpuset-cpus

보유한 CPU core 를 지정하여 컨테이너가 해당 core만 사용하도록 설정한다. 예로 0/ 1-2 / 0,1,2 지정 가능

 

docker run -d --name ${name} --cpuset-cpus=2 ${image} --cpu 1

--cpus

컨테이너가 사용할 수 있는 CPU 사용 비율(%)지정

예로 --cpus=0.25 설정 시 지정된 core수의 25% 사용가능

 

docker run -d --name ${name} --cpuset-cpus=2 ${image} --cpu 1
docker update --cpus=0.2 ${name}

 

 

Memory 자원 제어

메모리는 프로세스들의 작업 공간이다. 만일 특정 컨테이너가 과도한 메모리 사용시 OOM(out of memory) 메모리 부족으로 인해 프로세스, 즉 다른 컨테이너의 예기치 않은 강제 종료가 발생할 수 있다. 

- OOM Killer가 프로세스를 kill 하지 못하도록 보호 : --oom-kill-diable

Docker Daemon이 커널에 의해 강제 종료 될 수도 있다.

 

--memory (-m)

hard limit

컨테이너가 사용하는 최대 메모리 사용량 제한. 설정 값을 초과해서 사용하면 OOM 발생. 최소 6MB

 

docker run -d --memory=1g --name=${name} ${image}

 

--memory-reservation

soft limit

Docker contention을 감지하거나 HostOS의 메모리 가용율이 현저히 떨어지는 경우 활성화되어 최소한의 보정 값으로 사용

-m=1g --memory-reservatiopn=500m (최대 1g 사용가능하고 적어도 500m 사용보장)

 

 

--momory-swap

컨테이너가 사용할 수 있는 swap memory 사용량 제한(-1은 무제한)

-m=300m 설정 시 자동으로 --memory-swap=600m 설정됨. 이는 전체 600m에서 -m 값을 뺀 나머지만큼 swap이 사용된다는 의미

 

docker run -d --memory=200m --memory-swap=300m --name=${name} ${image}

위의 명령어에서는 300m에서 전체 메모리 200m에서 을 뺀 100m이 스왑 메모리로 잡힌다.

 

현제 메모리 확인법

docker inspect ${name} | grep -i memory

 

메모리 과부하 테스트

docker run -it -rm -memory=200m --memory-swap=200m ${image} --vm 1 --vm-bytes 150m -t 10s

위의 명령어는 메모리200m와 스왑 메모리가 같으므로 스왑메모리는 사용안한다.

그리고 150m를 요청하니 잘 수행한다.

 

docker run -it -rm -memory=200m --memory-swap=200m ${image} --vm 1 --vm-bytes 200m -t 10s

위의 명령어는 메모리 200, 스왑 200으로 스왑은 사용안하는 상태이므로 프로세스가 죽는다.

 

docker run -it -rm -memory=200m  ${image} --vm 1 --vm-bytes 200m -t 10s

위의 명령어는 swap을 설정안해줬으므로 메모리 200, 스왑 메모리*2 : 400 으로 잘 동작한다.

 

 

Disk 자원 제한

이미지를 다운 받게 되면 HostOS의 /var/lib/docker의 경로로 다운받기때문에 HostOS의 공간을 차지한다.

컨테이너의 I/O의 제한을 설정하지 않으면 공간이 부족하는 문제가 생기게 됩니다.

단 Direct I/O 의 경우에만 Block I/O가 제한되며, Buffered I/O는 해당되지 않는다.

 

--blkio-weight --blkio-weight-device

Block I/O의 할당량을 10~1000으로 설정. 기본값500

 

--device-read-bps --device-write-bps

특정 Device에 MBPS를 제한한다.

초당 Block throughput(처리량)을 의미, b, kb, mb, gb 단위로 제한

docker run -it --rm ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct
docker run -it --device-write-bps /dev/sda:1mb ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct

첫번째는 제한이 없어서 빠르지만 두번째는 1mb로 제한을 했기 때문에 속도가 엄청 느리게 된다.

--device-read-iops --device-write-iops

 

특정 Device에 IOPS를 제한한다.

초당 Block I/O횟수를 의미. 0이상의 정수로 표기

 

docker run -it --rm ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct
docker run -it --device-write-iops /dev/sda:10 ubuntu:14.04 bash
dd if=/dev/zero of=blkmb.out bs=1M count=10 oflag=direct

 

 

Dist I/O 측정 도구

iostat -> $iostat 2 100

sudo apt install sysstat
iostat 2 1000 
// 2초 간격으로 1000번 출력해라

 

모니터링 하는 법과 자원 제한을 통해 도커 컨테이너 사용중 트러블 슈팅을 해낼수 있으면 좋겠다..

728x90

'docker' 카테고리의 다른 글

[docker] Docker compose를 사용해보자  (1) 2023.10.28
[Docker] Dockerfile  (4) 2023.10.26
[docker] Volume  (3) 2023.10.23
[Docker] Docker 로그인 방법  (0) 2023.10.21
도커기본 명령어 및 도커 허브에 이미지 올리기  (0) 2023.02.26

댓글