컨테이너 자원 할당 제한 - CPU

mohadang·2022년 4월 10일
0

도커

목록 보기
16/26
post-thumbnail

CPU 가중치(--cpu-shares)

$ docker run -i -t --name cpu_share --cpu-shares 1024 ubuntu:14.04

해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지 설정
즉 컨테이너에 CPU를 한 개씩 할당하는 방식이 아닌, 시스템에 존재하는 CPU를 어느 비중만큼 나눠(share) 쓸 것인지를 명시

아무런 값을 할당하지 않았을 때 컨테이너가 가지는 값은 1024, 이는 CPU 할당에서 1의 비중을 뜻함

EX) 가중치 동작 확인

// 1개의 프로세스로 CPU에 부하를 주는 명령어(stress --cpu 1)
$ docker run -d --name cpu_1024 --cpu-shares 1024 alicek106/stress stress --cpu 1

// 101 만큼 CPU 사용
$ ps aux | grep stress
root 101 stress --cpu 1

// 컨테이너 추가하는데 이전 컨테이너의 할당량에 절반(512)
$ docker run -d --name cpu_512 --cpu-shares 512 alicek106/stress stress --cpu 1

// CPU 할당량이 2 : 1 이 되어 있음
$ ps aux | grep stress
root 69.3 stress --cpu 1
root 33.1 stress --cpu 1

--cpu-shares에 설정된 값의 비율에 따라 컨테이너가 CPU를 사용할 수 있는 비율이 정해진다.

stress 라는 명령어는 CPU와 메모리에 과부하를 주서 성능을 테스트 한다.
$ apt-get install stress

특정 CUP 사용(--cpuset-cpu)

// cpu 1 번째만 사용하는 컨테이너 생성
$ docker run -it --name cpuset_1 --cpuset-cpus=1 ubuntu:14.04
// 테스트를 위한 툴 설치
# root@e97d87f35628:/# apt-get update
# root@e97d87f35628:/# apt-get install stress
# root@e97d87f35628:/# apt-get install htop
// cpu 1 번째만 사용하도록 스트레스 테스트 실행
# root@e97d87f35628:/# stres --cpu 1
// cpu 사용 현황 확인
# root@e97d87f35628:/# htop

호스트에 CUP가 여러 개 있을 때 --cpuset-cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용하도록 설정할 수 있다. CPU 집중적인 작업이 필요하다면 여러 개의 CPU를 사용하도록 설정해 작업을 적절하게 분배하는 것이 좋다.

CPU 할당량(--cpu-period, --cpu-quota)

$ docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000 \
alicek106/stress stress --cpu 1

컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정
--cpu-period, --cpu-quota 옵션으로 이 주기를 변경 하는것이 가능

--cpu-period 기본값 : 100000(100ms)
--cpu-quota : --cpu-period에 설정된 시간 중 CPU 스케줄링에 얼마나 할당할 것인지를 설정

위 예시에서 (--cpu-period=100000) 중 (--cpu-quota=25000) 만큼을 할당해 CUP 주기가 1/4로 줄었으므로 일반적인 컨테이너보다 CPU 성능이 1/4 정도로 감소

EX) 할당량 동작 확인

// CPU 할당량 1/4 컨테이너 생성
$ docker run -d --name quota_1_4 --cpu-period=100000 --cpu-quota=25000 \
alicek106/stress stress --cpu 1
// CPU 할당량 1/1 컨테이너 생성
$ docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 \
alicek106/stress stress --cpu 1
// CPU 할당량 확인 결과 하나는 1/4 성능을 내고 나머지는 1/1 성능을 낸다
$ ps aux | grep stress
root 25.1 stress --cpu 1
root 100 stress --cpu 1

CPU 할당량(--cpus)

--cpu-period, --cpu-quota 보다 좀더 직관적인 옵션

// CPU 성능 1/2 컨테이너 생성
$ docker run -d --name cpus_half --cpus=0.5 alicek106/stress stress --cpu 1
$ ps aux | grep stress
root 49.1 stress --cpu 1

병렬 처리를 위한 CPU 처리 권고

병렬 처리를 위해 CUP를 많이 소모하는 워크로드를 수행해야 한다면 --cpu-share, --cpus, --cpu-period, --cpu-quota 옵션보다는 --cpuset-cpu 옵션을 사용하는 것이 좋다.
--cpuset-cpu 옵션을 사용하면 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성(Affinity)을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문이다

profile
mohadang

0개의 댓글