일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- AWS
- asgi
- Deployment
- docker
- intervals
- leetcode
- 쿠버네티스
- K8S
- POD
- elasticsearch
- Kubernetes
- dockerfile
- EKS
- FastAPI
- IAC
- event loop
- Service
- WSGI
- YAML
- kernel
- asyncio
- github
- IAM
- ansible
- 자바스크립트
- Django
- EC2
- terraform
- Python
- ebs
- Today
- Total
궁금한게 많은 개발자 노트
cgroup의 cpu controller (subsystem) 본문
운영 측면에서 모든 리소스가 중요하겠지만 그 중 cpu, memory에 대한 리소스가 가장 중요하다고 생각하실 것 같습니다. 이에 cpu 컨트롤러에 대해 조금 더 자세히 알아보려 합니다. 😎
cpu컨트롤러는 특정 cgroup에 속하는 프로세스의 cpu리소스를 할당하고 제한하는 역할을합니다. 이를 통해 cpu 사용률을 제어하고 프로세스 간 cpu 자원을 균등하거나 특정 비율로 배분할 수 있습니다. 이제 cpu 컨트롤러의 인터페이스 파일을 알아보겠습니다.
cpu.max
- 최대 CPU사용률을 설정하는 파일
- quota period 형식으로 값을 설정
- quota: 주기 동안 사용 가능한 최대 CPU 시간 (마이크로초 단위)
- period: 주기 설정 (마이크로초 단위), 기본값은 100,000마이크로초(0.1초)입니다.(최소 1ms, 최대 1초)
/sys/fs/cgroup/A # cat cpu.max
max 100000 # MAX(QUOTA) PERIOD
echo "50000 100000" > /sys/fs/cgroup/A/cpu.max
위와 같은 경우 첫 번째 예시는 max로 quota를 설정하였으며 0.1초동안 max로 cpu를 사용한다는 의미입니다. 이 때는 throttled상태가 되지 않지만 기간 내 무한히 cpu를 사용한다는 의미는 아닙니다.
두 번째 예시는 0.1초마다 최대 0.05초 cpu를 사용한다는 의미로 cpu사용률을 50%로 제한한다는 의미입니다.
이러한 과정을 kubernetes에서는 spec.containers[].resources.limits.cpu 값을 통해 cpu사용률을 제어하고 있습니다. 마찬가지로 코어의 개수가 아닌 사용률에 대한 제한을 두는 것입니다.
cpu.weight
- 루트 제어 그룹이 아닌 하위 제어그룹에만 존재
- cpu.weight값을 기반으로 cpu를 분배받을 수 있도록 하는 파일 (cpu의 상대적인 할당 비율)
- 1~10000의 값을 지정할 수 있으며 기본값은 100
- 다른 cgroup과 비교하여 cpu리소스를 얼마나 비율적으로 할당 받을 수 있는지 결정
echo $$ > /sys/fs/cgroup/A/cgroup.procs
echo 100 > /sys/fs/cgroup/A/cpu.weight
echo $$ > /sys/fs/cgroup/B/cgroup.procs
echo 200 > /sys/fs/cgroup/B/cpu.weight
위 예시에서는 A, B cgroup에 대해 각각 100, 200의 cpu.weight를 주었습니다. 이 경우에 A만 cpu를 사용한다면 100%를 모두 사용할 수 있겠지만 A, B 모두가 cpu를 사용하는 상황에서는 33.3%, 66.6%로 조정되는 것을 볼 수 있습니다.
마찬가지로 kubernetes에서는 spec.containers[].resource.requests.cpu 값을 통해 이러한 설정을 지원하고 있습니다. 코어의 개수를 설정하는 것이 아니라 다른 container와 비교하여 얼마만큼의 가중치를 가져가냐의 의미입니다.
cpu.stat
- 모든 제어 그룹에 존재하는 읽기 전용 파일
- 각 제어 그룹에 속한 프로세스들이 사용한 cpu관련 통계를 제공 - cpu사용 패턴 모니터링, 성능 최적화 가능
- usage_usec: cpu 총 사용 시간 (마이크로초 단위)
- user_usec: user mode cpu 사용 시간
- system_usec: kernel mode cpu 사용 시간
- nr_periods: cgroup이 cpu를 할당받기 위해 시도한 횟수, 스케줄러에 의해 cpu가 할당된 횟수
- nr_throttled: cpu사용이 제한되어 throttling된 횟수
- throttled_usec: throttling된 시간
- nr_bursts: cpu brust mode로 전환된 횟수
- burst_usec: brust mode에서 사용한 시간
- 실제 container혹은 프로세스에서 사용하는 cpu사용량은 어떻게 구할까요?
- 현재 cpu.stat의 usage_usec 및 현재 시간 마이크로초 산출
- N초 휴식
- N초 뒤 cpu.stat의 usage_usec 및 현재 시간 마이크로초 산출
- usage_usec 차이 / 마이크로초 차이 * 100 = cpu 사용량
위에서 언급된 지표들을 통해 cpu가 어떻게 사용되고 제어되는지 알 수 있었습니다. 그렇다면 cpu throttling은 언제 발생할까요? cgroup이 설정된 cpu사용 한도에 도달하거나 초과했을 때 발생하고 해당 cgroup은 일시적으로 cpu를 사용할 수 없으며 대기해야 합니다.
cpu.max를 통해 주기당 사용할 수 있는 cpu 시간을 설정할 수 있고 cpu.weight가 높은 cgroup일수록 cpu자원 배분에 대한 우선순위를 가져 max quota에 도달할 확률이 높기에 cpu.stat에서 nr_throttled값이 증가하는 결과를 볼 수 있을 것 같습니다. 이러한 다양한 cpu 컨트롤러의 인터페이스 파일을 통해 현재 cpu 사용량을 모니터링하고 제어하여 운영 환경에 맞는 다양한 리소스를 적절히 관리할 수 있으면 좋을 것 같습니다. 긴 글 읽어주셔서 감사합니다 🤗👍
'Operating System' 카테고리의 다른 글
cgroup(control group) 이란? (0) | 2024.11.04 |
---|