[WIL] Mac OS에서 Docker CPU / Memory Limit

yoonn·2024년 8월 1일
post-thumbnail

Intro

Docker Desktop 환경에서 컨테이너의 리소스를 어떻게 설정하고 모니터링할 수 있는지, 그리고 이러한 설정이 실제로 어떻게 동작하는지 살펴보겠습니다.
Mac M2 Max, Docker desktop 환경에서 진행하였음


Setup

Docker Desktop Setting

  • Desktop Desktop - Settings - Resources - ADVANCED

    Docker에 할당할 CPU 코어 수 및 Memory, Swap, Disk 사이즈 등을 설정할 수 있습니다.

cAdvisor

실행 중인 컨테이너에 대한 리소스 사용량 및 성능 정보를 수집, 집계, 출력하는 도구

docker-compose

cadvisor

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro # 실행중인 모든 컨테이너 정보. 컨테이너 생성/시작/중지 등의 이벤트 모니터링
      - /:/rootfs:ro # 호스트의 전체 파일 시스템 접근해 시스템 전반의 정보 수집
      - /var/run:/var/run:ro # 실행중인 프로세스와 서비스에 대한 정보
      - /sys:/sys:ro # 커널과 하드웨어 정보에 접근. CPU, memory, disk usage 등의 시스템 메트릭 수집
      - /var/lib/docker/:/var/lib/docker:ro # docker 내부 저장소에 접근해 image, volume 등의 상세 정보
      - /dev/disk/:/dev/disk:ro # disk usage, I/O statistics 등 저장 장치 관련 메트릭 수집
    privileged: true
    devices:
      - /dev/kmsg:/dev/kmsg
    ports:
      - 8080:8080
    command:
      - -housekeeping_interval=5s # 데이터 수집 간격 설정(5 seconds)

테스트 대상 컨테이너

  db:
    image: mysql
    ...

localhost:8080으로 들어가면, 아래와 같이 컨테이너에서 사용할 수 있는 resource를 확인할 수 있습니다.

  • Allowed Cores : 5개
  • Memory 및 Swap Limit : unlimited

Validation

CPU

  db:
    image: mysql
    ...
    deploy:
      resources:
        limits:
          cpus: '0.5'
        reservations:
          cpus: '0.25'
  • deploy.resources.limits.cpus : 시스템은 항상 이 컨테이너에 최대 0.5 코어를 사용할 수 있도록 합니다.
  • deploy.resources.reservations.cpus : 시스템은 항상 이 컨테이너에 최소 0.25 CPU 코어를 사용할 수 있도록 보장합니다.
  • ctop에서 CPU 100% = 1코어 기준 100%. 5코어면 최대 500%까지 사용

동작 확인

ctop으로 실시간 컨테이너 사용 현황을 그래프로 볼 수 있습니다.

  • 0.5 core

  • 0.25 core

Memory

  db:
    image: mysql
    ...
    deploy:
      resources:
        limits:
          memory: 1G
        reservations:
          memory: 128M
    memswap_limit: 2G
  • deploy.resources.limits.memory: 시스템은 항상 이 컨테이너에 최대 1G를 사용할 수 있도록 합니다.
  • deploy.resources.reservations.memory: 시스템은 항상 이 컨테이너에 최소 128MB를 사용할 수 있도록 합니다.
  • memswap_limit: memory + swap

    cadvisor로 보면 위와 같이 변경된 것을 확인할 수 있습니다.

동작 확인

DB Container 최초 기동 시 530MB 정도 사용하고 있는 것을 확인.

  • deploy.resources.limits.memory, memswap_limit 값을 각각 150MB로 설정하면 docker run 할 때 컨테이너가 죽는 것을 확인. (memory limit이 잘 동작하는 것을 확인)

  • deploy.resources.limits.memory, memswap_limit을 각각 300MB로 설정하면 컨테이너가 죽지 않고 살아있는 것을 확인.


Conclusion

이번 실험을 통해 Docker Desktop 설정을 통해 전체 Docker 환경에 할당할 리소스를 조절할 수 있고, docker-compose 파일 내 설정으로 개별 컨테이너 리소스 사용량을 세밀하게 제어할 수 있음을 확인했습니다.

CPU 코어 수와 메모리 제한이 실제로 잘 동작하는 것을 확인하였고, 이는 여러 컨테이너가 동시에 운영되는 환경에서 특정 컨테이너가 과도하게 리소스를 점유하는 것을 방지할 수 있을 것입니다.

또한 cAdvisor 및 ctop을 활용한 컨테이너 모니터링을 통해 실시간으로 컨테이너 리소스 사용 현황을 들여다보았습니다.

Reference

0개의 댓글