Linux电源管理1(基于Linux6.6)---整体架构
一、 概述
电源管理在操作系统中是指通过控制硬件资源的使用来降低功耗,延长设备的使用寿命,尤其在移动设备和嵌入式系统中至关重要。Linux电源管理涉及多个层次,从系统硬件、内核驱动到用户空间的应用层,都需要配合协作。Linux 提供了灵活的电源管理机制,支持多种电源管理方案,包括 CPU、内存、设备和系统级的电源管理。
1.1、 Linux电源管理的目标
- 节省电池电量:尤其对笔记本、移动设备和嵌入式系统,电源管理有助于延长电池使用时间。
- 降低能耗:减少系统在空闲状态下的功耗,尤其在没有用户活动时。
- 提高硬件寿命:通过有效管理硬件资源的使用,减少不必要的热量产生和长期的负担,从而提高硬件的稳定性和寿命。
1.2、Linux电源管理的关键组件
Linux电源管理由多个核心组件组成,每个组件负责不同的硬件层级和功能。
ACPI (Advanced Configuration and Power Interface)
- ACPI 是一种操作系统与硬件之间的电源管理标准,广泛应用于笔记本、台式机等设备。
- Linux内核支持ACPI,可以通过它管理设备的电源状态、设备热插拔和系统休眠等功能。
- ACPI 主要提供以下功能:
- 休眠与唤醒:包括系统休眠(suspend)和休眠后恢复。
- 电源状态管理:允许操作系统通过ACPI控制硬件的功耗。
- 设备管理:支持按需关闭不必要的硬件资源以减少功耗。
CPUIDLE 和 CPU Frequency Scaling
-
CPUIDLE:用于管理CPU在空闲时的状态。CPU在不执行任务时可以进入低功耗状态,通过降低频率或完全关闭某些核心来节省电力。
- C状态:表示CPU的不同空闲状态。C0是活跃状态,C1至Cn是不同的空闲状态,随着状态编号的增高,功耗逐渐减少,但恢复时间也变长。
-
CPU Frequency Scaling:根据负载动态调整CPU的工作频率。频率降低时,功耗和发热量会降低。
ondemand
:当CPU负载较高时,动态提高CPU频率;负载低时降低频率。powersave
:始终以最低频率工作,节省功耗。performance
:始终运行在最大频率,保证性能。conservative
:类似于ondemand
,但调整频率的响应速度较慢,更加温和。
设备电源管理 (Device Power Management)
- Linux通过udev和内核驱动程序为各个设备提供电源管理功能。
- 设备驱动的电源管理:通过内核驱动,设备可以在空闲时进入低功耗状态。当设备不需要时,可以通过软件控制其电源状态。
- USB设备管理:支持USB设备的休眠和唤醒。
- PCI设备管理:支持PCI总线设备的电源管理,包括使设备进入省电模式。
- 显卡、硬盘等设备管理:通过驱动控制设备的电源状态,减少空闲时的能耗。
内存管理
- 内存管理通过**
swappiness
、zswap
、zram
**等技术提高内存的使用效率,从而间接节省电力。 - Swap管理:当系统内存资源紧张时,Linux可以通过交换分区(swap)将不活跃的内存页移至硬盘,释放物理内存。
- 内存压缩:如zswap和zram通过压缩内存数据,减少交换的需要,从而降低磁盘I/O带来的能耗。
休眠与唤醒机制
-
Linux支持几种类型的休眠模式,主要包括系统挂起(Suspend)和深度休眠(Hibernate)。
- Suspend(挂起):将系统状态保存到RAM中,关机大部分硬件,减少功耗。恢复时,系统能较快恢复工作状态。
- Hibernate(休眠):将系统状态保存到硬盘中,关闭所有硬件,完全断电。恢复时,需要从硬盘加载系统状态,因此恢复时间较长。
-
Suspend-to-RAM:进入低功耗状态,但保持内存中的数据。
-
Suspend-to-Disk:将整个内存内容写入硬盘,然后完全关闭电源。
-
Hybrid sleep:结合了suspend和hibernate的优点,在进入挂起模式的同时也保存内存状态到硬盘,在电池电量耗尽时可以从硬盘恢复。
1.3、电源管理的策略
- 用户空间电源管理工具:如**
TLP
、powertop
**等,提供了更细粒度的电源管理,帮助用户调节电源策略并查看系统的功耗。TLP
:自动化的电源管理工具,优化了笔记本电脑的功耗设置。powertop
:实时监控和调节系统的功耗状态,可以显示哪些进程和硬件组件最耗电。
- 自动调节模式:例如基于系统负载自动调整CPU频率、硬盘休眠等,减少不必要的电量消耗。
1.4、电池管理
- 对于笔记本和移动设备,电池管理尤为重要。Linux通过
ACPI
与硬件进行交互,获取电池信息并进行管理。- 电池电量监控:通过
/sys/class/power_supply
接口查看电池的剩余电量、充电状态、健康状况等。 - 电池优化:通过调节CPU频率、屏幕亮度、硬盘转速等,优化电池使用时间。
- 电池电量监控:通过
1.5、电源管理的调度器
- CPU调度器:通过调度策略决定如何分配CPU资源,间接影响电源管理。常见的调度器有
CFS(Completely Fair Scheduler)
和BFS(Brain Fuck Scheduler)
等。 - IO调度器:IO调度器(如
CFQ
、deadline
、noop
)也对电源有影响,尤其在减少磁盘IO时,减少硬盘活跃度,节省功耗。
1.6、电源管理的调试与优化
- Linux提供了多个调试工具和接口来监测和优化电源使用:
powertop
:监测电源消耗的工具,可以优化系统配置。cat /proc/acpi/
:查看ACPI设备的状态信息。dmesg
:查看内核日志中有关电源管理的消息。
二、 Linux电源管理的组成
电源管理(Power Management)在Linux Kernel中,是一个比较庞大的子系统,涉及到供电(Power Supply)、充电(Charger)、时钟(Clock)、频率(Frequency)、电压(Voltage)、睡眠/唤醒(Suspend/Resume)等方方面面(如下图),蜗蜗会在Linux电源管理系列文章中,对它们一一讲述。
Framework是一个中间层的软件,提供软件开发的框架。其目有三:一是屏蔽具体的实现细节,固定对上的接口,这样可以方便上层软件的开发和维护;二是尽可能抽象公共逻辑,并在Framework内实现,以提高重用性、减少开发量;三是向下层提供一系列的回调函数(callback function),下层软件可能面对差别较大的现实,但只要填充这些回调函数,即可完成所有逻辑,减小了开发的难度。
- Power Supply,是一个供用户空间程序监控系统的供电状态(电池供电、USB供电、AC供电等等)的class。通俗的讲,它是一个Battery&Charger驱动的Framework。
- Clock Framework,Clock驱动的Framework,用于统一管理系统的时钟资源。
- Regulator Framework,Voltage/Current Regulator驱动的Framework。该驱动用于调节CPU等模块的电压和电流值。
- Dynamic Tick/Clock Event,在传统的Linux Kernel中,系统Tick是固定周期(如10ms)的,因此每隔一个Tick,就会产生一个Timer中断。这会唤醒处于Idle或者Sleep状态的CPU,而很多时候这种唤醒是没有意义的。因此新的Kernel就提出了Dynamic Tick的概念,Tick不再是周期性的,而是根据系统中定时器的情况,不规律的产生,这样可以减少很多无用的Timer中断
- CPU Idle,用于控制CPU Idle状态的Framework。
- Generic PM,传统意义上的Power Management,如Power Off、Suspend to RAM、Suspend to Disk、Hibernate等。
- Runtime PM and Wakelock,运行时的Power Management,不再需要用户程序的干涉,由Kernel统一调度,实时的关闭或打开设备,以便在使用性能和省电性能之间找到最佳的平衡
注3:Runtime PM是Linux Kernel亲生的运行时电源管理机制,Wakelock是由Android提出的机制。这两种机制的目的是一样的,因此只需要支持一种即可。另外,由于Wakelock机制路子太野了,饱受Linux社区的鄙视,因此我们不会对该机制进行太多的描述。 - CPU Freq/Device Freq,用于实现CPU以及Device频率调整的Framework。
- OPP(Operating Performance Point),是指可以使SOCs或者Devices正常工作的电压和频率组合。内核提供这一个Layer,是为了在众多的电压和频率组合中,筛选出一些相对固定的组合,从而使事情变得更为简单一些。
- PM QOS,所谓的PM QOS,是指系统在指定的运行状态下(不同电压、频率,不同模式之间切换,等等)的工作质量,包括latency、timeout、throughput三个参数,单位分别为us、us和kb/s。通过QOS参数,可以分析、改善系统的性能。