개요
이번 게시글에서는 도커 컨테이너에서 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>