一文解析Menu Governor

news2024/10/5 22:23:30

在现代操作系统中,往往很多时候并不需要去执行cpu密集型的任务,而每当这个时候,如果去持续的执行循环去等待新的任务发过来,那需要消耗巨大的能量。所以设计人员设计出一种空闲状态以此CPU进入低功耗模式。在Linux系统中,系统中的程序在CPU上运行,当执行完成后便让出CPU,而这个时候CPU无需执行任何程序,并且也没有任何中断、异常信号发过来,CPU便会进入一种空闲的状态,一般称这种状态为cpu idle状态。

一、 CPU idle 框架概述

CPU idle框架主要分为cpu idle governor,cpu idle driver,cpu idle core。

cpu idle governor,cpu idle driver,cpu idle core三者的关系如下图所示:

CPU调度器发现没有任务在运行时,会切换到idle进程,通过cpuidle_idle_call接口调到cpuidle framework中,cpuidle framework内部会选择适当的策略在决定进入哪种状态,然后回调到driver端实现。

当CPU进入idle状态后,CPU将停止时钟并且部分硬件将会停止使用,以此来减少CPU所消耗的能量。但是在这种情况下,该CPU的性能会受到很大限制。控制好CPU如何进入/退出CPU idle深度(即C state)是CPU idle子系统中一个关键点。

C state根据不同的深度会存在不同的退出延迟和功耗,如下图所示

本文主要是对CPU idle governor的一个粗略介绍。本文所有代码选自Linux Kernel5.0.7。

二、 CPU idle 进入/退出流程简述

Linux系统启动的时候,会在每一个CPU上创建对应的cpu idle线程。系统初始化完成后,将init线程转化为idle线程。在init/main.c中start_cpu()函数最后会调用 arch_call_rest_init()将init进程转化为idle进程,最终进入到cpu_startup_entry()中进入到无限的idle loop中。

在do_idle()中,代码会不断地轮询,判断当前系统是否需要调度,如果系统当前不需要调度,则进入到idle状态。

do_idle()->cpuidle_idle_call()->cpuidle_select()

进入cpuidle流程后,会根据系统中对应governor策略进而选择不同的idle state。

系统在选择完idle state后,还会调用cpuidle_reflect()将选取过程中一些信息和结果保留下来,以备下一次选取使用。

在进入idle状态后,CPU会调用WFI指令(wait for interrupt),直到有中断到来,系统就会退出idle状态。

三、CPU idle governor

1.综述

在实际CPU运行环境中,不同的CPU他们对idle状态的需求和进入/退出方法会存在差别,而这其中功耗和退出延迟成为了在idle调度过程一组不可调和的矛盾,如何保证在满足性能需求的前提下尽可能的节省功耗成了CPU idle子系统的一个重要组成部分。CPU idle governor在整个CPU idle子系统中负责提供如何使用CPU idle的策略。

内核中提供了两种策略:Menu和Ladder。选择哪种调度器,取决于内核的配置,其中关键点是系统调度的tick是否可以被空闲循环停止。在系统初始化过程中,menu和ladder分别通过cpuidle_register_governor()注册到系统中。

ladder governor会首先进入最浅的idle state,然后如果待的时间足够长,则会进入到更深一级的idle state,以此类推,直到到达最深的idle state。当被唤醒时,会尽可能快地重新启动CPU;等到下次空闲,则又会从idle state1开始进入。它往往用于periodic timer tick system。

而在tickless system中,ladder可能会存在没有机会进入到更深一级的idle状态中,引起功耗损失,所以这个时候往往会使用menu调度器。menu调度器则不一定遵守由浅入深的规则,如果深度的idle state更好,那么就会直接进入到深度的idle state。

由于主流系统中常采用tickless system,本文重点介绍menu governor。

对于menu调度器,存在两种决定idle深度(下称C state)的因素

(1)能量平衡点(停留时间)

在进入/退出C state时,系统会消耗一定的能量,所以频繁进出C state不是一件能带来收益的事情,调度器在考虑进入C state的时候,会考虑进入该C state的预计持续时间。

(2)性能影响(系统延迟容忍度)

对于C state来说,退出C state会存在巨大的延迟,这会极大影响性能。因此对于调度器来说,系统越忙,C state就越不能被接受,系统的工作负载也被纳入决策因素中。

而以上两个因素,menu governor的职责具体到实际情况中,便转换为了两个任务:1.预测C state的停留时间。2.计算系统延迟容忍度

在struct cpuidle_state中使用target_residency来记录该C state下的停留时间阈值。在选择过程中,会计算出预计停留时间(predicted_us)和备选的C state中的target_residency进行比较,选取其中满足停留时间大于target_residency的C state。

选取时,先通过pm qos计算出系统此时的系统容忍度(latency_req),接着在所有exit_latency小于latency_req的C state中选择power_usage最小的那个state。

 资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

2.核心结构体

C state的结构体如下:

  • name:该state 的名称
  • desc:该state的简介
  • exit_latency:表示退出该state的延迟,单位us
  • power_usage:表示该state下的功耗
  • target_residency:期望停留时间,单位us
  • enter:进入该state的回调函数

menu governor的结构体如下:

  • last_state_idx:记录上一次进入的idle深度
  • need_update:在系统每次从C state返回时,会调用reflect接口,用于考虑这次state切换的结果,menu governor的reflect接口会将need_update设置为1,在下次进入select时对idle信息进行更新
  • tick_wakeup:记录上次退出C状态是否是被tick唤醒
  • next_timer_us:记录距离下一个tick到来的时间
  • bucket:记录在当前的校正因子的位置
  • correction factor:保存校正因子的数组
  • intervals、interval_ptr:计算标准差时所采用的停留时间

3.核心函数

menu governor的menu_select()的核心部分如下:

在计算predict的过程中,menu governor会将下一个tick到来的时间点距离此刻的时间(next_timer_us)作为一个基础的predicted_us,并在这个基础上调整。

首先,因为predicted_us并不总是与next_timer_us直接相等,在等待下一个tick的过程很有可能被其他时间所唤醒,所以需要引入校正因子(correction factor)矫正predicted_us。此校正因子从对应的bucket索引中选取。

menu governor使用了一组12组校正因子来预测空闲时间,校正因子的值基于过去predicted_us和next_timer_us的比率,并且采用动态平均算法。另外对于不同的next_timers_us,校正因子的影响程度是不一样的;对于不同的io wait场景,系统对校正因子也有着不同的敏感程度 。

随后尝试通过最近的8个过去的停留时间来查找重复间隔,如果他们的标准差小于一定阈值,则将这8个时间的平均值作为predicted_us。

最后取以上两个流程中的最小值。

对于系统容忍度,menu governor使用性能乘数(performance multiplier)、预计停留时间(predicted)和系统延迟需求(latency requirement)来找出最大退出延迟。系统延迟需求作为第一个系统延迟容忍度;通过公式(1)计算出另外一个系统容忍度:predicted_us / (1 +10 * iowaiters)

*iowaiters指当前cpu上iowait的任务数

取前面两个系统容忍度中最小值作为最小的系统容忍度。

最后根据前面计算出来的两个因素来选取具体的idle state,将计算出的predicted_us与所有idle状态的停留时间进行比较,选择特定idle状态的条件是相应的停留时间应小于predicted_us。另外,将状态的exit_latency与系统的交互性要求进行比较。基于两个等待时间因素,选择适当的空闲状态。

在cpu退出idle状态后,menu governor会将将上一轮的进入idle状态的数据更新到menu driver中,作为下一次select的参数。

下一次进入选择流程时,会先触发更新需求,即进入到menu_update()中

在更新信息时,会尝试算出进入idle状态到被唤醒经历了多长时间。

①如果cpu被tick唤醒,而且上次记录的next_timer_us大于了一个tick的时间,那么governor就假定cpu已经空闲了很长时间,则measured_us为9 * MAX_INTERESTING / 10(INTERESTING=50000)

②如果cpu退出了轮询状态,会导致选择该状态的空闲持续时间不准确,故将next_timer_us作为measured_us

③除此之外,measured_us将使用驱动中记录的上次idle状态中停留时间

算出来之后再减去退出延迟,然后与next_timer_us取最小值,便得出了最终的measured_us。

接下来是计算下一次选择校正因子(correction factor)的值

将上一次的校正因子先衰减一次,然后加上一个predicted_us和next_timer_us的比值

new_factor += RESOLUTION * measured_us / data->next_timer_us;

(RESOLUTION=1024)

最后就可以将这两个值更新到governor的驱动中。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能运维的集中告警平台实战思路 —— 紧耦合还是宽融合?

作者:擎创科技产品总监 Daniel 本文是节选,如感兴趣可留言一起探讨。 ( 我们在确定一个产品的思路和方向时,经常面临截然不同的选择。如同此文探讨的集中告警平台是否应跟集中监控平台紧绑定或松融合,具体的实战案例…

[译] Dart 3 发布了

[译] Dart 3 发布了 原文 https://medium.com/dartlang/announcing-dart-3-53f065a10635 https://ducafecat.com/blog/dart-3 来自 Google I/O 2023 的问候。今天,我们在 Mountain View 现场宣布 Dart 3——迄今为止最大的 Dart 发布!Dart 3 包含三个主要…

Springboot +Flowable,各种历史信息如何查询(一)

一.简介 正在执行的流程信息是保存在以 ACT_RU_ 为前缀的表中,执行完毕的流程信息则保存在以 ACT_HI_ 为前缀的表中,也就是流程历史信息表。 假设有一个流程,流程图如下: 当这个流程执行完毕后,以 ACT_RU_ 为前缀的…

小黑子—多媒体技术与运用基础知识三:数字图形图像处理技术

多媒体技术与运用3.0 多媒体系列第三章1. 颜色科学1.1 颜色的性质1.1.1 颜色的物理性质1.1.2颜色三特性1.1.3三原色与三补色 1.2 颜色空间1.2.1 与设备无关的颜色空间1.2.1 与设备相关的颜色空间 1.3 常见的多媒体系统颜色空间1.3.1 RGB颜色空间1.3.2 CMYK颜色模型1.3.3 HSB颜色…

什么是模型鲁棒性和泛化能力

目录 1、鲁棒性 2、泛化能力 1、鲁棒性 定义:在统计学领域和机器学习领域,对异常值也能保持稳定、可靠的性质,称为鲁棒性。比如说,计算机软件在输入错误、磁盘故障、网络过载或有意攻击情况下,能否不死机、不崩溃&a…

17 KVM虚拟机配置-XML配置文件示例

文章目录 17 KVM虚拟机配置-XML配置文件示例17.1 概述17.2 示例一17.3 示例二 17 KVM虚拟机配置-XML配置文件示例 17.1 概述 本节给出一个基本的AArch64虚拟机和一个x86_64虚拟机的XML配置文件示例,供参考。 17.2 示例一 一个包含基本元素的AArch64架构虚拟机的…

Psychophysiology:降维独立成分分析(rdICA)对ERP测量的影响

导读 独立成分分析(ICA)是一种有效且普遍使用的EEG信号处理工具。为了减少计算时间,许多分析管道在ICA之前降低了EEG维数。Artoni及其同事(2018)的研究中就详细地描述了这种降维ICA(rdICA)对独立成分的偶极性和可靠性的有害影响。虽然ICA对于那些直接分析独立成分感…

【网络安全】记一次网站站点渗透

前言 遇到一个站,后端是 Node.js 写的,对于这种类型的站点,一般比较难 getshell,但也实现了最终的目标,拿到后台权限 信息搜集 先进行常规的信息搜集,子域名扫描、端口扫描、目录扫描等 这个站后端脚本语…

如何实现文件共享,文件共享的设置方法-镭速

文件共享是指在计算机网络中,多个用户可以通过共享相同的文件或目录来实现数据交换和协作工作。这种方式可以使多个用户在不同地点的计算机上访问并编辑同一个文件,从而实现更加高效和便捷的合作。 实现文件共享是计算机网络中常见的需求,可以…

关于在 MySQL 排序中使用索引这件事!

文章目录 1. 排序的两种方式2. 索引排序2.1 案例一2.2 案例二2.3 案例三2.4 案例四2.5 案例五2.6 案例六2.7 案例七2.8 案例八 3. 其他情况3.1 多表联查3.2 order by null 4. 小结 前面跟小伙伴们分享的索引相关的内容,基本上都是在 where 子句中使用索引&#xff0…

java环境变量 的配置与详解

笔者这学期开始学习java课程,学习java开发首先需要配置java运行环境变量。虽然上课老师也讲了如何配置java环境变量,可是笔者的同学还是有好多都不会配置,所以笔者最近配置了特别多次java环境变量。如下笔者详细解释从JDK安装到环境变量的装配…

rsync本地或远程备份

这里写自定义目录标题 rsync作用rsync用法scp /cp/rsync区别ssh无密码登陆原理远程备份案例远程备份脚本脚本1:脚本2 本地备份常用参数 rsync作用 实现本地或远程 全量备份 增量备份 rsync用法 rsync -avz 本机文件夹 远程主机用户名IP:远程主机文件夹 scp /cp/…

发电厂能源管理远程监控解决方案

发电厂能源管理远程监控解决方案 项目背景 在我国经济快速发展的同时,对用电的要求也越来越高。为了节约能源和降低成本,国家正在积极推动发电厂的技术改造。发电厂作为发电企业的核心,其耗能状况关系到整个国家的经济发展。为进一步加强对电…

如何成为一名职业黑客?

我需要什么技能才能成为一名优秀的专业黑客?” 由于黑客是最熟练的信息技术学科之一,它需要广泛的 IT 技术和技巧知识。要真正成为一名真正的黑客,必须掌握许多技能。这是我总结所需技能的概述列表。我将这些技能分为三类,以帮助你…

家用洗地机有什么推荐的吗?好用的家用洗地机

洗地机采用高效能滚刷设计,可轻松处理多种不同材质地面的卫生问题,例如:地毯、硬地板、瓷砖等等,都能轻松完成深度清洁。而且洗地机还具有智能化设计,例如自动充电、一键启动和一键停止等设计,使它操作起来…

【Hello Algorithm】基础数据结构

作者:小萌新 专栏:算法 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:介绍几种基础数据结构 基础数据结构 单链表结构翻转单链表删除节点 双链表栈和队列用栈实现队列用队列实现栈 哈希表 单链表结构 在阅读这篇文章之前…

GLM-130B-一个开放的双语通用预训练模型-论文精读

本文为作为类ChatGPT的模型ChatGLM的前期基础论文2《AN OPEN BILINGUAL PRE-TRAINED MODEL》的精读笔记,基础论文1的精读笔记请见《GLM论文精读-自回归填空的通用语言模型》。希望对大家有帮助,欢迎讨论交流。GLM-130B,主要思想概述&#xff…

Android 签名文件

签名文件相关 一、为什么需要签名?二、创建签名文件2.1、使用AS新建签名文件2.2、使用 keytool 新建签名文件 三、签名串改参考地址 一、为什么需要签名? Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是…

YooAsset | Unity资源管理方案

跳转官方仓库地址 一、说明 可空包、可首包DLC、可满足限制包体的需求、可玩家自己制作MOD上传到服务器、可分工程构建;支持内置渲染管线、可编程渲染管线;支持完整路径、可寻址资源定位;基于标签打包,自动分析冗余,基…

MongoDB 查询文档中使用$expr、$where选择器

之前我们介绍过使用比较选择器、逻辑选择器、元素选择器、数组选择器查询文档,如果您需要进一步了解,可以参考: MongoDB 查询文档中使用比较选择器、逻辑选择器https://blog.csdn.net/m1729339749/article/details/129965699MongoDB 查询文档…