Docker - Cadvisor & 자원소비제어

안상훈·2025년 1월 13일

온디바이스LLM

목록 보기
12/16
post-thumbnail

1. cadvisor

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

https://github.com/google/cadvisor

해당 깃허브 페이지에 접속하면 설치방법에 대한 메뉴가 나오는데 윈도우 Powershell에서는 아래의 코드로 설치를 진행하면 된다.


#여기서 호스트PC의 범용포트 8080은 왠만하면 쓰지말자

$VERSION = "v0.49.1" # 최신 버전은 https://github.com/google/cadvisor/releases에서 확인

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 9559:8080 `
  --detach `
  --name cadvisor `
  --privileged `
  --device /dev/kmsg `
  gcr.io/cadvisor/cadvisor:$VERSION

아무튼 설치를 완료한 후에는 아래의 페이지에 접속하면 된다

http://localhost:9559

접속하면 보이는 사진처럼 현재의 시스템을 구동현황을 모니터링하는 것이 가능하다.

이제 모니터링이 컨테이너가 구동될 때 어떻게 변화하는지 확인해야 하니

임의의 컨테이너를 하나 설치&실행을 해보자

docker run -d `
--name=mywebserver `
-p 8001:80 nginx:1.27.3-alpine

해당 컨테이너를 설치하면 cadvisor에서 설치된 컨테이너의 실시간 모니터링이 가능하다는데..
음.. 뭔가 안된다..

cadviser 말고도 연동가능한 모니터링 툴로는
Prometheus, Grafana등이 있다는데

위 사진처럼 prometheus와 grafana를 함께 사용한 모니터링 시스템을 구축하는게 좀 일반적인 방식인 듯 하다.

이를 컨테이너의 모니터링에 활용하자는 것 같은데..
이건 지금 필자에게는 너무 TMI인 듯 하다..

2. 자원제한 - CPU

컨테이너를 생성 및 실행할 때 Host PC의 자원을 얼마나 제한을 두고 설정할 수 있는지에 대한 설정이
CFS(Completely Fair Schedular)이다.

상세설정으로 위 3가지가 있는데 이에 대한 실습을 진행하고자 한다.

docker run -d `
--name cpu_1024 `
--cpu-shares 1024 `
leecloudo/stress:1.0 stress `
--cpu 4

현재 내가 수강중에 있는 수업에서 제공하는 leecloudo/stress:1.0 라는 컨테이너는
stress라는 명령어를 받으면 자동으로 Fullload과부화를 수행하는 듯 하며

CPU 4개(--cpu 4)에 한하여 현재 --cpu-shares 1024의 가중치로 CPU를 점유한다는 뜻이다.
지금 다른 컨테이너는 동작하고 있는 상황이 아니기에
첫번째 컨테이너는 CPU 4개를 100%로 점유하고 있다 보면 된다.

이렇게 위 사진처럼 CPU를 100%(코어 개수당 100%를 합산하기에 400%이다.)
점유하여 로드가 걸리고 있다.

이제 여기에 하나의 컨테이너를 더 실행시켜보자

docker run -d `
--name cpu_512 `
--cpu-shares 512 `
leecloudo/stress:1.0 stress `
--cpu 4

이러면 1번 컨테이너가 CPU4개에 대한 점유를 1024 가져가고
신규로 등록한 2번 컨테이너가 CPU4개에 대한 점유를 512 가져가기에

음.. 내 예상으로는 A컨테이너는 66%, B컨테이너는 33%가 될 것이라 생각했지만

코어 개수가 더 많으니 그냥 다른쪽 유휴자원을 이용하는 식으로 문제를 해결하고 있다.

docker run -d `
--name cpu_1024 `
--cpu-shares 1024 `
--cpuset-cpus 0-3 `
leecloudo/stress:1.0 stress `
--cpu 4

위 코드로 하면 물리적 코어 4개를 할당해서 해당 컨테이너가 4개 컨테이너를 1024 정도로 점유한다는건데...

뭔가 물리코어 0, 1, 2, 3을 직접 할당하는건 내가 생각하는거랑은 좀 다른 개념인거 같다...

이제 여기에서 아래의 명령어를 추가해보자

docker update --cpus=0.4 cpu_1024

CPU의 사용량을 조정하는건데 그냥 40%로 확 낮춰버린다

따라서 지금 CPU를 총 4개를 해당 컨테이너에 할당했으니
실제로는 전체 CPU자원을 0~400%가 아닌 0~100%로 놓고 본다면
10%의 자원만 사용것이라 보면 된다


3. 자원제한 - Mem

물리적으로 메모리 용량 제한을 두기

docker run -d `
--memory=1g `
--name=nginx_mem_1G nginx

위 명령어는 nginx컨테이너를 구동할 때 메모리 용량을 1G로 제한을 두겠다는 뜻이다.

이 메모리 제한부분도 docker update옵션을 주면 변경이 가능하다.

마지막으로 disk도 자원제한이 가능한데

가능하다는것만 알아두자...

profile
자율차 공부중

0개의 댓글