쿠버네티스 cpu share, cpu limit, cpu requests

김재영·2023년 7월 12일
0

쿠버네티스 자원 기본개념

쿠버네티스는 리눅스 cgroup(control group)을 사용하여 컨테이너 자원을 제한

cgroup 에 있는것들

cpu share

다른 group 에 비해 상대적으로 얼마나 cpu 를 사용하는지 보여줌

ex)

다음과 같이 설정했을때

A: 100

B: 200

B 는 A 보다 2배의 cpu.shares 값을 사용할 수 있음. CPU 관점에서 A는 1/3 , B는 2/3 만큼의 CPU 를 사용할 수 있음.

  • e.g
    실제 계산

그럼 CPU 를 사용한다는 것은 무엇인가?

CPU 를 사용한다는 것은 사용가능한 cpu 시간을 쓰는것
단위 시간동안 얼만큼의 시간을 사용하는지 따져야함.
맨먼스와 비슷함 cpu도 이와 유사하게 계산

cfs_quota_us : 사용시간 제약
cfs_quota_period : 주기

*cfs : completely faired sheduler

e.g) 나는 업무시간 8시간 중에 4시간을 과제에 사용 할 수 있다.
cfs_quota_us : 4
cfs_quota_period: 8

CPU 관점에서 나는 0.5 의 cpu 를 사용한다는 의미

그럼 나한테 6 짜리 일을 시키면? 나는 quota(4) 을 다 소모했기 때문에 남은 거에 대해서는 다음 주기까지 일을 할 수 없고 이를 throttle 이라고 함. throttle 은 cpu.stats 을 통해 확인할 수 있음

cpu requests

apiVersion: v1 
kind: Pod 
metadata: 
	name: test-app 
	spec: 
			containers: 
			- name: db_mysql
				image: mysql 
				resources: 
					requests: 
						memory: "64Mi" 
							cpu: "1500m" 
							limits: 
								memory: "128Mi" 
								cpu: "3000m" 
			- name: wp
				image: wordpress 
				resources: 
					requests: 
						memory: "64Mi" 
							cpu: "3500m" 
							limits: 
								memory: "128Mi" 
								cpu: "7000m"
			- name: dev_fas
				image: fastapi 
				resources: 
					requests: 
						memory: "64Mi" 
							cpu: "5000m" 
							limits: 
								memory: "128Mi" 
								cpu: "10000m"

cpu requests 값에 1000나눠주고 1024 를 곱해주면 이게 cpu.shares

쿠버네티스는 컨테이너들의 cpu 자원 할당을 위와같이 계산하여

해당 값들의 합이 할당 가능한 cpu 갯수*1024 를 넘을 수 없도록 관리한다

(할당가능한 cpu 코어 갯수가 10개인 경우 다음과 같이 할당될 수 있음.)

CONTAINER_NAMECPU REQUESTS(밀리코어)cpu.shares
db_mysql1500m1536
wp3500m3584
dev_fastapi5000m5120

cpu limits

컨테이너가 사용 가능한 최대 cpu 사용량 설정
쿠버네티스는 CFS(completely Faired Scheduler) 를 통해 설정된 limits.cpu 를 적용함

cpu requests 와 마찬가지로 밀리코어 단위로 환산함

이 값을 통해 cpu.cfs_quota_us 를 설정

쿠버네티스는 cfs_period_us 100000us(100ms) 로 고정하기 때문에 1cpu 를 사용하고 싶은 경우 cfs_quota_us 는 100000us 가 됨

사용가능한 cpu (m) = cfs_quota_us / cfs_period_us * 1000 인데 cfs_period 가 쿠버네티스에서 100000ms 로 고정되어 있기 때문에 cfs_quota_us 는 다음과 같이 계산할 수 있음.

cfs_quota_us(us) = cpu (m) * 100

cpu 1밀리코어 = 100us 를 사용

쉽게말해서 쿠버네티스는에서는 cpu 사용 주기가 0.1초(100000us) 이기 때문에 5코어를 쓴다면

cpu quota us 는 5초 , 4코어를 쓴다면 4초, 10코어를 쓴다면 10초가 된다. 단위시간을 us 로 맞춰주기 위해서

limits.cpu(ms) * 100 을 하면 us 기준 cpu 사용가능시간이 나온다는 것

그렇다면 만약에 limits.cpu 값을 두지 않으면 어떻게 될까?

limits.cpu 값을 두지 않게 되면 cpu.cfs_quota_us 값이 -1 로 설정되어 자신이 사용할 수 있는 자원만큼 계속해서 cpu 를 사용하게 됨

*추가적으로 kuberentes docs 에 나와있는 쿠버네티스 자원에 대해 주의 할 점

  • 컨테이너는 리소스 요청값이상으로 자원을 사용할수있지만 제한값이상으로 사용할 수 없다.
  • 제한값 이상으로 사용하려는 경우에 OOM 오류가 나면서 해당 프로세스는 종료된다.
  • 요청값이 지정되지 않으면 제한값이 요청으로 지정된다.
  • 쿠버네티스의 CPU 리소스 가장작은 단위는 1m 이다. 더 정밀하게 표기할 수 없다
    • 따라서 5m 을 사용한다고 표기하는것이 0.005 cpu 코어를 사용한다고 하는것보다 좋다.

0개의 댓글