一、引文

随着CPU架构的发展,工艺的升级,带来性能提升,能效的提升(同性能下)。但是由于极限性能的增加,也带来了peak功耗的增加(大部分情况下,能效比的提升无法抵消这部分),CPU功耗优化一直是广大SOC厂商比较头疼的问题。

CPU功耗分为静态功耗和动态功耗:

  • 静态功耗(static power):mos管内部的PN节产生的泄漏电流,只要当前单元被上电就会有,静态功耗主要与温度和电压有关。

  • 动态功耗(dynamic power):芯片电路中的负载电容充放电造成,只要电路中有信号翻转就会产生动态功耗,动态功耗主要与频率和电压有关。其公式大体如下:

假设一个SOC有两个cluster,每个cluster有4个CPU,单个cluster的总功耗由cluster独有的模块(例如L3 cache)功耗与CPU的功耗两部分构成,单个cluster功耗构成如图1:

CPU LPM(Low power mode)状态即C states分为三种状态C0,C1和C4, 以qcom某款芯片为例:

  • C0为正常的active状态。

  • C1为WFI(wait for interrupt)模式,等到有中断的时候从C1迁移至C0状态。C1模式下会关闭core clock,此时动态功耗会变得非常低,退出延迟为40ns。

  • C4会在C1的基础上关闭core logic以及L1/L2cache,退出延迟为500ns左右。

当CPU无任务运行时,idle状态下会进入低功耗模式节省功耗,此时CPU上仅存在静态功耗,假如CPU进入C1状态,其状态切换对整体功耗的影响如图2:

假设系统中只有CPU0和CPU1,可以看到当CPU0和CPU1被唤醒,CPU整体功耗会增加cluster,CPU0和CPU1的static power以及dynamic power,如果CPU0进入WFI模式,则CPU0的dynamic power消失,如果CPU0 power down,则CPU0的static power也会消失,CPU1亦然。

现在主流的SOC处理器以8核为主,这8个核会被分为2~3个cluster。

如果软件把某个CPU设置为“隔离状态“,使得任务在调度时,不能选择这个CPU,那么这个CPU会因为没有任务运行,很快进入低功耗模式,从而达到节省功耗的目的。在有性能需求的时候能够以较低的延迟唤醒这些idle的CPU,快速的满足性能的需求。达到性能与功耗的平衡。下面我们介绍本文的“主角“—core control。

二、core control框架与原理

(1)core control核心逻辑

core control的核心逻辑是核数的控制,如何判断当前需要多少CPU呢?其核心逻辑在eval_need函数中。

决定cluster cpu核数主要有两个因素:CPU的loading和CPU上task 的数量。

首先看CPU loading如何决定核数,见下图6:

corectl每一轮会以cluster为单位check当前cluster满足负载要求需要多少CPU。need_cpus表示cluster最终计算需要的核数,每次check会从0开始计算,根据各个CPU的loading状态来确定是否需要增加CPU个数。CPU loading的统计方法是:当前CPU上runqueue的task loading值之和除以当前CPU理论最高的算力值,得到最终的CPU loading,具体如下图7:

图7 cpu loading计算方法

在上面根据CPU loading得到一个初步的need cpus值后,为了避免出现性能问题,还需要从runqueue task数的角度来看是否需要增加CPU数,其判断逻辑如下图8:

先说明一下上面函数中各个参数的含义:

  • nrrun: 当前cluster总共需要执行的task数。计算方法:当前cluster上所有CPU runqueue task之和再加上prev cluster上的misfit task(task util超过prev cluster最高capacity 90%的task)数。

  • nr_prev_assist: prev cluster总共有多少task需要当前cluster帮忙执行。计算方法:prev cluster cpu runqueue的总task数加上prev prev cluster的misfit task数再减去prev cluster中实际active的CPU数。

  • new_need: 当前最新得出的现在所需CPU个数值。

  • max_nr:当前cluster中CPU runqueue中task数最大值。

  • strict_nrrun:当前cluster过去一段时间平均的running task个数,计算方法:小核只统计总的平均task数,大核则需要将平均的running task数减掉active cpu个数。这样做的目的是如果小核有enable corectl功能,则需要小核开核的条件尽可能的宽松。

1)如果当前cluster上需要运行的task过多,大于设定的阈值,需要打开cluster所有CPU。

2)如果prev cluster需要当前cluster帮忙运行的task数超过阈值,则当前cluster需要开启nr_prev_assist个CPU。

3)当前cluster需要run的task数如果小于设定阈值,但是大于new_need值,则认为当前cluster所开的CPU数不够,需要增加一个。

4)如果当前cluster中有一个CPU runqueue的task数大于4个,则说明当前CPU loading过重,需要再开一个CPU来保证运行流畅。

5)new_need的值必须大于等于当前cluster平均的running task数,由于计算方法的差别,对于小核,尽可能的让所有core都打开。

6)最终need_cpus的个数必须小于等于cluster最大的CPU数,也必须满足设定的cluster min_cpus/max_cpus的值。

(2)core control sysfs相关节点

sysfs节点主要提供给userspace用来设定参数,userspace可以通过节点设置每个cluster min_cpus(最少)/max_cpus(最多)开启的cpu个数,在CPU loading不高时,cluster只需开启min_cpus个cpu,再根据CPU loading,动态开关CPU,最多可以开启max_cpus个cpu。也可以根据需要,通过节点busy_up_thresh/busy_down_thresh以及task_thresh从task loading或者数量的角度设定cluster开关CPU的难度。

随心所动,厂商的CPU核管理策略介绍的更多相关文章

  1. 龙芯将两款 CPU 核开源,这意味着什么?

    10月21日,教育部计算机类教学指导委员会.中国计算机学会教育专委会将2016 CNCC期间在山西太原举办“面向计算机系统能力培养的龙芯CPU高校开源计划”活动,在活动中,龙芯中科宣布将GS132和G ...

  2. Linux 进程、线程运行在指定CPU核上

    /******************************************************************************** * Linux 进程.线程运行在指定 ...

  3. Ubuntu系统进程绑定CPU核

    Ubuntu系统进程绑定CPU核 作者:chszs.版权全部,未经允许,不得转载. 博主主页:http://blog.csdn.net/chszs 本文讲述如何在Ubuntu系统中,把指定的进程绑定到 ...

  4. 【转帖】龙芯将两款 CPU 核开源,这意味着什么?

    龙芯将两款 CPU 核开源,这意味着什么? https://www.oschina.net/news/78316/loongson-open-source-two-cpu-core 文章挺不错的 也讲 ...

  5. 虚拟机评估——如何确定一个CPU核上部署的虚拟机数量?

    最近研究虚拟化技术,不可避免遇到一个问题:如何评估物理主机上虚拟主机的容量?下面这篇文章的思路有一定的启发性,转发一下. 如何确定一个CPU核上部署的虚拟机数量? 摘要:本文说明一个CPU核上部署虚拟 ...

  6. 云计算之路-阿里云上:消灭“黑色n秒”第二招——给w3wp进程指定CPU核

    虽然昨天的第一招失败了,但是从失败中我们学到了与多核CPU相关的Processor Affinity(处理器关联)的知识. 既然我们可以让.NET程序的不同线程运行于指定的CPU核,那是不是也可以让I ...

  7. linux查询cpu核心数

    linux怎么查询cpu核心数 1.查看逻辑CPU个数: #cat /proc/cpuinfo |grep "processor"|sort -u|wc -l24 2.由于有超线程 ...

  8. CPU个数、CPU核心数、CPU线程数

    CPU个数.CPU核心数.CPU线程数 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之 ...

  9. 一个 CPU 核 开多少个 线程 比较合适 ?

    一个 CPU 核 开多少个 线程 比较合适 ? 这是一个 线程池 的 问题 . 我之前也 反对 过 线程池, 因为我认为 线程池 影响了 对 用户 的 实时响应性 . 我也认为, 分时 (对 CPU ...

  10. 【转】Linux进程绑CPU核

    1. 什么是绑核? 所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占 ...

随机推荐

  1. 【Vue2】 Watch 监听器

    监听器案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. 【Docker】01 概述

    什么是Docker? 一个开源的应用容器引擎 由Go语言开发而成,遵循Apache2.0开源协议 允许开发者打包自己的应用或者依赖包组件到一个轻量级可移植的容器中 Docker容器采用沙箱机制,相互之 ...

  3. 机器人的运动控制是否可以引入生物学信息,生物学信息是否可以辅助机器人的智能控制算法的训练:《Robotic prosthetic ankles improve 'natural' movement, stability》

    相关内容: Robotic prosthetic ankles improve 'natural' movement, stability 看了上面的论文的介绍(内容没看到,不是open access ...

  4. 多网卡系统下如何使用tcp协议实现MPI的分布式多机运行(mpi的实现使用openmpi)

    如题: 最近在看MPI方面的东西,主要是Python下的MPI4PY,学校有超算机房可以使用MPI,但是需要申请什么的比较麻烦,目的也本就是为了学习一下,所以就想着在自己的电脑上先配置一下. 现有硬件 ...

  5. 使用Redis时的vm.overcommit_memory内存分配控制

    最近在使用Redis的时候遇到了linux系统中的vm.overcommit_memory参数设置,对此不是很了解,于是研究了一下,有了本文. ============================ ...

  6. Java实现微信登录(网页授权)

    1.背景 实际开发中,使用第三方登录是非常常见的业务... 这样可以大提高用户体验,没必要一来就要注册,或者登录之类的... 并且开发一个登录或者注册严格来说也是非常麻烦的(各种防止攻击.机器操作等) ...

  7. 海豚²来了丨DolphinDB 集成 DolphinScheduler,任务调度更轻松

    DolphinDB 是一款高性能时序数据库.DolphinDB 集成了功能强大的编程语言和高容量高速度的批流一体数据分析系统,为海量数据(特别是时间序列数据)的快速存储.检索.计算及分析提供一站式解决 ...

  8. 使用BizyAir,没有显卡,也能玩AI绘图

    或许很多人跟我一样,没有显卡,但又很想玩AI绘图,但本地绘图怕是无缘了,只能借助云GPU的方式了. 今天跟大家分享一下一个简单目前可白嫖无门槛的方法实现无显卡也能玩AI绘图. 方案就是ComfyUI+ ...

  9. MySQL编译安装-麒麟V10 x86

    环境信息 操作系统: Kylin Linux Advanced Server V10 (Sword) 架构:X86 MySQL版本:5.7.44 编译 安装必要的依赖库和编译工具 sudo yum g ...

  10. visual studio安装MFC模板

    计算机图形学 奇怪的重点 需要单击选中使用C++的桌面开发 才会跳出右侧的选项 要么就是展开右侧的收缩