-
Docker Container 리소스 관리Docker 2019. 10. 1. 12:41
CPU 리소스 관리
Dokcer Container는 Host의 CPU 자원을 제한없이 사용할 수 있다. 자원 사용의 제한이 없기 때문에 하나의 컨테이너가 수행될 때 CPU-Intensive한 작업을 수행하게 되면 호스트 머신의 모든 CPU 자원을 점유하여 다른 컨테이너의 동작을 방해하는 현상이 발생할 수 있다. 이러한 현상을 방지하기 위해 CPU 사이클에 대한 Quota를 적용이 필요하다.
Docker는 기본적으로 CFS(Completely Fair Scheduler) 스케줄러를 사용하며, 1.13 Version+에서는 실시간 스케줄러를 이용할 수 있다.
CFS 스케줄러
옵션 설명 --cpus=<number> 현재 실행하고자 하는 컨테이너가 최대 몇 개의 CPU를 사용할 것인지 명시한다.
[ --cpus="1.5" ] = [ --cpu-period="100000" ] + [ --cpu-quota="150000" ]
--cpu-period=<number> CPU CFS 스케쥴러 Period를 의미하며, --cpu-quota 옵션과 같이 사용된다.
단위는 마이크로초로 표현된다.
--cpu-quota=<number> CPU CFS Quota를 의미하며, 입력한 값은 --cpu-perioa로 입력한 값 중 얼마를 컨테이너에게 할당할 것인가를 의미한다.
즉, 실제로 사용할 리소스의 퍼센트 = quota / period
--cpuset-cpus 컨테이너가 사용할 수 있는 CPU or 코어를 제한하며, 코어의 인덱스는 0부터 시작
[ ex : 코어가 4개인 호스트 머신에서 --cpuset-cpus="0,2" 옵션을 사용할 경우 첫 번째, 세 번째 코어를 사용하도록 명시한 것 ]
--cpu-shares 컨테이너를 실행할 때 고려할 가중치를 의미하며 설정한 값은 상대적으로 사용된다.
기본값은 1024이며 2048로 설정 시 기본 값보다 두 배 많은 CPU 자원을 할당한다. 이 설정 값은 리눅스 커널의 cgroups에서 사용된다.
cgroup의 CPU Share은 현재 생성되어 있는 컨테이너들이 Share 값의 비율에 따라 호스트의 CPU를 CFS 방식으로 나눠서 사용한다.
실시간 스케줄러
< CONFIG_RT_GROUP_SCHED 가 설정되어 있어야 한다. >
옵션 설명 --cpu-add=sys-nice 컨테이너에게 CAP-SYS-NICE를 할당한다.
CAP-SYS-NICE는 컨테이너가 프로세스의 nice(우선순위)값을 올릴 수 있도록 허용하는 것이다.
--cpu-rt-runtime=<num> --cap-add=sys_nice를 명시해야 하며, 컨테이너가 도커 데몬의 실시간 스케쥴러 period 동안 수행할 마이크로 초 값을 명시할 수 있다. --ulimit rtprio=<num> --cap-add=sys_nice를 명시해야 하며, 실시간 우선순위의 최대 값 명시
메모리 관리
Docker는 컨테이너의 메모리 사용량의 Hard Limit 혹은 Soft Limit을 지정할 수 있다.
Hard Limit : 컨테이너는 지정된 메모리량 이상을 사용할 수 없다.
Soft Limit : 필요한 만큼 메모리를 이용하다가 커널이 호스트머신의 메모리가 부족하거나 컨텐션이 몰릴 경우 제한
옵션 설명 -m || --memory=<value> 컨테이너가 사용할 최대 메모리 양을 지정한다.
옵션 지정시, 최소 값은 4MB 이다.
--memory-swap --memory 옵션과 함께 사용되며 컨테이너가 사용할 스왑 메모리 영역을 설정할 수 있다.
컨테이너가 할당된 메모리를 모두 사용한 경우에도 디스크 공간을 사용할 수 있도록 해준다.
스왑 공간을 자주 사용하는 것은 성능 저하를 일으키기 때문에 사용을 지양해야 한다.
--memory-swappiness 기본적으로 호스트 OS의 커널은 컨테이너의 Anonymous Page의 일정 퍼센트를 스왑 아웃할 수 있다. [ 0 ~ 100 ]
0 : anonymous page 스왑 기능 off
100 : 모든 anonymous page들이 스왑 아웃 가능
설정하지 않으면 호스트 운영체제의 설정 값이 상속되어 사용된다.
--memory-reservation --memory 설정으로 명시한 값보다 작은 값의 soft limit을 명시할 수 있다.
Docker가 contension을 감지하거나 host에서 메모리 가용률이 낮아졌을 때 활성화되며, 이 값은 --memory 설정 값보다 반드시 작아야 한다.
--kernel-memory 컨테이너가 사용할 수 있는 커널 메모리 양을 지정하며, 최소 값은 4MB 이다.
커널 메모리는 스왑 아웃 되지 않기 때문에 지나치게 크게 지정해서는 안된다.
--oom-kill-disable OOM(Out-Of-Memory)이 발생했을 때, 커널이 컨테이너에 존재하는 프로세스를 죽일 것인지 지정할 수 있는 옵션. default = false [ 참고 ]
'Docker' 카테고리의 다른 글
Containerd VS Docker (0) 2022.08.08