1. 程式人生 > >初試:優化高通cpu在MIUI上的配置

初試:優化高通cpu在MIUI上的配置

前言

當前手機硬體日新月異,在我個人看來,某種程度上手機硬體效能已經過剩,手機的效能反而在於軟體上的優化。比如小米4搭載的高通801這款cpu四核2.5GHZ,效能已經不錯,但是由於MIUI對cpu進行無腦的限頻,均衡模式下,關閉兩個核心,其他兩個核心頻率限制在1036MHz,1036MHz!這樣無異於殺雞用牛刀,而且用的是刀柄,連雞都搞不定。估計把效能壓得如此底,廠商也有自己的考慮吧。

正題

經過了一個上午的摸索,也是通曉一二。
下面介紹要修改的cpu配置檔案的含義
主要檔案有
1、thermal-engine-8974.conf(system/etc目錄下 )
2、changepowermode.sh(system/bin目錄下)

1、thermal-engine-8974.conf

用於設定cpu在指定條件下觸發的動作的演算法
MIUI原本配置
其中各個屬性含義:
sampling:取樣時間
[CPU_MONITOR]:演算法例項標籤
algo_type:演算法型別,共有4種: monitor, pid, ss, virtual
sensor:感測器
thresholds: 覺閾值(觸發條件)
thresholds_clr:清除覺閾值(取消觸發的動作的條件)
actions:動作
action_info:動作值

changepowermode.sh

顧名思義,這個檔案就是MIUI切換均衡模式和效能模式的命令檔案。

target=`getprop ro.product.model`
powermode=`getprop persist.sys.aries.power_profile`
dev_governor=`ls /sys/class/devfreq/qcom,cpubw*/governor`
case "$target" in
    "MI 3W" | "MI 3C")
        case "$powermode" in
            "high")
                 echo 2265600                              > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
                 echo
2265600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo 2265600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo 2265600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo 20000 > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay echo 60 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load echo 1190400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq echo 70 > /sys/devices/system/cpu/cpufreq/interactive/target_loads echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time echo 20 > /sys/module/cpu_boost/parameters/boost_ms echo 1728000 > /sys/module/cpu_boost/parameters/sync_threshold echo 1497600 > /sys/module/cpu_boost/parameters/input_boost_freq echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms echo 255 > /sys/class/leds/lcd-backlight/max_brightness echo 578000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk echo "msm_cpufreq" > $dev_governor ;; "middle") echo 2265600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo 2265600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo 2265600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo 2265600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo "20000 1400000:40000 1700000:20000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load echo 1190400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq echo "85 1500000:90 1800000:70" > /sys/devices/system/cpu/cpufreq/interactive/target_loads echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time echo 20 > /sys/module/cpu_boost/parameters/boost_ms echo 1728000 > /sys/module/cpu_boost/parameters/sync_threshold echo 1190400 > /sys/module/cpu_boost/parameters/input_boost_freq echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms echo 255 > /sys/class/leds/lcd-backlight/max_brightness echo 578000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk echo "cpubw_hwmon" > $dev_governor ;; "low") echo 1036800 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo 1036800 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo 1036800 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo 1036800 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo "40000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load echo 960000 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq echo "85 960000:70" > /sys/devices/system/cpu/cpufreq/interactive/target_loads echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time echo 0 > /sys/module/cpu_boost/parameters/boost_ms echo 960000 > /sys/module/cpu_boost/parameters/sync_threshold echo 960000 > /sys/module/cpu_boost/parameters/input_boost_freq echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms echo 100 > /sys/class/leds/lcd-backlight/max_brightness echo 330000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk echo "cpubw_hwmon" > $dev_governor ;; esac ;; "LEO "* | "MI 4"* | "MI NOTE"* | "VIRGO"*) case "$powermode" in "high") stop mpdecision sleep 1 echo 1 > /sys/devices/system/cpu/cpu1/online echo 1 > /sys/devices/system/cpu/cpu2/online echo 1 > /sys/devices/system/cpu/cpu3/online echo 1 > /sys/devices/system/cpu/cpu1/online echo 1 > /sys/devices/system/cpu/cpu2/online echo 1 > /sys/devices/system/cpu/cpu3/online echo 2457600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo performance > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo performance > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo performance > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor echo 20 > /sys/module/cpu_boost/parameters/boost_ms echo 1728000 > /sys/module/cpu_boost/parameters/sync_threshold echo 1497600 > /sys/module/cpu_boost/parameters/input_boost_freq echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms echo 255 > /sys/class/leds/lcd-backlight/max_brightness echo 578000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor echo "msm_cpufreq" > $dev_governor ;; "middle") echo interactive > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo interactive > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo interactive > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo interactive > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor echo 2457600 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo 2457600 > /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo "20000 1400000:40000 1700000:20000" > /sys/devices/system/cpu/cpufreq/interactive/above_hispeed_delay echo 90 > /sys/devices/system/cpu/cpufreq/interactive/go_hispeed_load echo 1190400 > /sys/devices/system/cpu/cpufreq/interactive/hispeed_freq echo "85 1500000:99" > /sys/devices/system/cpu/cpufreq/interactive/target_loads echo 40000 > /sys/devices/system/cpu/cpufreq/interactive/min_sample_time echo 20 > /sys/module/cpu_boost/parameters/boost_ms echo 1497600 > /sys/module/cpu_boost/parameters/sync_threshold echo 1190400 > /sys/module/cpu_boost/parameters/input_boost_freq echo 40 > /sys/module/cpu_boost/parameters/input_boost_ms echo 255 > /sys/class/leds/lcd-backlight/max_brightness echo 578000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk echo msm-adreno-tz > /sys/class/kgsl/kgsl-3d0/devfreq/governor echo "cpubw_hwmon" > $dev_governor start mpdecision ;; esac ;; esac

可以看到 “LEO “* | “MI 4”* | “MI NOTE”* | “VIRGO”*)
case “$powermode” in
“high”)
的部分,這是效能模式下的調節檔案。
“middle”,是均衡模式的部分。

根據changepowermode的內容,可知裡面各個檔案的主要功能:

1、/sys/devices/system/cpu/cpuX/cpufreq/scaling_governor
用於控制cpu0的執行模式
執行模式有6種:interactive,conservative,ondemand,userspace,powersave,performance

2、/sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq
用於控制cpu的最大頻率,頻率從300000~2457600(此為801的範圍,其他型號各異)。系統就是通過這個檔案來限頻,修改此檔案可以修改cpu最高頻率。

3、/sys/devices/system/cpu/cpufreq/interactive/ 下的檔案
above_hispeed_delay:跳到高頻要花的時間(微妙)
go_hispeed_load:是高頻閾值。當系統的負載超過該值,升頻,否則降頻。具體如何升頻、如何降頻,後面介紹。
hispeed_freq:高速狀態的頻率
target_loads:CPU的負載達到設定百分比時進入預設的頻率
min_sample_time:下調頻率的最小時間. 該值設定的越高, CPU降頻越慢. 單位uS, 例如80000=80ms
target_loads: 一般情況下, 調速器根據target_loads引數調整頻率, 負載超過設定值時提高頻率, 反之則下降頻率. 該值設定的越低, CPU越容易提升頻率. 單位:%, 頻率單位:KHz
above_hispeed_delay:當核心保持hispeed_freq超過一定時間(above_hispeed_delay), 且負載依然很高, CPU頻率才會繼續上升.
4、 /sys/module/cpu_boost/parameters/
boost_ms:加速時間
sync_threshold:同步閾值
input_boost_freq:檢測到輸入時加速的頻率
input_boost_ms:檢測到輸入時的加速時間

5、除了以上檔案,我還發現了對防止被系統反覆修改為限頻的兩個很重要的檔案,分別是/sys/devices/system/cpu/cpuX/cpufreq/sys_cap_freq和/sys/devices/system/cpu/cpu0/cpufreq/thermal_capp_freq。
sys_cap_freq:意為系統覆蓋頻率,調了一下里面的引數,發現如果從效能模式返回均衡模式,限頻的就是這個引數
thermal_capp_freq:這個是效能模式的引數,同理。

注意:修改檔案需要使用RE管理器和獲取root。

通過修改上面的引數,解除限頻。經過測試,為了避免參數被系統修改,需要關閉MIUI的神隱模式。
以下是我自用的修改後的截圖,較為激進,當然,保守的也可以自行修改。
thermal-engine-8974.conf

sampling         5000

[CPU0_MONITOR]
algo_type        monitor
sensor           cpu0
sampling         1000
thresholds       55000 60000 65000 70000 85000 105000 115000
thresholds_clr   50000 55000 60000 66000 80000 90000 110000
actions          cpu cpu cpu cpu cpu cpu shutdown
action_info      2457600 2457600 2457600 2457600 1728000 1036800 0

[CPU1_MONITOR]
algo_type        monitor
sensor           cpu1
sampling         65
thresholds       115000
thresholds_clr   110000
actions          shutdown
action_info      0

[CPU2_MONITOR]
algo_type        monitor
sensor           cpu2
sampling         65
thresholds       115000
thresholds_clr   110000
actions          shutdown
action_info      0

[CPU3_MONITOR]
algo_type        monitor
sensor           cpu3
sampling         65
thresholds       115000
thresholds_clr   110000
actions          shutdown
action_info      0

[BATTERY_MONITOR]
algo_type        monitor
sensor           batt_temp
sampling         1000
thresholds       380 395 500 550
thresholds_clr   370 385 450 500
actions          cpu cpu cpu cpu
action_info      2457600  2457600 2457600 2457600

/sys/devices/system/cpu/cpuX/cpufreq/scaling_max_freq

2457600

/sys/devices/system/cpu/cpuX/cpufreq/sys_cap_freq

2457600

其他檔案的保持不變。
效能監視器下截圖:這裡寫圖片描述

完畢。