Skip to content

컨테이너 자원 분배

docker stats 명령을 이용해 컨테이너들의 현재 자원 이용 상황을 먼저 확인해봅시다.

Shell
$ sudo docker stats
Shell
CONTAINER ID   NAME           CPU %     MEM USAGE / LIMIT   MEM %   NET I/O           BLOCK I/O        PIDS
000000000000   tradurs-d4     11.08%    50.15MiB / 2GiB     2.5%    789MB / 1.79GB    1.24MB / 0B      1
000000000001   nginx-host     4.50%     56.29MiB / 2GiB     2.81%   24.6GB / 15.7GB   89.8MB / 696kB   2
000000000002   tradurs-back   26.20%    157.5MiB / 2GiB     7.87%   8.28GB / 21.1GB   22.7MB / 0B      3
000000000003   jenkins        0.13%     270MiB / 2GiB       13.5%   42.6kB / 36.7kB   253MB / 47.5MB   4

현재 4개의 컨테이너가 실행 중이고 각 컨테이너의 메모리 사용량은 인스턴스의 전체 메모리(2Gb)에 크게 영향이 없는 것으로 보입니다. 그럼 이제 CPU 사용량을 확인해 봅시다. Node.js로 구동 중인 tradurs-d4 컨테이너와 tradurs-back 컨테이너의 CPU 사용량이 들쑥날쑥합니다. 최대 90%까지 치솟고 있었습니다.

현재 구동 중인 컨테이너의 상태를 업데이트 하려면 docker update 명령을 사용합니다.

Shell
$ sudo docker update --cpuset-cpus=0 --cpu-shares=1024 --memory=500 --memory-swap=1g 컨테이너
옵션설명
--cpusCPU 수
--cpuset-cpus실행을 허용할 CPU(0-3, 0, 1)
-c, --cpu-sharesCPU 점유율(상대적 가중치)
-m, --memory메모리 한도
--memory-swap스왑 한도는 메모리에 스왑을 더한 값과 같습니다.(-1 무제한 스왑)

사용 예

  • --cpus는 지정된 CPU의 수치를 설정합니다.
    • 예를 들어 4개의 CPU를 사용하는 인스턴스에서 --cpus=1로 설정하면 4개의 CPU를 모두 사용합니다.
    • 4개의 CPU를 사용하는 인스턴스에서 --cpus=.5로 설정하면 2개의 CPU를 사용합니다.
    • 지정된(--cpuset-cpus를 설정하지 않은 경우 전체) CPU를 총 1로 놓고 원하는 할당량을 설정하면 됩니다.
  • --cpuset-cpus는 사용할 CPU를 선택하는 설정입니다.
    • 2개의 CPU를 사용하는 인스턴스는 각 CPU를 0, 1로 구분합니다.
    • 4개의 CPU를 사용하는 인스턴스는 각 CPU를 0, 1, 2, 3으로 구분합니다.
    • 4개의 CPU를 사용하는 인스턴스에서 특정 컨테이너를 --cpuset-cpus=0으로 설정하면 첫 번째 CPU만 사용합니다.
    • 4개의 CPU를 사용하는 인스턴스에서 특정 컨테이너를 --cpuset-cpus=0,2으로 설정하면 첫 번째, 세 번째 CPU만 사용합니다.
    • 4개의 CPU를 사용하는 인스턴스에서 특정 컨테이너를 --cpuset-cpus=0-2으로 설정하면 첫 번째, 두 번째, 세 번째 CPU만 사용합니다.
  • --cpu-shares는 지정된 CPU를 얼마나 점유할지 설정합니다. 기본값은 1024입니다.
    • 0번 CPU를 사용하는 총 2개의 컨테이너가 있다고 가정했을 때 컨테이너 1에 1024를 컨테이너 2에 2048을 설정한 경우 두 컨테이너 각각 1:2 비율로 0번 CPU를 점유합니다.
  • --memory는 말 그대로 메모리 한도를 지정합니다.
  • --memory-swap는 말 그대로 메모리 스왑 한도를 지정합니다. 메모리 스왑 한도는 메모리 한도를 포함합니다.
    • --memory=1g --memory-swap=2g로 설정한 경우 실제 인스턴스의 메모리를 1gb 한도로 하고 더 많은 메모리가 필요한 경우 1gb를 디스크 공간에서 사용합니다.(2gb - 1gb)

컨테이너를 시작할 때 자원 할당량을 설정하려면 docker run 명령에 옵션을 함께 사용하면 됩니다.

Shell
$ sudo docker run --cpuset-cpus=0 --cpu-shares=1024 --memory=500 --memory-swap=1g 컨테이너

컨테이너 별 자원량을 할당해 준 뒤로는 다행히 인스턴스(호스트)가 죽는 현상은 발생하지 않았습니다.

Made with VitePress.