본문 바로가기

About/Docker

[Docker] Container CPU 제한

docker run --it --name cpu_test1 --cpuset-cpus="0, 3" ubuntu bash

//컨테이너 내부
$apt-get update
$apt-get install stress
$stress -c 2

Docker에서는 리소스를 제한(resource limit)하여 Container 생성 및 실행이 가능합니다.

 

  • Container를 run 혹은 create 하는 경우 자원 할당량 가능 (생성 후 변경 시 update 이용)
  • 옵션 미 지정 시 Container는 Host OS의 자원을 제한 없이 사용 가능
  • 컨테이너의 리소스를 제한하는 기능은 Linux의 cgroups 기능 활용

Container CPU 제한

  • CPU 스케쥴링이란 자원을 어떤 프로세스에 얼마나 할당하는지 정책을 만드는 작업
  • --cpu-share (혹은 -c)옵션을 사용
  • 기본값은 1024로 CPU 할당 비율 1을 의미
    ex) 2048 설정 후 CPU 작업 시 일반 Container 보다 2배 많은 시간을 할당한다는 의미
  • 예시
    --cpu-shares=1024  -> 기본 할당 비율
    --cpu-shares=2048  -> 기본 보다 CPU 두 배 사용
docker run -d --name cpu_1024 --cpu-shares 1024 ubuntu
docker run -d --name cpu_512 --cpu-shares 512 ubuntu

위와 같이 두 컨테이너 실행 시 첫 번째 컨테이너가 두 번째 컨테이너 보다 cpu로부터 2배 많은 시간을 할당받습니다.

 

  • Host에 CPU가 여러 개 있는 경우 --cpuset-cpus 옵션을 이용하여 container가 특정 CPU만 사용하도록 지정 가능
  • CPU에 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정하여 작업을 적절하게 분배하는 것이 좋음
  • 예시
    --cpuset-cpus="0,3" -> 1, 4번째 CPU 사용
    --cpuset-cpus="0-2" -> 1, 2, 3번째 CPU 사용
  • --cpus 옵션을 이용하여 cpu 사용 비율을 지정할 수도 있습니다.
  • 예시
    --cpus=0.2 -> cpu를 0.2개 만큼(20%) 사용 
  • 기존에 실행 중인 container의 자원을 조정하고자 한다면 docker update를 이용
// cpu 1개만 사용하도록 변경
docker update --cpuset-cpus=1 [container_name] 

// cpu 사용량을 0.5 비율로 사용하도록 변경
docker update --cpu-shares 512 [container_name]

// cpu 사용량을 20% 비율로 사용하도록 변경
docker update --cpus=0.2 [container_name]
  • cpu-period(CFS 스케쥴러 period)cpu-quota(CFS 스케쥴러 쿼터) 옵션을 이용하여 제한하는 것도 가능합니다.(다루지 않습니다.)

 


Ubuntu 컨테이너를 생성한 후 cpu 부하테스트 프로그램인 stress를 통하여 cpu에 부하를 주고,
Host OS의 htop 프로그램을 통해 CPU 사용량 확인해보겠습니다.

 

Ubuntu 컨테이너에서 stress를 사용하는 방법은 다음과 같습니다.

//Ubuntu 컨테이너 내부

apt-get update
apt-get install stress
stress -c [CPU개수]

- 1, 4번째 코어를 CPU를 사용하는 컨테이너 생성 후 테스트

docker run --it --name cpu_test1 --cpuset-cpus="0, 3" ubuntu bash

//컨테이너 내부
$apt-get update
$apt-get install stress
$stress -c 2

 결과 - htop 확인 (Host OS)

1, 4번째 CPU에 부하가 걸린 것을 확인할 수 있습니다.

 

그렇다면 같은 컨테이너에서 stress가 cpu를 4개 사용하도록 해보겠습니다.

//Ubuntu 컨테이너 내부
$stress -c 4

컨테이너 생성 시 0, 3(1, 4번째) cpu만 사용하도록 설정하였기 때문에

stress가 cpu 4개에 부하를 주었지만 1, 4번 cpu에만 부하가 걸린 것을 확인할 수 있습니다.

 

- 1~4번 째 코어를 CPU를 사용하는 컨테이너 생성 후 테스트

docker run --it --name cpu_test1 --cpuset-cpus="0-3" ubuntu bash

//컨테이너 내부
$apt-get update
$apt-get install stress
$stress -c 4

1, 2, 3 ,4번 cpu 모두 부하가 걸린 것을 확인할 수 있습니다.

 

docker update를 이용하여 위 컨테이너의 cpu 할당량을 변경해보겠습니다.

docker update --cpus=0.2 [컨테이너명]

컨테이너가 0.2 만큼의 cpu를 사용하도록 제한하였기 때문에 각 cpu가 5%를 사용하도록 변경되었습니다.(합 20%)

 

다시 4개의 cpu를 모두 사용하도록 변경하겠습니다.

docker update --cpus=4 [컨테이너명]

이 후 5, 6 ,7 8번 cpu를 사용하도록 변경하겠습니다.

docker update --cpuset-cpus=4-7 [컨테이너명]

5, 6, 7 ,8번 cpu에 부하가 걸린 것을 확인할 수 있습니다.

 


컨테이너의 자원 중 CPU를 관리하는 방법에 대해 다루었습니다.
컨테이너의 활용 목적에 따라 적합한 CPU 자원을 할당하는 것이 중요할 것 같습니다.