Android/Linux Thermal框架分析及其Governor对比
图表 1 Thermal框架
随着SoC性能的快速提升,功耗也极大提高,带来的负面影响是SoC的温度提高很快,甚至有可能造成物理损坏。同时功耗浪费也降低了电池寿命。
从上图可知,Thermal框架可以分为Thermal Core、Thermal Governor、Thermal Cooling、Thermal Driver以及Thermal Device Tree五大部分。
Thermal Core作为User Space和Kernel的接口,同时也是Thermal框架的中枢。Thermal Driver负责为整个框架读取温度作为输入,同时从DT中读取参数注册设备,一般一个Thermal Driver对应一个Thermal Zone。Thermal Governor提供多种可选Governor:Power Allocator、Step Wise、User Space等。Thermal Cooling是作为Thermal框架的输出,在PC上可能有风扇作为Cooling设备,但是在移动设备主要是通过降频降压来实现降低功耗,作为Cooling设备;目前Cooling设备可以是CPU、devfreq、clock等。从中我们可以看到的是,Thermal Driver作为输入设备,Cooling设备作为输出设备,两个都是跟SoC相关的。
Thermal相关Feature内核配置:
# CONFIG_SENSORS_ACPI_POWER is not set CONFIG_THERMAL=y CONFIG_THERMAL_HWMON=y CONFIG_THERMAL_OF=y CONFIG_THERMAL_WRITABLE_TRIPS=y # CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE is not set # CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set # CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y # CONFIG_THERMAL_GOV_FAIR_SHARE is not set CONFIG_THERMAL_GOV_STEP_WISE=y # CONFIG_THERMAL_GOV_BANG_BANG is not set CONFIG_THERMAL_GOV_USER_SPACE=y CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y CONFIG_CLOCK_THERMAL=y # CONFIG_THERMAL_EMULATION is not set CONFIG_HISI_THERMAL=y # CONFIG_IMX_THERMAL is not set |
Thermal代码位于:
drivers/thermal/ |
Thermal相关sysfs节点位于:
/sys/class/thermal |
1.1.1 Thermal Core
Thermal Core作为中枢注册Governor,注册Thermal类,并且基于Device Tree注册Thermal Zone;提供Thermal Zone注册函数、Cooling Device注册函数、提供将Cooling设备绑定到Zone的函数,一个Thermal Zone可以有多个Cooling设备;同时还提供一个核心函数thermal_zone_device_update作为Thermal中断处理函数和轮询函数,轮询时间会根据不同Trip Delay调节。
图表 2 Thermal Core Init
函数 |
作用 |
thermal_zone_device_register thermal_zone_device_unregister thermal_zone_get_temp thermal_zone_device_update thermal_zone_get_zone_by_name |
Thermal Zone的注册函数,也包括获取Zone温度,根据温度设备状态以及进行Cooling。 |
thermal_cooling_device_register thermal_of_cooling_device_register thermal_cooling_device_unregister |
Cooling Device的注册函数。 |
thermal_zone_bind_cooling_device thermal_zone_unbind_cooling_device |
将Cooling Device绑定到Zone的函数,这样Thermal Zone变得有效。 |
thermal_notify_framework thermal_generate_netlink_event |
通知函数。 |
图表 3 Thermal Core API
图表 4 thermal_zone_device_register
thermal_zone_device_check是thermal的核心函数,读取thermal温度;然后根据trip类型执行critical或者non critical响应操作。critical则直接调用orderly_poweroff;non critical则调用governor的throttle函数,此处即power_allocator_throttle。在power_allocator_throttle中进行power的分配。
1.1.2 Thermal Governor
Thermal Governor作为Thermal框架的决策核心,都被注册到thermal_governor_list上,def_governor指向当前使用的governor。
图表 5 struct thermal_governor
thermal_governor结构体用来表示一个Thermal Governor;name是名称,bind_to_tz用于将Governor绑定到Thermal Zone,unbind_from_tz用于去绑定, throttle主要被handle_thermal_trip调用,然后根据trip参数和Governor算法调用Cooling设备操作函数去设置set_cur_state。
下面重点分析Power Allocator和Step Wise两种Governor。
1.1.2.1 IPA(Intelligent Power Allocator)
参照文档:Android/Linux Thermal Governor之IPA分析与使用
1.1.2.2 Step Wise
static struct thermal_governor thermal_gov_step_wise = { .name = "step_wise", .throttle = step_wise_throttle, }; |
Step Wise的核心是根据当前温度的趋势(上升、下降、平稳)和与当前Trip温度对比,来决定CPU下一次的Cooling状态。然后调用thermal_cdev_update进行Cooling设备的set_cur_state。两个核心函数是:get_tz_trend和get_target_state。
thermal的温度趋势有:
enum thermal_trend { THERMAL_TREND_STABLE, /* temperature is stable */ THERMAL_TREND_RAISING, /* temperature is raising */ THERMAL_TREND_DROPPING, /* temperature is dropping */ THERMAL_TREND_RAISE_FULL, /* apply highest cooling action */ THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */ }; |
get_target_state流程图:
图表 6 get_target_state流程图
1.1.3 Thermal Cooling
在嵌入式平台中Cooling设备主要通过改变频率电压,来达到改变功耗的目的。所以只要可以修改频率电压都可以作为Cooling设备,比如CPU、GPU等。
1.1.3.1 Cooling设备之cpufreq框架介绍
图表 7 Cooling设备cpufreq框架
核心结构体cpufreq_cooling_device作为thermal_cooling_device的扩展,最主要两个成员是dyn_power_table和cool_dev->ops,即cpufreq_cooling_ops。
1.1.3.1.1 dyn_power_table
由power = (u64) capacitance * freq_mhz * voltage_mv * voltage_mv;计算可得到一组平率和功耗表格。这就用到OPP(Operating Performance Point),也即一组平率电压组合。
由上述OPP参数,可计算的如下dyn_power_table。
Capacitance |
Frequency |
Voltage_mv |
Power |
Power |
max_allocatable_power |
311 |
208 |
1040 |
69 |
69.9665408 |
552 |
432 |
1040 |
145 |
145.3151232 |
1160 |
|
729 |
1090 |
269 |
269.3648439 |
2152 |
|
960 |
1180 |
415 |
415.714944 |
3320 |
|
1200 |
1330 |
660 |
660.15348 |
5280 |
图表 8 dyn_power_table
1.1.3.1.2 cpufreq_cooling_ops
cpufreq_cooling_ops主要包含六个操作函数:
cpufreq_get_max_state:获取最高cooling状态的回调函数,这里指的是208M所对应的状态。
cpufreq_get_cur_state:获取当前cooling状态的回调函数。
cpufreq_set_cur_state:这是根据coolingstate执行cpufreq的回调函数,是执行操作的实体。
cpufreq_get_requested_power:获取当前CPU的功耗值,包括dynamic功耗和static功耗。中间需要用到dyn_power_table进行转换。
cpufreq_state2power:将CPU cooling状态转换成需要消耗的功耗值。
cpufreq_power2state:将CPU所能获取的最大功耗值转换成cooling状态。
1.1.4 Thermal Driver
hisi_thermal驱动主要获取内存映射、中断资源、时钟信息等,注册中断处理函数,并且添加thermal sensor到thermal zone。中断处理线程函数会更新thermal的温度,同时每个thermal zone都有work queue去轮询读取温度,这一系列操作的核心是hisi_of_thermal_ops。用于读取thermal zone的核心函数是hisi_thermal_get_temp。
1.1.4.1 DTS配置
thermal sensor硬件配置信息:
图表 9 Thermal Sensor DTS
thermal-zones的配置信息:
1.1.5 Driver
图表 10 hisi_thermal_driver
thermal zone的注册在thermal_init中完成,这要比thermal driver早完成。也正是因为此,才可以在thermal driver中将thermal sensor和thermal zone绑定。这样每个thermal zone就有对应的thermal sensor操作函数,可以读取温度值。thermal_init是fs_initcall,而hisi_thermal_driver是module_init。
1.1.6 Thermal Device Tree
Thermal相关的DTS位于:
arch/arm64/boot/dts/hisilicon/hi6220.dtsi |
主要包括Thermal Sensor和Thermal Zones两部分。
1.1.7 Intelligent Power Allocator和Step Wise的比较
1.1.7.1 测试环境
l Kernel:4.4.14
l Android:6.0.1
l 硬件环境:HiKey 2GB RAM+8GB ROM,分辨率1024*768
l 测试工具:Antutu 6.1.9 + WA 2.5.0
1.1.7.2 结果分析
由于没有测量Power仪器,只能分析Performance。
A、B、C、D四组测试的总分以及分类平均值比较如下:
A |
B |
C |
D |
|
Overall_Score |
32416.5 |
33094 |
32350.5 |
32594.5 |
3D_Score |
2447.25 |
2439.75 |
2449.75 |
2437.25 |
UX_Score |
13141.5 |
13703.25 |
13211.5 |
13512.75 |
CPU_Score |
12538.25 |
12628.25 |
12390.25 |
12312.75 |
RAM_Score |
4289.5 |
4322.75 |
4299 |
4331.75 |
图表 11 Thermal Governor和cpufreq Governor比较测试
从上面数据可以看出:
a) Thermal、cpufreq governor对于3D和RAM测试项的影响很小。考虑到测试中的误差,基本可以认为对于3D和RAM没有影响。PS:目前的Thermal governor也没有将GPU纳入考虑。
b) 下面重点分析CPU测试项:
IPA |
StepWise |
IPA-StepWise |
|
Interactive |
12538.25 |
12390.25 |
148 |
Performance |
12628.25 |
12312.75 |
315.5 |
Interactive-Performance |
-90 |
77.5 |
图表 12 Governors均分比较
测试前认为IPA应该优于StepWise,Performance优于Interactive。
从上面的数据可以看出,Performance不一定优于Interactive;但是IPA应该是优于StepWise。
(PS:是否需要更多测试,以及影响测试结果的条件是否考虑完备。)
c) 关于UX的分数悬殊是没有预料到的,需要进一步分析。
(UX结果分析)
下面是四组测试的柱状图:
图表 13 Governors比较图
Android/Linux Thermal框架分析及其Governor对比的更多相关文章
- Linux Thermal Framework分析及实施
关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...
- Android/Linux Thermal Governor之IPA分析与使用
IPA(Intelligent Power Allocator)模型的核心是利用PID控制器,Thermal Zone的温度作为输入,可分配功耗值作为输出,调节Allocator的频率和电压值. 由P ...
- Android/Linux boot time分析优化
如果需要优化boot time,就需要一个量化的工具来分析每个阶段的时间消耗.这种类型的优化特别适合使用基于timeline的图表,有着明显的时间顺序.要求不但能给出整个流程消耗的时间,还要能对流程进 ...
- 【原创】Linux v4l2框架分析
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Android : Camera2/HAL3 框架分析
一.Android O上的Treble机制: 在 Android O 中,系统启动时,会启动一个 CameraProvider 服务,它是从 cameraserver 进程中分离出来,作为一个独立进程 ...
- 12.2 linux USB框架分析(详细注册match匹配过程)
首先我们先来简单说一说USB的框架,之后在来具体分析源码,以便加深理解!其实USB的框架比较像“平台总线.设备.驱动”的框架,也分为总线.设备.驱动三大块.其中总线驱动是已经由内核完成的,一旦接入u ...
- Linux Netfilter框架分析
目录 Netfilter框架 Netfilter的5个hook点 netfilter协议栈数据流分析 连接跟踪conntrack conntrack连接跟踪表条目 连接跟踪表大小 管理连接跟踪表 ip ...
- Android/Linux下CGroup框架分析及其使用
1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源( ...
- Android 核心分析 之六 IPC框架分析 Binder,Service,Service manager
IPC框架分析 Binder,Service,Service manager 我首先从宏观的角度观察Binder,Service,Service Manager,并阐述各自的概念.从Linux的概念空 ...
随机推荐
- 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)
目录 一.Spring Cloud Eureka Server自动配置及初始化 @EnableEurekaServer EurekaServerAutoConfiguration - 注册服务自动配置 ...
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- http无状态
说http无状态,客户端请求,建立一个链接,请求完毕既会关掉连接,避免占用通道,对处理业务逻辑没有记忆功能
- [java]static关键字的四种用法
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- 第51章 内省端点(Introspection Endpoint) - Identity Server 4 中文文档(v1.0.0)
内省端点是RFC 7662的实现. 它可用于验证引用令牌(如果消费者不支持适当的JWT或加密库,则可以使用JWT).内省端点需要身份验证 - 因为内省端点的客户端是API,您可以在其上配置秘密ApiR ...
- [转]Chrome 错误代码:ERR_UNSAFE_PORT
本文转自:https://blog.csdn.net/testcs_dn/article/details/39186225 最近在用Nginx发布多个站点测试,使用了87.88端口, 88端口访问正常 ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- C#调用Oracle的存储过程时,连接字符串需要配置PLSQLRSet=1
C#调用Oracle的存储过程时, 如果有个SYS_REFCURSOR的Output参数存储时, web.config文件中的连接字符串需要配置PLSQLRSet=1, 否则可能会报这个错:参数个数或 ...
- TensorFlow与Flask结合识别手写体数字
阅读本文约“2.2分钟” TensorFlow框架 ——TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统 ——可被用于语音识别或图像识别等多项机器学习和深度学习领域 ...
- C#网络请求与JSON解析
最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C# ...