728x90

기본적으로 container resource 는 제약이 없으며 호스트의 커널 스케줄러가 허용하는 한계치 까지 주어진 리소스를 최대한 사용할 수 있습니다.

 

하나의 machine (Ubuntu) 이 cpu 4 core / memory 8GB 라고 가정했을때 4개의 application 을 실행하고 

2개의 application 에 메모리 누수가 있다고 가정했을때 2개 의 application 모두 8GB 까지 메모리를 사용하려고 합니다 
해당 상황은 해당 Ubuntu machine 을 shutdown 시키는 결과를 초래 할 수 있고 운영 상황에서는 큰 장애로 이어 질 수 있습니다.

 

그럼 해당 이슈를 어떻게 우아하게 처리 할 수 있는지 알아 보겠습니다 

이 글은 Docker 공식문서를 참고했습니다.

https://docs.docker.com/engine/containers/resource_constraints/

 

Resource constraints

Specify the runtime options for a container

docs.docker.com

 

 

메모리 제한 (Memory limit)

Docker 는 메모리 제한을 두가지로 제한 할 수 있습니다. 하나는 소프트 이고 하나는 하드입니다.

 

하드: hard 를 사용하면 컨테이너가 고정된 양의 메모리만 사용할 수 있습니다.

소프트: soft 를 사용하면 커널이 메모리 부족이나 host 머신에서 경합을 감지하는등 특정 조건이 충족되지 않는 한 컨테이너가 필요한 만큼의 메모리를 사용할 수 있습니다.

 

여기서 중요한 옵션은 memory 와 reservation 입니다. 

대중적으로 사용하길 reservation 의 2배를 memory 로 설정합니다

memory 와 reservation 의 수치는 magic number 이므로 배포할 application 에 대해 모니터링 한뒤 세부조정을 하시는것을 추천 드립니다.

 

CPU 제한

기본적으로 각 컨테이너의 호스트 머신 CPU 사이클에 대한 액세스는 무제한 입니다.

 

 

 

CPU가 1개 있는 경우 다음 명령은 각각 1초마다 컨테이너가 최대 CPU의 50%를 사용하도록 보장합니다.

 

 docker run -it --cpus=".5" ubuntu /bin/bash

 

 

주의해야할점

CPU 스케줄링 및 우선순위 지정은 고급 커널 수준 기능입니다. 대부분 사용자는 이러한 값을 기본값에서 변경할 필요가 없습니다. 이러한 값을 잘못 설정하면 호스트 시스템이 불안정해지거나 사용할 수 없게 될 수 있습니다.

 

 

마지막으로 전체적인 예제입니다.

 

api:
  image: node:16-alpine
  container_name: backend-api
  deploy:
    resources:
      limits:
        cpus: '1'
        memory: 1G
      reservations:
        cpus: '0.5'
        memory: 512M
  environment:
    - NODE_ENV=production
    - MAX_OLD_SPACE_SIZE=768
  volumes:
    - type: volume
      source: api-storage
      target: /app/storage
      volume:
        nocopy: true
        size: 2G
  healthcheck:
    test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/health"]
    interval: 30s
    timeout: 10s
    retries: 3
728x90