Android에서 시스템의 전력 소비와 발열을 줄이기 위해 CPU Frequency Governor를 조정할 수 있다.
아래의 종류 외에도 다양한 Governor가 있으나, 우선은 현재 플랫폼을 조회했을 때 사용가능한 Governor를 우선적으로 확인한다. 현재는 CPU의 최고 성능을 발휘하는것이 목표이기 때문에 performace를 사용하며, 발열에 대한 시나리오를 별도로 적용하여 사용한다.
: 기본적으로 Linux 커널의 CPU governor 시스템을 확장한 형태로, 스케줄러와의 긴밀한 연동을 통해 성능과 전력 소비의 균형을 맞추는 데 중점을 둔 솔루션이다. 고성능이 요구되는 모바일 기기나 전력 효율성이 중요한 임베디드 시스템에서 주로 사용됩니다.
: CPU 주파수를 점진적으로 조정하는 솔루션이다. 급격한 주파수 변화를 피하고, 필요에 따라 천천히 주파수를 올리거나 내립니다. 전력 소비를 최소화하는 데 중점을 두고 설계되었습니다. 가능한 한 낮은 주파수를 유지하며, 성능 요구가 높을 때만 주파수를 높입니다. 시스템 부하가 변화할 때, conservative governor는 이를 감지하고 적응형으로 반응합니다. 주로 전력 효율성이 중요한 시스템에서 사용됩니다.
: CPU 주파수를 가능한 한 낮은 수준으로 유지합니다. 이는 전력 소비를 최소화. 전력 효율성을 극대화하여, 성능보다는 전력 소비를 줄이는 데 중점을 둡니다. 이는 특히 배터리 기반 장치에서 사용됩니다. (performance의 반대)
: CPU 주파수를 항상 최대 수준으로 유지하여 시스템이 최고 성능을 발휘하도록 합니다. CPU가 언제나 최대 주파수로 동작하기 때문에 시스템의 반응 시간이 매우 짧습니다. 이는 실시간 응답성이 중요한 시스템에서 사용됩니다.
: CPU 스케줄러와 직접 통합되어, 작업 부하에 따라 주파수를 동적으로 조정합니다. 이는 더 빠르고 정확한 주파수 조정을 가능하게 합니다. 작업 부하 변화에 빠르게 반응하여 필요한 경우 성능을 보장하고, 부하가 줄어들면 전력 소비를 줄입니다 성능과 전력 소비 간의 균형을 맞추기 위해 CPU 사용률을 기반으로 주파수를 조절합니다.
freqency list는 보통 dts file에 정의되어있다. 단위는 KHz이다.
ex. 2000000 = 2.0GHx
(dts file에 대한 분석은 추후 정리 필요)
# Read/Write 를 위해 root 권한을 가져야함.
$ su
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
2000000 1900000 1800000 1700000 1600000 1500000 1450000 1400000 1350000 1300000 1250000 1200000 1150000 1100000 1050000 1000000 950000 900000 850000 800000 750000 700000 650000 500000
최대 또는 최소 freqency를 설정한다. 각 CPU별로 설정이 가능하다.
# Max Freqnecy 설정
$ echo 2000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
# Min Freqnecy 설정
$ echo 1300000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
# Read/Write 를 위해 root 권한을 가져야함.
$ su
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
sugov_ext conservative powersave performance schedutil
cat을 입력하여 조회, echo [governor_name]을 입력하여 governor를 변경할 수 있다.
$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
sugov_ext
# 값 변경 (performance)
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor