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 자원을 할당하는 것이 중요할 것 같습니다.
'About > Docker' 카테고리의 다른 글
[Docker] 이미지 레이어 구조 (0) | 2021.05.03 |
---|---|
[Docker] Dockerfile이란 (0) | 2021.05.02 |
[Docker] 실행 중인 컨테이너 한 번에 종료(삭제)하기 (0) | 2021.03.25 |
[Docker] Docker에서 node.js 웹 서버 실행 (1) | 2021.03.21 |
[Docker] Docker에서 Nginx Webserver를 실행해보자. (0) | 2021.03.20 |