04 DVFS
Power consumption of processor
- V와 F를 잘 조절하면, performance는 조금만 희생하고, power efficiency를 크게 개선할 수 있음
DVFS (Dynamic voltage and frequency scaling)
- CPU, GPU 같은 processor가 workload에 따라 voltage와 frequency를 조절하는 technique

DVFS governor
- DVFS를 어떻게 수행할 건지 policy를 정하는 linux kernel subsystem
- linux’s DVFS governor
- performance - 항상 최대 clock freq으로 고정, 최고 성능 but 전력 소모 큼
- powersave - 항상 최저 clock freq으로 고정, 낮은 성능, 전력 절약
- ondemand - 주기적으로 cpu load를 샘플링하면서 load가 크면 freq 높임
- conservative - ondemand랑 비슷하지만 clock을 점진적으로 천천히 올리고 내림
- schedutil - CFS가 계산한 PELT를 이용해서 freq를 즉시 조절
CFS (Completely Fair Scheduler)
vruntime
- 각 task는 vruntime(virtual runtime, weighted cpu time)을 갖는다.
- 실행할 때마다 vruntime이 weight에 비례해 증가한다.
- nice value가 크면 빠르게 증가, 작으면 느리게 증가
- CFS는 항상 가장 작은 vruntime task를 rb tree에서 골라 실행한다.
- 실행이 끝나면 vruntime 업데이트하고, red black tree에 넣는다.
PELT, Per-Entity Load Tracking
- 스케줄러가 cpu의 현재 부하를 파악하기 위해, 각 task가 최근 일정 시간 동안 cpu를 얼마나 사용했는지 추적하는 메커니즘
- task utilization을 계산할 땐 지수 가중 이동 평균(Exponential Weighted Moving Average)로 계산
- 최근 부하일수록 더 큰 비중을 두고, 오래된 부하는 점점 잊어버리게끔
- cpu 하나는 자신 위에 올라온 모든 task의 util_avg를 합산해서 cpu 전체 부하, 즉 util avg를 계산
- PELT utilization (정규화 이전 값) ≠ utilization of /proc/stat or top
- PELT는 단순 % 값이 아님
- uclamp: PELT utilization의 min/max 범위 지정
- 커널은 cpu마다 성능(cpu_capacity)가 다르다는 점을 반영하기 위해 Normalization 진행
- 각 cpu의 util_avg를 그 cpu의 capacity로 나눠서 정규화
- 이 cpu는 상대적으로 얼마나 바쁜가?
- CFS는 이 PELT util을 사용하고, schedutil은 정규화된 util 사용
schedutil
- Scheduler-driven governor
- CFS 스케줄러가 계산한 utilization 결과에 즉시 반응해서, CPU frequency를 실시간으로 조절
- reponsiveness 좋고, less over-boost & energy efficiency
- 다음 freq은 max freq에서 normalized util만큼 사용하겠다

이 C도 고정은 아님