背景:前几天项目上遇到一个问题,在某些场景下cpu进不了深睡眠,导致功耗增加。由上文的分析可知,睡眠的等级是和当时系统可忍受的退出延迟相关,可cpuidle_governor_latency_req获取,这个值是通过QoS子系统计算得到的。通过调试发现在该场景下计算得到的退出延时的值很小,甚至小于idle0的exit-latency的值,导致cpu根本进不了深睡眠。为了搞清楚为啥QoS计算出的退出延迟这么小,决定好好撸一撸这个PM QoS子系统 QoS广泛应用在下面三个领域: a) […]
背景:前几天项目上遇到一个问题,在某些场景下cpu进不了深睡眠,导致功耗增加。由上文的分析可知,睡眠的等级是和当时系统可忍受的退出延迟相关,可cpuidle_governor_latency_req获取,这个值是通过QoS子系统计算得到的。通过调试发现在该场景下计算得到的退出延时的值很小,甚至小于idle0的exit-latency的值,导致cpu根本进不了深睡眠。为了搞清楚为啥QoS计算出的退出延迟这么小,决定好好撸一撸这个PM QoS子系统 QoS广泛应用在下面三个领域: a) […]
注:因为个人时间和精力的原因,本文未完结,后面有机会再补充吧! CPU提供了多种idle级别,这些idle级别的主要区别是"进入idle时的功耗"和"退出时延迟"。driver层负责定义这些idle状态(即描述每一个状态的功耗和延迟分别是多少),并实现进入和退出相关的操作。最终,driver会把这些信息告诉governor层,由governor根据具体的应用场景,决定要选用哪种idle等级?依据是什么?是考虑cpu的负载还是系统中的iowaiter的个数? 所以governor层 [……
driver层直接和硬件对接,回答了下面问题: 怎样进入指定的C state?是操作对应的寄存器,还是执行对应的指令? 什么时候退出idle?要怎样才能退出idle?是收到中断自动退出还是写相应的寄存器? 怎样理解不同等级的C state? 可见driver层是和平台强相关的一层,不同平台的cpu会有不同的driver 一、从设备树中提取C state信息 注意:这里从设备树中提取的是标准内核支持的C state属性,还有一些平台自定义的一些属性,在arm_cpu_idle中 [……
cpuidle子系统的core层,主要完成如下工作 为C state、device、driver、governor定义数据结构; 组织和管理device、driver、governor结构; 提供API接口 向上,为idle线程提供接口,这样idle线程就能通过调用这些API接口,方便的完成C state的选核和进入等流程 向下,为device、driver、governor提供注册接口 在sysfs中提供用户空间接口,用户空间可以通过这些节点完成相关信息查询和控制等功能 一、数 [……
本文分析基于Linux-5.10.61 参考文档: https://www.sohu.com/a/486295565_121124374 https://blog.csdn.net/feelabclihu/article/details/106866457 https://blog.csdn.net/jacobywu/article/details/78818284 http://www.wowotech.net/tag/cpuidle 一、开胃小菜 注:下文摘自蜗窝科技 [……