cpufreq 五種模式和手動提升效能指令碼
cpufreq是一個動態調整cpu頻率的模組,系統啟動時生成一個資料夾/sys/devices/system/cpu/cpu0/cpufreq/,裡面有幾個檔案,其中:
scaling_min_freq代表最低頻率,
scaling_max_freq代表最高頻率,
scalin_governor代表cpu頻率調整模式,用它來控制CPU頻率
其中
1.performance
顧名思義只注重效率,將CPU頻率固定工作在其支援的最高執行頻率上,而不動態調節。
2.powersave
將CPU頻率設定為最低的所謂“省電”模式,CPU會固定工作在其支援的最低執行頻率上。因此這兩種governors 都屬於靜態governor,即在使用它們時CPU 的執行頻率不會根據系統執行時負載的變化動態作出調整。這兩種governors 對應的是兩種極端的應用場景,使用performance governor 是對系統高效能的最大追求,而使用powersave governor 則是對系統低功耗的最大追求。
3.Userspace
最早的cpufreq 子系統通過userspace governor為使用者提供了這種靈活性。系統將變頻策略的決策權交給了使用者態應用程式,並提供了相應的介面供使用者態應用程式調節CPU 執行頻率使用。也就是長期以來都在用的那個模式。可以通過手動編輯配置檔案進行配置
4.ondemand
按需快速動態調整CPU頻率, 一有cpu計算量的任務,就會立即達到最大頻率執行,等執行完畢就立即回到最低頻率;ondemand:userspace是核心態的檢測,使用者態調整,效率低。而ondemand正是人們長期以來希望看到的一個完全在核心態下工作並且能夠以更加細粒度的時間間隔對系統負載情況進行取樣分析的governor。 在 ondemand governor 監測到系統負載超過 up_threshold 所設定的百分比時,說明使用者當前需要 CPU 提供更強大的處理能力,因此 ondemand governor 會將CPU設定在最高頻率上執行。但是當 ondemand governor 監測到系統負載下降,可以降低 CPU 的執行頻率時,到底應該降低到哪個頻率呢? ondemand governor 的最初實現是在可選的頻率範圍內調低至下一個可用頻率,例如 CPU 支援三個可選頻率,分別為 1.67GHz、 1.33GHz 和 1GHz ,如果 CPU 執行在 1.67GHz 時 ondemand governor 發現可以降低執行頻率,那麼 1.33GHz 將被選作降頻的目標頻率。
5.conservative
與ondemand不同,平滑地調整CPU頻率,頻率的升降是漸變式的,會自動在頻率上下限調整,和ondemand的區別 在於它會按需分配頻率,而不是一味追求最高頻率。
檢視當前的調節器: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
更改使用的調節器,需再更改scaling_governor檔案: echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- stop thermald
- stop mpdecision
- stop thermal-engine
- # online A57
- echo 1 > /sys/devices/system/cpu/cpu2/online
- echo 1 > /sys/devices/system/cpu/cpu3/online
- echo 1 > /sys/devices/system/cpu/cpu4/online
- echo 1 > /sys/devices/system/cpu/cpu5/online
- echo 1 > /sys/devices/system/cpu/cpu6/online
- echo 1 > /sys/devices/system/cpu/cpu7/online
- # set governor
- echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
- echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor
- # set max freq
- echo 1555200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
- echo 1958400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq
- # set gpu
- echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor
- echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel
- echo performance > /sys/class/devfreq/qcom,cpubw.32/governor
- echo performance > /sys/class/devfreq/qcom,gpubw.71/governor
- echo performance > /sys/class/devfreq/qcom,kgsl-busmon.70/governor
cpu0會一直線上,因此不用手動online。
8994的cpu頻率是按簇調整的,因此只需要設定cpu0和cpu4的performance。
拉起來的瞬間可能會觸發bcl的調頻和拔核動作,全部拉起來後可能溫度過高導致thermal降頻及拔核。
另外,vendor/qcom/proprietary/android-perf/core-ctl/core_ctl.c的某些程式碼可能會引起拉核失敗或者拉上來後又被這個模組給down了,需要做如下修改:
將753行cpu_callback()的CPU_UP_PREPARE分支裡的如下判斷改成if(0),這可以防止拉核失敗:
將該檔案try_hotplug()函式裡的do_hotplug()取消掉,可以防止該模組又把拉上來的cpu給offline了。
不過如此修改程式碼後,需要手動降低效能:
- #offline A57
- echo 0 > /sys/devices/system/cpu/cpu4/online
- echo 0 > /sys/devices/system/cpu/cpu5/online
- echo 0 > /sys/devices/system/cpu/cpu6/online
- echo 0 > /sys/devices/system/cpu/cpu7/online
- # down max freq
- echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
- echo simple_ondemand > /sys/class/kgsl/kgsl-3d0/devfreq/governor
- echo 5 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel
- stop thermald
- stop mpdecision
- stop thermal-engine
- # online A57
- echo 1 > /sys/devices/system/cpu/cpu2/online
- echo 1 > /sys/devices/system/cpu/cpu3/online
- echo 1 > /sys/devices/system/cpu/cpu4/online
- echo 1 > /sys/devices/system/cpu/cpu5/online
- echo 1 > /sys/devices/system/cpu/cpu6/online
- echo 1 > /sys/devices/system/cpu/cpu7/online
- # set governor
- echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
- echo performance > /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor
- # set max freq
- echo 1555200 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
- echo 1958400 > /sys/devices/system/cpu/cpu4/cpufreq/scaling_max_freq
- # set gpu
- echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor
- echo 0 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel
- echo performance > /sys/class/devfreq/qcom,cpubw.32/governor
- echo performance > /sys/class/devfreq/qcom,gpubw.71/governor
- echo performance > /sys/class/devfreq/qcom,kgsl-busmon.70/governor
cpu0會一直線上,因此不用手動online。
8994的cpu頻率是按簇調整的,因此只需要設定cpu0和cpu4的performance。
拉起來的瞬間可能會觸發bcl的調頻和拔核動作,全部拉起來後可能溫度過高導致thermal降頻及拔核。
另外,vendor/qcom/proprietary/android-perf/core-ctl/core_ctl.c的某些程式碼可能會引起拉核失敗或者拉上來後又被這個模組給down了,需要做如下修改:
將753行cpu_callback()的CPU_UP_PREPARE分支裡的如下判斷改成if(0),這可以防止拉核失敗:
將該檔案try_hotplug()函式裡的do_hotplug()取消掉,可以防止該模組又把拉上來的cpu給offline了。
不過如此修改程式碼後,需要手動降低效能:
- #offline A57
- echo 0 > /sys/devices/system/cpu/cpu4/online
- echo 0 > /sys/devices/system/cpu/cpu5/online
- echo 0 > /sys/devices/system/cpu/cpu6/online
- echo 0 > /sys/devices/system/cpu/cpu7/online
- # down max freq
- echo 960000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
- echo simple_ondemand > /sys/class/kgsl/kgsl-3d0/devfreq/governor
- echo 5 > /sys/class/kgsl/kgsl-3d0/min_pwrlevel