idle linux?idle进程
大家好,关于idle linux很多朋友都还不太明白,今天小编就来为大家分享关于idle进程的知识,希望对各位有所帮助!
linux cpu管理(五) cpu idle
本文基于以下软硬件假定:架构:AARCH64,内核版本:5.14.0-rc51,atf版本:Arm trust firmware V2.5。针对cpu idle目标,文章详细阐述了cpu在无任务执行时的运行方式及优化策略。
对于简单的idle处理方式,如程序中持续执行死循环操作,虽然实现简单,但会显著增加cpu的动态功耗,影响移动设备的续航能力。因此,更丰富的低功耗管理模式是必要的,如arm64架构提供的wfi指令,执行后cpu进入低功耗状态,关闭时钟降低功耗,接收到中断后被唤醒。
随着对设备功耗要求的提高,对cpu idle状态的管理提出了更高要求,包括是否可以进入更深的睡眠状态,以及在包含cluster拓扑时,一个cluster中所有cpu都进入idle状态时是否应将cluster设置为idle状态。不同cpu架构的实现方式不同,内核需提供相应的驱动程序。每个cpu抽象为一个cpuidle设备,提供idle管理信息和统计数据。
更深的睡眠状态意味着更低的功耗,但伴随更高的唤醒延迟。因此,内核需要评估不同场景下选择哪种睡眠状态。为此提供cpu idle governor管理策略框架,不同策略实现为不同governor,具有评分(rating),根据预期空闲时间和其他参数选择最佳状态。
cpu idle的管理对象是cpu,每个cpu独立控制自己的idle状态,内核为每个cpu抽象出虚拟的cpuidle设备进行管理。设备包含是否已注册、使能状态、tick中断控制、预期空闲时间、上次状态索引、停留时间、轮询时间、状态统计数据等信息。针对不同场景,设备支持简单轮询方式或特定governor。
cpu idle驱动管理实际的cpu idle状态,包含支持的cpu idle状态数组、驱动数量、coupled状态相关参数、选择使用的governor等。cpu idle状态结构包含退出延迟、目标驻留时间、标志、功耗和回调函数等参数。governor模块实现策略选择,包含名字、链表节点、评分、使能和通知函数、状态选择和更新统计数据等功能。
软件架构方面,cpuidle框架包括核心层、设备层、通用驱动层和架构特定驱动层,以及用于选择模式的governor模块。最终服务对象为调度子系统。初始化流程包括governor、驱动和设备注册,arm64架构的通用初始化流程涉及设备树解析、注册驱动和设备。
当cpu启动完成或无任务执行时,通过cpu_startup_entry函数切换到idle线程。内核有两种进入idle状态方式:系统未注册模块时,架构提供默认的wfi指令实现;注册模块时,通过cpuidle模块选择合适状态并执行相应操作。非acpi启动方式的arm64架构下,流程调用psci接口陷入bl31执行硬件操作。
退出idle状态的条件包括调度器为新进程分配任务、睡眠进程唤醒或负载均衡流程中负载轻的cpu拉取任务。governor用于确定idle状态,依据cpu预期空闲时间、退出延迟等参数选择。haltpoll governor优化虚拟机性能,通过guest端执行poll操作避免切换到host,但降低系统吞吐量。ladder governor通过cpu前一次idle状态的驻留时间和下一个state的延迟时间判断是否提升或降低state。
Linux中的cpuidle子系统
在 Linux系统中,为了解决 CPU在空闲状态时继续运行导致的能源浪费问题,工程师们引入了 cpuidle子系统,通过硬件层面的优化来实现 CPU的高效能管理。针对这一问题,硬件层面提供了 P-state和 C-state两种不同的运行模式。
C-state划分中,C0代表正常工作模式,C1到 Cn则是各种休眠模式,这种设计允许 CPU在无事可做时进入休眠状态,以闲置指令来维持运行(称为“cpuidle”,或硬件/物理闲置),同时系统提供了多种休眠态供软件根据不同的场景选择,从关闭部分时钟/电源(浅睡)到全部关闭(深睡)。
然而,进入和退出休眠模式需要耗费时间,这会增加系统恢复到正常状态的延迟,并可能产生额外的功耗。因此,在选择休眠程度时,需要权衡功耗节省和响应时间之间的关系。
在 Linux系统中,cpuidle子系统通过描述 C-state的"cpuidle_state"结构体来管理各种休眠态。一个 SMP系统中包含多个 CPU,每个 CPU又拥有多种休眠态,形成了一个二维矩阵。而"cpuidle_device"则代表了实现闲置功能的硬件部分,这些信息可通过"/sys/devices/system/cpu/cpuidle/"查看。
为了决定进入哪种休眠态,系统采用了"governor"这个执行体,由"cpuidle_governor"结构体表示。目前,Linux默认采用的是"menu"策略,由"cpuidle.governor="的命令行参数在启动时进行切换。此外,系统还通过"dyntick-idle"模式来减少干扰并增强确定性。
为了提高胜率,governor策略在预测闲置时间时会采取不同的方法。例如,"ladder"策略会采取渐进式策略,根据实际闲置时间调整到更深层次的休眠态。而"menu"策略则会直接选择预计满足需求的最深休眠态。这些策略在"drivers/cpuidle/governors/menu.c"中实现,并允许用户在启动时通过命令行参数进行切换。
Intel开源技术中心的工程师 Rafael J. Wysocki对这个机制进行了优化,通过调整"stop_tick"函数的参数,使得系统在预测为短闲状态时选择相对浅的休眠态,从而在实际为长闲状态时及时止损。此外,Wysocki还通过实验验证了新方案在降低波动性和整体功耗上的有效性,并将其集成到内核版本中。
除了"select"函数,governor还包含了"reflect"函数,它负责基于过去实际的休眠时间计算合理的均值,并调整未来的唤醒事件预测。这一反馈调节机制使得系统能够根据历史数据来优化未来的决策。
在硬件层面,cpuidle driver提供了与特定硬件平台紧密相关的服务,允许 governor选择合适的 C-state来进入。不同架构的 CPU提供了不同的闲置模式,Linux通过 driver的形式为 governor提供了一层对底层硬件细节的统一封装。
对于 x86架构,默认使用"intel_idle"的驱动,可通过"idle=nomwait"更改为使用"acpi_idle"。然而,"acpi_idle"不支持使用"MWAIT"指令进入休眠态,因此被称为"nomwait"。
Linux支持至多 10种闲置模式,每种模式由"cpuidle_state"结构体描述。用户可以通过"processor.max_cstate="设置允许的最深闲置模式,这限制了 governor可以做出选择的范围。
总之,cpuidle子系统通过提供各种闲置状态和智能的 governor算法,实现了对 Linux系统的高效能管理。随着 AI技术的发展,未来可能有更多的方法来优化这一系统,以适应各种场景并提供更佳性能。
一文搞懂linux cpu idle
Linux系统中,为每个CPU创建一个idle线程,当无其他进程需要运行时,即执行idle线程,以降低功耗。系统根据芯片硬件条件定义多种idle状态,由cpuidle框架管理,用户选择最优策略,旨在减少性能损耗的同时,最大化节能效果。在ARM64架构中,通常提供wfi状态,一些芯片更提供核心断电idle状态。CPU idle时,系统预测idle时间、权衡功耗与恢复时间,选择最适宜状态。
Linux的cpuidle框架包括scheduler、cpuidle core、governors和drivers四个部分。scheduler模块在kernel\sched\idle.c中,实现idle状态选择与切换。cpuidle core模块抽象出三个实体,用于管理governor、driver与设备。governors模块提供多样化idle策略,如menu/ladder/teo/haltpoll。drivers模块则实现idle机制,负责状态进入与退出的逻辑。
初始化流程包括governor、driver与设备的注册。governor注册时,系统会维护一个链表,每个新governor的rating值与已注册governor比较,选取rating值最高者为当前governor。新版内核支持ladder、menu、teo和haltpoll四种governor,它们通过cpuidle_register_governor函数完成注册。注册后,系统通过接口调用下层接口,完成硬件操作。
idle触发流程始于cpu_startup_entry,调用cpuidle_framework,执行idle线程的do_idle函数,将CPU设置为特定idle状态。governor中的select、reflect函数是核心功能,决定状态选择策略。select函数计算idle预测时间、系统延迟容忍时间,并根据这些因素选择idle state。reflect函数在cpu退出idle状态后更新数据,用于下一次选择。update函数触发更新流程,计算idle存留时间和校正因子,更新governor驱动。
综上所述,Linux的cpuidle机制通过idle线程、框架组件、初始化流程和触发机制,提供节能策略,通过智能选择idle状态,实现性能与节能的平衡。