CPU工作模式
简介
在android系统的耗电量排行里,cpu的耗电占了比较大的一部分比例,也就是说,cpu的使用率和使用频率将直接或间接的影响电量的分配和使用,同时也会影响系统的流畅度。android-sdk中没有为android的开发者提供类似cpu管理的功能,但是当下很多省电类应用或专业的cpu管理软件都提供了cpu的降频甚至是超频的功能。
主要的几种CPU调控模式
- ondemand(按需响应模式):系统默认的超频模式,在最大最小频率之间自动调整 (有高级设置 )
- interactive(交流循环模式):只要手机运行频率直接上最高值,然后CPU负荷慢慢降低(系统响应最快,耗电多一些)
- conservative(保守模式):随着CPU负荷加大,逐步提升频率到最高,然后降至最低(系统响应快,耗电比I模式省)
- smartass:是I和C模式的升级,该模式在比i模式不差的响应的前提下会做到了更加省电
- performance(高性能模式):高性能模式,按你设定范围的最好频率运行(机器最流畅,耗电也最大)
- userspace(用户隔离模式):当setcpu处于非工作状态时控制cpu速度的一种方法,官方建议最好不使用该选项
- powersave(省电模式):按设定最小频率低负荷运行,省电但系统响应速度慢
CPU模式查看
查看命令cat [%cpuFreqPath%]/cpuinfo_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq (当前cpu频率)
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq (最大cpu频率)
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq (最小cpu频率)
cat /sys/devices/system/cpu/cpu0/cpufreq/related_cpus (cpu数量标号,从0开始,如果是双核,结果为0,1)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies (cpu所有可用频率)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors (cpu所有可用调控模式)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor (当前使用哪种调控模式)
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency (变频延迟)
MI3的cpu支持6种模式:
c
interactive conservative ondemand powersave userspace performance
普通的andriod机默认的CPU模式为ondemand
,MIUI 7的CPU模式为interactive
,该模式下系统响应最快,所以最直观的效果就是系统更流畅。360手机的CPU也是用的该模式。
CPU模式更改
更改CPU模式需要root权限,如更改cpu调控模式:
c
echo "你想使用的调控模式" /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
需要注意的是,重启后修改的会还原。
GPU工作模式
GPU渲染对电量的影响非常大,长时间使用OPENGL绘制3D动画也是非常非常耗电的,在足够日常使用的前提下适当的调节GPU,会降低手机发热量,达到省电效果。
查看GPU可用频率
高通Gpu支持查看频率和更改,英伟达不支持。
目录/sys/class/kgsl/kgsl-3d0
文件为例说明:
- gpuclk: This prints out the current clock rate for the GPU.
- max_gpuclk: The maximum clock the GPU will pick.
- idle_timer: We're not going to touch this now but this value means the time after the GPU is used to keep the GPU in a 'ready' state. Set it too high and power will be terrible, set it too low and both power AND performance will be terrible. I'd just leave it alone.
- pwrscale/avail_policies: This is a list of available algorithms used for calculating the optimal GPU frequency.
- pwrscale/policy: This is the current algorithm used, probably trustzone. Trustzone means the algorithm is somewhere else out of the kernel so you won't know what it's actually doing.
查看命令:
c
cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies //可用频率
cat /sys/class/kgsl/kgsl-3d0/max_gpuclk //最大频率
cat /sys/class/kgsl/kgsl-3d0/gpuclk //当前频率
...
cat /sys/class/kgsl/kgsl-2d0/gpu_available_frequencies
修改GPU频率
修改gpu最大工作频率:
c
echo 200000000 > /sys/class/kgsl/kgsl-3d0/max_gpuclk
降频一般通过更改最大频率来实现的。
IO Scheduler
io scheduler完全决定了磁盘的读写性能,而这对于用户体验的影响是极大的。
I/O调度的几种算法
cfq
completely-fair-quening完全公平队列,是anticipatory模式的替代品,没有过多的做预测性调度,而是根据给定的进程io优先级,直接来分配操作的顺序。这个模式在linux上表现良好,但也许并不是最适合android的io调度模式,太强调均衡,而降低了连续读写数据的性能。高通默认的就是这个,强烈建议改掉,根本不适合移动设备。
noop
这个调度模式会把所有的数据请求直接合并到一个简单的队列里。不适合有机械结构的存储器,因为没有优化顺序,会增加额外的寻道时间。属于最简单的一个调度模式,无视io操作优先级和复杂性,执行完一个再执行一个,如果读写操作繁多的话,就会造成效率降低。nvidia默认,有时候会造成顿卡,但是这个scheduler对省电比较有帮助。
deadline
顾名思义,用过期时间来排序io操作顺序,保证先出现的io请求有最短的延迟时间,相对于写操作,给读操作更优先的级别。是比较好的一个调度模式,性能不错。
row
read over write,这个scheduler会优先处理读的请求,在移动设备上读的请求远远多于并且重要于写的请求,并且随机读取速度很重要。这个governor允许单或者双线程的读写,在同时有读写的情况下优先保证读,比较适合移动设备。
fiops
fair-iops这个调度器虽然和cfq一样追求平均的优先级,但是是根据闪存设备重新设计的一个governor,各方面表现良好,是列出来的五个scheduler里面性能最好的一个,如果有,强烈推荐fiops。
sio
simple-io在安卓上其实调度器越简单效果越好。sio就是最简单的一个调度器。不过还是有缺点的,就是随即读写性能不太好。在fiops出来以后,这个scheduler基本就被冷落了。
查看调度算法
查看当前系统支持的IO调度算法
c
dmesg | grep -i scheduler
<6>[ 0.364114] C1 [ swapper/0, 1] io scheduler noop registered
<6>[ 0.364120] C1 [ swapper/0, 1] io scheduler deadline registered
<6>[ 0.364131] C1 [ swapper/0, 1] io scheduler row registered (default)
<6>[ 0.364185] C1 [ swapper/0, 1] io scheduler cfq registered
<6>[ 0.364192] C1 [ swapper/0, 1] io scheduler test-iosched registered
查看当前系统的I/O调度方法
c
cat /sys/block/mmcblk0/queue/scheduler
noop deadline [row] cfq test-iosched
其中[]为当前正在使用的调度方法
更改调度方法
更改I/O当前系统调度方法:
c
echo noop > /sys/block/mmcblk0/queue/scheduler
Read Ahead Buffer
按理说缓存应该是越大越好,但是在安卓上好像不是这样,是越大越省电,越小系统越流畅。
查看当前缓存
内置闪存:
cat /sys/block/mmcblk0/quene/read_ahead_kb
SD卡:
cat /sys/block/mmcblk1/quene/read_ahead_kb
修改默认缓存
内置闪存:
echo 你想要的大小 > /sys/block/mmcblk0/quene/read_ahead_kb
sd卡:
echo 你想要的大小 > /sys/block/mmcblk1/quene/read_ahead_kb
MI3默认为512K,如果想省电可以设成2048k。
Demo
一个Demo用于查看和修改cpu,gpu,io,缓存,效果如下: 源码查看: AndroidDeviceInfo