安卓CPU,GPU,IO,缓存工作模式查看与修改

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

1
2
3
4
5
6
7
8
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种模式:

1
interactive conservative ondemand powersave userspace performance

普通的andriod机默认的CPU模式为ondemand,MIUI 7的CPU模式为interactive,该模式下系统响应最快,所以最直观的效果就是系统更流畅。360手机的CPU也是用的该模式。

CPU模式更改

更改CPU模式需要root权限,如更改cpu调控模式:

1
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.

查看命令:

1
2
3
4
5
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最大工作频率:

1
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调度算法

1
2
3
4
5
6
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调度方法

1
2
cat /sys/block/mmcblk0/queue/scheduler
noop deadline [row] cfq test-iosched

其中[]为当前正在使用的调度方法

更改调度方法

更改I/O当前系统调度方法:

1
echo noop > /sys/block/mmcblk0/queue/scheduler

Read Ahead Buffer

按理说缓存应该是越大越好,但是在安卓上好像不是这样,是越大越省电,越小系统越流畅。

查看当前缓存

1
2
3
4
5
内置闪存:
cat /sys/block/mmcblk0/quene/read_ahead_kb

SD卡:
cat /sys/block/mmcblk1/quene/read_ahead_kb

修改默认缓存

1
2
3
4
5
内置闪存:
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
源码查看: AndroidDeviceInfo