CPU目录
查看数据
在手机上,我们可以进入adb shell查看cpu相关信息,例如
在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心,如果是双核,就是cpu0和cpu1,如果是四核,还会加上cpu2和cpu3,像我们手中现在这部手机就是八核的。
可以进入present查看设备最多支持多少个CPU
可以进入online查看哪些CPU在线,反之也可以进入offline查看不在线的CPU
其他
高通平台的话在cpufreq目录下面有/interactive目录可以设置升频降频的延时以及一些其他操作
单个CPU目录
cpufreq
开启核心
进入单个cpu后,可以查看单独核心的内容
online里的内容代表这个核心有没有被开启,0代表关闭,1代表开启。
我们也可以运用命令来调整它的状态
echo 0 > /sys/devices/system/cpu/cpu0/online # 关闭该核心
echo 1 > /sys/devices/system/cpu/cpu0/online # 打开该核心
其余参数可以进入cpufreg查看
- cpuinfo_min_freg cpu最小频率
- cpuinfo_max_freg cpu最大频率
- cpuinfo_cur_freg cpu当前频率
- cpuinfo_transition_latency:该文件定义了处理器在两个不同频率之间切换时所需要的时间 (单位: 纳秒)
- scaling_available_frequencies:所有支持的主频率列表 (单位: 千赫兹)
- scaling_available_governors:该文件显示当前内核中支持的所有cpufreq governor类型
- scaling_cur_freq:被governor和cpufreq核决定的当前CPU工作频率。该频率是内核认为该CPU当前运行的主频率
- scaling_driver:该文件显示该CPU正在使用何种cpufreq driver
- scaling_governor:通过echo命令,能够改变当前处理器的governor类型
- scaling_max_freq:显示当前policy的上下限 (单位: 千赫兹)需要注意的是,当改变cpu policy时,需要首先设置scaling_max_freq, 然后才是scaling_min_freq
- scaling_setspeed:如果用户选择了“userspace” governor, 那么可以设置cpu工作主频率到某一个指定值。只需要这个值在scaling_min_freq 和 scaling_max_freq之间即可
governor
前面我们说到,scaling_available_governors可以显示当前内核中支持的所有cpufreq governor类型,那么原生支持的cpufreq governor有哪些呢
在本机器中,总共支持5种
ondemand userspace powersave performance schedutil
各个项目有所不同,具体查看自己手机内所支持的governor。
- performance :只注重效率,将CPU频率固定工作在其支持的最高运行频率上,而不动态调节。
- powersave:将CPU频率设置为最低的所谓“省电”模式,CPU会固定工作在其支持的最低运行频率上,而不动态调节。
- Userspace:最早的cpufreq 子系统通过userspace governor为用户提供了这种灵活性。系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU 运行频率使用。也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
- ondemand :按需调节cpu频率,不操作手机的时候控制在最低频率,滑屏或进入应用后会迅速提升至最高频率,当空闲时迅速降低频率,性能较稳定,但因频率变化幅度过大,省电方面只有一般的水平。是一种在电池和性能之间趋向平衡的默认模式,但是对于智能手机来说,ondemand在性能表现方面略有欠缺。
- schedutil:这一个方式是linux kernel 4.7中被合入的,它直接使用来自scheduler的负载数据加速调频,支持从中断上下文直接切换频率机制,可以进一步缩短调频的时延。加强了功耗和性能的表现,同时增强了二者。
具体可以参考文章https://deepinout.com/android-system-analysis/android-cpu-related/principle-analysis-of-cpu-governor-schedutil.html
在此项目中默认使用的是schedutil。
我们也可以通过命令去改变它的策略
echo userspace(或者其他策略) > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
然后使用命令去查看更改是否成功
cat scaling_governor
频率
首先,我们可以通过
cpuinfo_min_freg cpu
cpuinfo_max_freg cpu
cpuinfo_cur_freg
去查看CPU的最大、最小、当前频率,并且可以通过
scaling_available_frequencies
查看cpu支持的频率
那么我们如果要调整cpu的频率,我们首先需要进入用户模式,也就是将governor调整至userspace
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
然后
echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 1000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
我们就可以看到cpu频率发生改变了,但是这个频率设定要在支持范围之内
mtk芯片配置app白名单路径
vender/mediatek/proprietary/hardware/power/config/mt[xxxx]/app_list
在这个名单目录里面,我们可以对特定的APP进行调整和配置
例如这一个配置,就是对zee5APP的配置(百度出来是一个印度的视频点播软件),这个软件只调整了CPU频率,还有其他的软件调整了帧率或者DDR或者GPU。
在这张图里面这两个参数的意思分别是
PERF_RES_CPUFREQ_MIN_CLUSTER_0: 是对小核频率的最小值的修改,也就是在运行这个软件时CPU的最小频率也会达到1.4GHz
PERF_RES_CPUFREQ_MIN_CLUSTER_1: 是对大核频率的最小值的修改,也就是在运行这个软件时CPU的最小频率也会达到1.4GHz
若CPU最高频率不到1.4GHz,则默认最高频运行
那么由此我们可以延展出更多的参数含义
Resource ID | 含义 | 更改方案 |
---|---|---|
PERF_RES_CPUFREQ_PERF_MODE CPU | 高性能模式 | 1:开启,打开CPU所有核心并且拉到最高频 |
PERF_RES_CPUCORE_MIN_CLUSTER_0 | 使用的最少CPU小核数量 | |
PERF_RES_CPUCORE_MIN_CLUSTER_1 | 使用的最小CPU大核数量 | |
PERF_RES_CPUCORE_MAX_CLUSTER_0 | 使用的最多CPU小核数量 | |
PERF_RES_CPUCORE_MAX_CLUSTER_1 | 使用的最多CPU大核数量 | |
PERF_RES_SCHED_PREFER_IDLE_TA | 倾向于向顶级应用使用空闲CPU | 0代表不可用 1代表开启 |
PERF_RES_SCHED_PREFER_IDLE_FG | 倾向于向前台应用使用空闲CPU | 0代表不可用 1代表开启 |
PERF_RES_SCHED_BOOST | 设置大核优先 | 默认是0 ,0代表不可用,1代表倾向于所有任务都放在大核上处理,2代表通过CPUSET将top和fg应用放在大核上 |
这里的参数都是core number,输入想要使用的核数量 |
DDR
在mtk的官网,我们可以找到查找到有关CPU、DDR或者GPU的相关命令,但是这里有一个问题,那就是现在手上接触的是KI7项目,它的内核kernel是-4.x版本的,而mtk给的标准查看DDR命令是-5.x版本的,所以我们要进行一些对应的更改
更改DDR频率
如果要将DDR频率调至对大,则
adb shell “echo 0 > /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_req_ddr_opp”
查看当前的DDR频率(Current)
adb shell “cat /sys/devices/platform/10012000.dvfsrc/helio-dvfsrc/dvfsrc_dump | grep -e uv -e khz”
但是,如果要查看内核kernel版本为-5.x版本的话,指令就要分别改为
adb shell “echo 0 > /sys/kernel/helio-dvfsrc/dvfsrc_force_vcore_dvfs_opp”----------将DDR频率调至最大
adb shell “cat /sys/kernel/helio-dvfsrc/dvfsrc_dump | grep -e uv -e khz” 查看当前的DDR频率
在代码中提高DDR频率
在kernel层中:
参考 kernel-4.14/drivers/misc/mediatek/usb_boost/v1/usb_boost_plat.c
1) Makefile:
ccflags-y += -I$(srctree)/drivers/devfreq/
2) kernel usage:
#include <linux/pm_qos.h>
#include "helio-dvfsrc-opp.h"
static struct pm_qos_request xxx_ddr_req;
pm_qos_add_request(&xxx_ddr_req, PM_QOS_DDR_OPP_DEFAULT_VALUE);
pm_qos_update_request(&xxx_ddr_req, DDR_OPP_0); //LP4-3200, LP3-1866, 最高檔
pm_qos_update_request(&xxx_ddr_req, DDR_OPP_1); //LP4-2400, LP3-1600 or above
pm_qos_update_request(&xxx_ddr_req, DDR_OPP_3); //LP4-1600, LP3-1200 or above
pm_qos_update_request(&xxx_ddr_req, DDR_OPP_UNREQ); //un-request, or PM_QOS_DDR_OPP_DEFAULT_VALUE
可以参考:
static int vcorefs_hold(struct act_arg_obj *arg)
{
pm_qos_update_request(&pm_qos_ddr_req, DDR_OPP_0);
return 0;
}
static int vcorefs_release(struct act_arg_obj *arg)
{
pm_qos_update_request(&pm_qos_ddr_req, DDR_OPP_UNREQ);
return 0;
}
注意:vcorefs_hold 和 vcorefs_release要对应起来,否则会有power问题。
在java代码中更改,要查看mtk官网中给的接口怎么使用,每个版本都有区别
GPU
GPU也就是图形处理器,我们一般俗称“显卡”,一款GPU的好坏,主要取决于它的多边形生成能力和像素渲染能力。
一般来说GPU的使用都是正常的,如果不对劲就要check GPU 。
如下两种情况需要check GPU:
1、 wait for GPU completion 时间超过1个vsync, 且没有hwc release时间长
若有hwc release 时间长,需要check SurfaceFlinger
2、GPU相关function 除runnable以外的持续时间较对比机长
若有runnable时间长,则需要check runnable 时间长的原因
方法为
确认是GPU处理时间长,可以先boost GPU试试看,不管是否有效,可以将结果带给GPU owner。
boost方式为:
adb shell “cat /proc/gpufreq/gpufreq_opp_dump” //确认GPU所支持的档位
[0] freq = 850000, volt = 80000, vsram = 90000, gpufreq_power = 935
[1] freq = 823000, volt = 78750, vsram = 88750, gpufreq_power = 885
adb shell “echo 850000 > /proc/gpufreq/gpufreq_opp_freq” //将最大值设置下去,因platform不同,所支持的最大值不同
如果GPU频率/gpu_time与对比机明显有差异,可以尝试调整GPU policy:
/
//Game APP是否配置了 GPU min/max freq,如果有,尝试调整GPU min/max档位,提升performance or 降低power
// loading-based margin (非单一 render thread),拉频预留的天花板百分比
// 数字越大,性能越好,但功耗会变差 ,表示gpu loading (100-50)=50% 时, 会拉一次gpu freq
// 默认30 ,表示loading达到 70%的时候就开始升4档
// 本参数和PERF_RES_GPU_GED_TIMER_BASE_DVFS_MARGIN配合使用,每次会拉高几个档位调频,数字越大,越for GPU performance,相对power越多
// GPU DVFS margin value with frame-based margin,多线程版本用loading base,其它用 framebase, 预留的GPU能力,对应节点是/sys/kernel/debug/ged/hal/dvfs_margin_value
// 百位1~5 表示 dynamic margin,即加1%~30%
// margin越大表示gpu 调频越积极, 当然功耗也会上去一些,默认是130。