Android下設置CPU核心數和頻率

現在的Android手機雙核、四核變得非常普遍,同時CPU頻率經常輕鬆上2G,功耗肯定會顯著增加。而大多數的ARM架構的CPU採用的是對稱多處理(SMP)的方式處理多CPU。這就意味著每個CPU核心是被平等對待的,同時打開又同時關閉。顯然,這樣的做法在Mobile Device上顯得很耗能。所以,Qualcomm的Snapdragon CPU使用了一種叫非對稱多處理(aSMP)的技術,每個CPU核心可以獨立的開啟和關閉,也能設置不同的頻率。因此,針對使用Snapdragon CPU的Android手機,我們可以通過限制CPU核心數或者限制CPU的頻率達到節能的目的。

關閉mpdecision Snapdragon有一個叫做mpdecision的程序管理CPU各個核心的開、關和頻率。所以如果想手動開關CPU的核心或者設置CPU核心的頻率就必須把這個程序關閉。

stop mpdecision 需要注意的是,這個程序會在每次啟動後執行,所以每次重啟後都需要重新執行上面的命令停止mpdecisiopn。

設置CPU的核心數 在/sys/devices/system/cpu目錄下可以看到你的CPU有幾個核心,如果是雙核,就是cpu0和cpu1,如果是四核,還會加上cpu2和cpu3。 隨便進一個文件夾,比如cpu1,裡面有個online文件。我們可以用cat命令查看該文件的內容

cat /sys/devices/system/cpu/cpu1/online

這個文件只有一個數字,0或1。0表示該核心是offline狀態的,1表示該核心是online狀態的。所以,如果你想關閉這個核心,就把online文件的內容改為「0」;如果想打開該核心,就把文件內容改為「1」。

echo "0" > /sys/devices/system/cpu/cpu1/online # 關閉該CPU核心
echo "1" > /sys/devices/system/cpu/cpu1/online # 打開該CPU核心

設置CPU的頻率 首先我們要修改governor的模式,但在修改前需要查下CPU支持哪些governor的模式

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

我用的是Nexus 4手機,所以有以下5個選擇,其他的手機型號可能略有不同

interactive ondemand userspace powersave performance

這裡performance表示不降頻,ondemand表示使用內核提供的功能,可以動態調節頻率,powersvae表示省電模式,通常是在最低頻率下運行,userspace表示用戶模式,在此模式下允許其他用戶程序調節CPU頻率。 在這裡,我們將模式調整為「userspace」。

echo "userspace" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

然後我們對CPU的頻率進行修改,CPU的頻率不是可以任意設置的,需要查看scaling_available_frequencies文件,看CPU支持哪些頻率。

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

從我的手機中可以獲得以下的值 384000 486000 594000 702000 810000 918000 1026000 1134000 1242000 1350000 1458000 1512000 這裡的頻率是以Hz為單位的,我準備將cpu0設置為1.242GHz,那就將1242000寫入scaling_setspeed即可。

echo "1242000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

設置好後,我們可以通過scaling_cur_freq文件查看當前這個核心的頻率

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

最後我們也可以設置下CPU的最大和最小頻率,只需要將需要設置的頻率值寫入scaling_max_freq和scaling_min_freq即可

echo "1350000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq # 設置最大頻率
echo "384000" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq #

設置最小頻率 這裡要注意的是「最大值」需要大於等於「最小值」。

注意,這裡設置的僅為某個CPU核心的頻率,你需要對每個online的CPU核心都進行設置,同時以上對文件的修改均需要root權限。

通過減少online的核心數和限制CPU頻率固然可以起到節省電量的目的,但是性能也是顯著降低,所以需要做一個權衡。