본문 바로가기
IT/Docker

Docker container CPU resource limitation (도커 CPU 사용량 조절)

by halizy 2018. 7. 17.



Docker CPU resource limitation 


Linux 서버는 기본적으로 CFS(Completely Fair Scheduler)를 이용하여 CPU Scheduling 를 하는데 

Docker host에 올라간 컨테이너의 CPU Scheduling도 CFS를 이용한다

하나의 Docker host 안에서 실행중인 Container들의 CPU Scheduling 제어는 CPU 사용량 조절을 위해 반드시 필요하다 


Docker는 아래의 항목으로 컨테이너의 사용량 조절이 가능하다


항목 (실행옵션)


1. propotion (--cpu-share)

2. period (--cpu-period)

3. quota (--cpu-quota)

4. cpuset (--cpuset-cpus)


각 옵션들에 대한 정보는 아래와 같다


 [--cpu-share]


기본적으로 모든 컨테이너는 CPU Cycle의 동일한 비율을 가진다.

이 비율을 컨테이너의 cpu share 가중치로 변경이 가능하며 이 값은 다른 실행 중인 모든 컨테이너의 가중치와 연관된다


default 1024를 변경하기 위해 -c, --cpu-share 플래그를 이용하여 2 또는 그것보다 높게 지정한다.

0으로 지정되어있으면 시스템은 무시하고 1024를 사용한다.


비율 적용은 cpu-intensive process가 실행 될 때만 적용된다


컨테이너의 task가 idle 상태이면 다른 컨테이너가 남은 cpu time을 사용 할 수 있다.

CPU time의 실제 양은 시스템에서 실행되는 컨테이너의 수에 따라 달라진다.


multi-core system에서 cpu time의 share는 모든 cpu core에 걸쳐 분산된다


container가 cpu time의 100% 보다 작게 제한되어도 그것은 각 개별 cpu core의 100%를 사용 할 수 있다.


3 container 1024 512 512 each proportion on 1 core

50% 25% 25%


1 container 1024 추가

33% 16.5% 16.5% 33%



 [--cpu-period]


default cpu CFS(completely Fair scheduler) period is 100ms (100000)


--cpu-period를 이용해서 container의 cpu 사용량을 제한하기위해 CPU period를 지정 할 수 있다.

그리고 --cpu-period는  --cpu-quota화 함께 동작한다.


ex)

$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash

  -> 매 50mx 의 50% CPU 사용량 획득


CFS의 period와 quota bandwidth


하나의 group에 허락된 bandwidth는 quota와 period를 사용하여 구체화 된다.

각 주어진 period (microseconds) 안에서, 하나의 그룹은 오직 cpu time의 quota(microsecond) 까지만 사용이 허용된다. 


group의 cpu bandwidth의 소비가 limit를(그 period의) 넘어서면, 그 group의 하이라키에 속해 있는 모든 작업들은 

목졸라 지고 다음 period까지 실행이 불가능해진다.


하나의 group이 사용하지 않는 runtime은 글로벌하게 트래킹된다. 

 

참고: https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt


[--cpu-quota]


--cpu-quota 플래그는 container의 cpu사용량을 제한한다. 


deafult 0이고 이것은 container가 1 cpu resource의 100% 가지게 한다. 

CFS는 프로세스들의 실행을 위한 리소스 할당을 처리하고, cfs는 기본적으로 kernel에 의해 사용되는 linux scheduler이다.


container는 cpu resource의 50% 까지 제한하기 위해  이 값을 50000으로 지정한다. 

multiple cpu들을 위해서 --cpu-quota의 조정은 필요하다. (ex --cpu-period=100000 --cpu-quota=200000)


[--cpuset-cpus]


이 플래그로 container들의 실행을 허용가능한  cpu들을 지정할 수 있다. 

(컨테이너가 사용 가능한 cpu를 지정할 수 있다)


ex)

$ docker run -ti --cpuset-cpus="0-2" ubuntu:14/04 /bin/bash 

  -> 0, 1, 2 cpu 사용가능)






댓글