Profile picture

[Docker] 컨테이너(Container)에 할당되는 CPU 제한하기

JaehyoJJAng2024년 07월 25일

개요

이번 게시글에서는 도커 컨테이너에서 CPU를 최적으로 활용하는 방법에 대해서 기록해보려고 한다.


호스트 CPU Core 정보 확인

먼저 컨테이너에 CPU를 최적으로 할당하기 위해서는, 현재 호스트 시스템의 CPU 정보에 대해서 파악하고 있어야 한다.


lscpu 명령어를 사용하여 CPU 정보를 확인해보자.

lscpu

예시 결과:

Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               AuthenticAMD
  BIOS Vendor ID:        Advanced Micro Devices, Inc.
  Model name:            AMD Ryzen 5 5600G with Radeon Graphics
    BIOS Model name:     AMD Ryzen 5 5600G with Radeon Graphics          Unknown CPU @ 3.9GHz
    BIOS CPU family:     107
    CPU family:          25
    Model:               80
    Thread(s) per core:  2
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            0
    CPU(s) scaling MHz:  54%


컨테이너 CPU 설정 확인

호스트에서 현재 실행 중인 도커 컨테이너의 CPU가 이미 제한되어 있는지 확인해보자.


docker inspect

docker inspect 명령어 사용:

docker inspect <container name> --format='{{.HostConfig.CpusetCpus}}'

명령어 실행 시 할당된 CPU 코어 ID가 출력된다.


docker inspect <container name> --format='{{.HostConfig.CpuShares}}'

명령어 실행 시 CPU 공유 비율이 출력된다.


docker stats

docker stats 명령어 사용:

docker stats <container name>

해당 명령어 사용 시 실시간으로 CPU 사용률과 메모리 사용량 등을 확인할 수 있다.


예시 결과:

CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT    MEM %     NET I/O          BLOCK I/O        PIDS
5a7d6cc3b171   palworld-server   110.65%   15.65GiB / 30.6GiB   51.14%    2.02GB / 7.3GB   44.4GB / 122GB   51
  • CPU %: 110.65%
    • 컨테이너가 사용하는 CPU의 비율이다.
    • 1개의 CPU 코어를 100%로 간주한다.
  • MEM USAGE / LIMIT:
    • 컨테이너가 사용 중인 메모리와 할당된 메모리 제한이다.
    • 현재 컨테이너는 15.65Gib 메모리를 사용하고 있으며, 할당된 최대 메모리는 30.6Gib이다.
    • 메모리 제한은 Docker 실행 시 --memory 옵션으로 설정 가능하다.
  • MEM %:
    • 컨테이너에 할당된 메모리에서 현재 사용 중인 비율이다.
    • 예시 결과에서는 30.6Gib의 절반인 51.14%를 사용 중이다.
  • NET I/O:
    • 컨테이너 네트워크 데이터 입출력량이다.
    • 예시 결과에서의 입력 데이터: 2.02GB
    • 예시 결과에서의 출력 데이터: 7.3GB
  • BLOCK I/O:
    • 컨테이너가 디스크에서 읽고 쓴 데이터 양
    • 읽기 데이터: 44.4GB
    • 쓰기 데이터: 122GB
  • PIDS:
    • 컨테이너 내부에서 실행 중인 프로세스 의 수


컨테이너 CPU 제한하기

도커에서는 컨테이너의 리소스를 제한할 수 있는 명령어가 존재한다.

  • 컨테이너 run 또는 create 하는 경우 자원 할당량 지정 가능
  • 컨테이너가 이미 생성된 경우 update 명령어로 컨테이너 리소스 변경 가능
  • 옵션을 지정하지 않는 경우 Host OS의 자원을 제한 없이 사용함.

컨테이너 CPU 제한하기

  • --cpu-share(=-c):
    • 기본값은 1024, CPU 할당 비율 1을 의미함
    • 2048 설정 후 CPU 작업 시 일반 컨테이너보다 2배 많은 시간을 할당한다는 뜻임.
docker run -d -it --name CONTAINER_CPU_2048 --cpu-shares 2048 nginx:latest
docker run -d -it --name CONTAINER_CPU_1024 --cpu-shares 1024 nginx:latest

두 컨테이너 실행 시 첫 번째 컨테이너(CONTAINER_CPU_2048)가 두 번째 컨테이너보다 더 많은 CPU 시간을 할당 받음.



호스트에 CPU가 여러 개 있는 경우 --cpuset-cpus 옵션을 사용하여 컨테이너가 특정 CPU만 사용하도록 지정할 수 있다.

만약, CPU에 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정하여 작업을 분배하는 것을 권장한다.

  • --cpuset-cpus="0.3": 1,4번째 CPU 사용
  • --cpuset-cpus="0-2": 1,2,3번째 CPU 사용

또한 --cpus 옵션을 사용하여 cpu 사용 비율도 변경 가능하다.

  • --cpus=0.5: cpu를 0.5개 만큼(50%) 사용.

여기서 만약 기존 컨테이너에 리소스를 제한하고자 한다면 update를 사용해 업데이트 해주면 된다.

docker update --cpuset-cpus=1 <container name>

Loading script...