[hardware development] deepin 平台电源策略
Tofloor
poster avatar
longlong
deepin
Developer
2023-08-15 23:27
Author

起因

近期,我们收到用户反馈,在使用deepin系统过程中遇到了CPU功耗过高导致的设备发热、续航较差情况,而用户在这些负载场景下,CPU的占用往往不高。为了解决这个痛点,开源社区中心特别成立专项计划,对于deepin的电源进行专项优化,本文旨在针对此问题根因进行分析于说明。

在对电源进行专项优化之前,我们首先对deepin系统进行了深入的调查和分析,以了解其在负载场景下的实际运行情况。经过对CPU使用率和功耗的监测,我们发现了一个令人惊讶的事实:尽管在高负载场景下CPU的占用率不高,但其功耗却持续升高,最终导致设备发热并影响续航。也就是说,我们前期做的省电优化工作,不仅无效,还起了反作用(具体情况作者将在下文作出仔细说明)。

问题

内核

最开始发现问题的地方在内核。有用户将我们的内核和ubuntu的内核进行对比后发现,虽然我们的系统和ubuntu系统的性能差不多,但是在发热和续航上,我们较ubuntu落后较多。有用户在deepin系统上使用ubuntu和其他开源linux发行版的配置文件分别编译内核,发现deepin的主要问题存在于发热控制之上。我们的测试同事高度重视这一社区反馈,遂对社区用户反馈的问题进行复现,佐证了这一现象。

对于这种问题,我们立即联系了内核研发部的同事,并邀请部分对内核配置有一定研究的社区用户共同参与。在大家的合力排查下,我们发现,deepin v23中提供的HWE内核存在部分debug和无用的内核选项被开启的情况,并且部分节电功能实际未能获得启用,这些都在一定程度上导致了deepin v23的续航表现不佳。

系统

在系统层面,我重新审视了dde-daemon提供的电源调度模块,并且对比内核文档提供的文件接口,分析我们用户使用的电源模式,发现其中存在可以优化的空间。这将是本文着重讲解的内容之一。

前置知识:ACPI

ACPI是Advanced Configuration and Power Interface的缩写,是一种计算机硬件和操作系统之间交换能源相关信息的接口规范。它定义了计算机硬件的能源相关信息,如电源供应器状态、设备功耗、设备功率因数等。ACPI是操作系统控制计算机硬件能源管理的标准,同时也是硬件厂商和操作系统之间通信的标准。

在deepin系统中,ACPI负责处理计算机硬件的能源管理,它与deepin系统的电源管理模块进行交互,以实现对计算机硬件的能源管理。

在分析系统层面的问题时,我们需要了解ACPI和电源管理模块的作用和功能,以及它们是如何协同工作的。在本文中,我们将会详细讲解ACPI的工作原理以及deepin系统中的电源调度模块工作模式,并提出可行优化建议。

首先,让我们了解一下ACPI的工作原理。当计算机硬件发生电源变化时,ACPI会收集硬件信息,并向操作系统发送电源请求。操作系统收到电源请求后,会根据用户配置自动调整各个硬件的电源策略。而deepin系统的电源模块则是帮助用户生成配置来调整ACPI的行为。所以在这一方面,我们能做的就是向ACPI提供合理的电源策略,在保证性能的同时,降低设备温度并提升续航表现。

平台电源配置

相关内核文档https://docs.kernel.org/userspace-api/sysfs-platform_profile.html

UEFI ACPI文档https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/index.html

平台电源配置是电源管理模块的一个重要组成部分,它用于管理计算机平台硬件(指所有支持ACPI的设备)的电源状态,而CPU也是属于ACPI设备的一部分。不过CPU是计算机的核心发热大户,对于其使用平台电源管理可能粒度较粗,所以APCI引入了一些CPU独有的性能管理方式,在下一小节将详细说明。

平台电源配置提供了三种可选模式:performance(性能模式),balance(平衡模式),low-power(节能模式)。一般情况下,用户使用平衡模式就可以。在台式机和mini主机类(对于功耗和发热没有任何要求)设备上默认提供性能模式,在笔记本等移动设备上默认提供平衡模式。默认不提供节能模式,因为某些ACPI设备在节能模式工作过程中可能出现“睡死现象”,所以为了避免此问题,默认不提供 low-power节电模式。

CPU电源配置

传统电源模式(SCalling)内核文档https://www.kernel.org/doc/html/v6.1/admin-guide/pm/cpufreq.html

Intel PState 内核文档https://www.kernel.org/doc/html/v6.1/admin-guide/pm/intel_pstate.html

AMD PState 内核文档https://docs.kernel.org/admin-guide/pm/amd-pstate.html

其实你如果有时间,自行研读上述电源文档,就很容易理解CPU电源配置相关内容。我在这里的讲述将忽略大量技术细节和实现方式,仅仅是告诉你如何调整CPU的电源模式

/sys/devices/system/cpu/cpufreq 目录下有许多文件名为 policyx代表核心编号),这些文件对应着你电脑上的CPU核心,而CPU的电源调度细节就在这些文件夹里面。在 policy 目录下有一个文件 scaling_driver,使用cat或其他方式访问它,得到的结果就是我们当前使用的调度器:

  • intel_cpufreq / acpi_cpufreq : 使用scaling freq 调度
  • intel_pastate : 使用Intel Pstate调度
  • amd-pstate : 使用AMD Pstate调度

scalling freq调度

这是最传统的CPU调度方式,你可以在 policy文件夹下的 scaling_available_governors获取可选电源模式:

英文 中文 含义
performance 性能模式 最极致的性能表现,最火热的CPU温度,最短的续航
powersave 节能模式 为绿色地球出一份力
balance 平衡模式 性能和续航,小孩子才做选择,我全都要
schedutil 平衡模式 平衡模式的一种,使用不同算法进行调度
ondemand 平衡模式 平衡模式的一种,根据当前cpu负载动态调整频率。当负载大于阈值时调整到最高频率,其他情况按负载比例计算频率
conservative 平衡模式 平衡模式的一种,根据当前cpu负载动态调整频率。当负载大于最大阈值时步进递增频率,当负载小于最低阈值是步进递减
userspace 用户模式 以用户指定的频率运行 CPU,可通过/sys/devices/system/cpu/cpuX/cpufreq/scaling_setspeed 进行配置

你可能好奇,为啥这里有这么多平衡模式,其实这些个平衡模式作用都是一样:平衡性能和续航,不过使用的算法可能不同,这里我不做详细说明,我在网络上找到一些详细资料可以参考,有兴趣的朋友可以自行查阅:

Intel Pstate

这是Intel 近几代cpu独享的moment, 内核开启intel pstate后(V23 内核默认开启)你会发现在 policy 文件夹下多了几个文件:

我们只需要关注:

  • energy_performance_available_perference : 可用的pstate电源调度
  • energy_performance_perference : 当前选定的pstate电源调度,可以更改此文件内容来更改电源调度
    在Intel Pstate中出现了两个新的调度方案:
  • balance_performance : 平衡偏性能,平时工作频率不高,在负载增大时能快速响应
  • balance_power : 平衡偏节能,电源策略较为保守
    在部分电脑上还有 default 方案,此方案就是经过pstate优化过的balance策略

具体PState使用的黑魔法以及主动模式和被动模式的调度策略,可以参照内核文档进行分析。

AMD PState

这是AMD ZEN2 以上用户,以及吃上kernel 6.4.x的用户独享的moment。 其实AMD在6.1内核已经做了PState的支持,不过是被动模式。

(Actvie Mode)主动模式

Active Mode 仅在内核版本大于6.4以上,且内核选项打开AMD PState时可用。可能需要在grub内加入启动参数以打开此功能:amd_pstate=active ,也可以修改文件实现

Active Mode 的电源策略和Intel PStatewi类似

(Passive Mode)被动模式

Passtive Mode 仅在内核大于6.1以上,且内核选项打开AMD PState时可用。可能需要在grub加入启动参数开启此功能:amd_pstate=passive,也可修改文件实现

Passive Mode 提供两种电源模式,在 /sys/device/system/cpu/cpufreq/scaling_governor文件进行调整:

  • performance 使用platform_profile进行配置,同使调度积极性较高
  • scheutils 在 /sys/device/system/cpu/cpufreq/schedutil/rate_limit_us 文件中调整调度粒度(两次调度的间隔时间),和ACPI的scheutils类/sys/device/system/cpu/cpufreq/scaling_governor
    (Guided Mode)引导模式

Guided Mode 仅在内核大于6.1以上,且内核选项打开AMD PState时可用。可能需要在grub加入启动参数开启此功能:amd_pstate=guided,也可修改文件实现

其类似汽车的自动挡,驱动程序请求最低和最大性能级别,平台自动选择此范围内适合当前工作负荷的性能级别

GPU电源管理部分

AMD GPU

如果是amdgpu 则是需要更改两个文件(使用tee命令进行写入):

  • /sys/class/drm/card0/device/power_dpm_state (这个是一个遗留接口,目的是向后兼容)

    • performance 高性能模式
    • balance 平衡模式
    • battery 节能模式
  • /sys/class/drm/card0/device/power_dpm_force_performance_level

以下设置来自amd官方驱动文档:

* auto :当选择auto时,设备将尝试针对驱动中的当前条件动态选择最佳功率曲线
* low :当选择低时,GPU被强制到最低功率状态。
* high:当选择高时,GPU被强制到最高功率状态
* manual:当选择手动时,用户可以通过sysfs pp_dpm_mclk、pp_dpm_sclk和pp_dpm_pcie文件手动调整每个时钟域启用的电源状态,并通过pp_power_profile_mode sysfs文件调整电源状态转换方式。
* profile_standard 固定时钟级别分析模式。此模式将时钟设置为固定的级别,该级别因 ASIC 而异。这对于分析特定工作负载很有用(不常用)
* profile_min_sclk 最小 sclk 分析模式。此模式将 sclk 强制设置为最低级别。这对于分析最小功耗的场景很有用(不常用)
* profile_min_mclk 最小 mclk 分析模式。此模式将 mclk 强制设置为最低级别。这对于分析最小功耗的场景很有用(不常用)
* profile_peak 峰值分析模式。此模式将所有时钟(mclk、sclk、pcie)设置为最高级别。这对于分析最大性能的场景很有用。(不常用)、
  • AMD核显安兔兔验证数据

模式设置为low时,gpu得分12144

low.jpg

模式设置为auto时,gpu得分88544

auto.jpg

模式设置为high时,gpu得分89575

high.jpg

Intel GPU

intel GPU使用的i915驱动,并不希望你对其做出调整,因为其驱动自带的电源策略已经足够聪明。不过你也可以通过intel 提供的intel-gpu-tools进行调整和获取信息

sudo apt install intel-gpu-tools

然后使用

sudo intel_gpu_frequency

来获取当前频率(当前使用的是Intel A750)
image.png

可以看到intel的显卡驱动是在600 MHz 到 2400 MHz 之间动态调整

测试笔记本下intel核显跑分如下
gxn.png

Nvidia

无话可说,去驱动调整吧


本文作者为 deepin 开源社区中心研发 longlong 本文遵循 CC-BY-NC-SA-4.0 https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh 分发

致谢

感谢deepin 社区内核团队 感谢社区测试团队 感谢 @fslong以及其他参与v23内核续航测试的社区用户

Reply Favorite View the author
All Replies
3 / 3
To page
taffy
deepin
2023-08-22 17:13
#41

所以20版本是得不到优化的是吗?

Reply View the author
longlong
deepin
Developer
2023-08-22 17:39
#42
taffy

所以20版本是得不到优化的是吗?

社区20版本后面不会受到支持,所以不会做新功能更新,uos那边已经同步过去,家庭版,专业版和教育版都会进行优化。

Reply View the author
mzcc
deepin
2023-08-23 17:42
#43
longlong

社区20版本后面不会受到支持,所以不会做新功能更新,uos那边已经同步过去,家庭版,专业版和教育版都会进行优化。

这是新功能吗?这不是bug吗?

Reply View the author
taffy
deepin
2023-08-23 17:53
#44
longlong

社区20版本后面不会受到支持,所以不会做新功能更新,uos那边已经同步过去,家庭版,专业版和教育版都会进行优化。

bug难道不应该同步修复吗。。因为旧版本所以直接不管了,并不合理

Reply View the author
longlong
deepin
Developer
2023-08-23 18:26
#45
taffy

bug难道不应该同步修复吗。。因为旧版本所以直接不管了,并不合理

这是属于功能性质更新,之前的电源策略依然是有效,不过没有做对于新的pstate的适配。

Reply View the author
晚秋(lateautumn)
Moderator
2023-08-23 19:21
#46
WangZhongyun

越来越好了,大家齐心协力真好

agree只要有坛神发布新内核,我就适用。是不是因为我的内核版本较新的原因,真没发现笔记本过热的现象。V23的续航也越来越好了。

Reply View the author
mzcc
deepin
2023-08-24 02:17
#47
longlong

这是属于功能性质更新,之前的电源策略依然是有效,不过没有做对于新的pstate的适配。

经过对CPU使用率和功耗的监测,我们发现了一个令人惊讶的事实:尽管在高负载场景下CPU的占用率不高,但其功耗却持续升高,最终导致设备发热并影响续航。也就是说,我们前期做的省电优化工作,不仅无效,还起了反作用

你应该看下文章开头起因哪里是怎么写的,到底是功能更新,还是bug,一目了然吧。

Reply View the author
大蒜是只猫
deepin
2023-08-24 17:13
#48

什么时候可以把这些操作搞成可视化界面。搞命令实在有点儿麻烦。这么多字都懒得看。

Reply View the author
追梦空间
deepin
2023-08-24 22:47
#49
20.9发布还不够一年就被抛弃,就是当年的win vista 8都没这么快,没有新功能,影响发热和续航的问题也应该管一下才对
Reply View the author
longlong
deepin
Developer
2023-08-25 03:45
#50
mzcc

经过对CPU使用率和功耗的监测,我们发现了一个令人惊讶的事实:尽管在高负载场景下CPU的占用率不高,但其功耗却持续升高,最终导致设备发热并影响续航。也就是说,我们前期做的省电优化工作,不仅无效,还起了反作用

你应该看下文章开头起因哪里是怎么写的,到底是功能更新,还是bug,一目了然吧。

bug存在的问题我们在去年12月更新的时候已经修复了,但是对于pstate的支持(AMD)是今年8月才做的支持。所以说20.9不存在bug。

Reply View the author
longlong
deepin
Developer
2023-08-25 03:47
#51
追梦空间
20.9发布还不够一年就被抛弃,就是当年的win vista 8都没这么快,没有新功能,影响发热和续航的问题也应该管一下才对

deepin是一个社区发行版,免费的代价就是我们没有充足的人力物力去做LTS。如果你希望能有LTS 可以成立SIG来维护或者选择商业发行版UOS

Reply View the author
tmwen
deepin
2023-08-26 08:04
#52
阿尼樱奈奈

like

可以啊

Reply View the author
ran
deepin
2023-08-28 01:01
#53

我的电脑,使用Windows时,拔了充电器,还能用4个小时,用Deepin时,刚拔就提示电量过低,然后就关机了,必须插着电才能使用。不知道该怎么办。RedmiBook 14 锐龙版,CPU是3700U的那版。

我该怎么办呢?

Reply View the author
ran
deepin
2023-08-28 01:06
#54
ran

我的电脑,使用Windows时,拔了充电器,还能用4个小时,用Deepin时,刚拔就提示电量过低,然后就关机了,必须插着电才能使用。不知道该怎么办。RedmiBook 14 锐龙版,CPU是3700U的那版。

我该怎么办呢?

说来也奇怪,这个现象也不是每次都会出现,有的时候会有,有的时候感觉又是正常的。

Reply View the author
dgmenghuan
deepin
2023-08-28 18:23
#55

tail

Reply View the author
我有一个小秘
deepin
2023-08-29 04:11
#56

因为这个电源管理问题,两次卸载deepin。这个问题终于开始解决了

Reply View the author
风过无痕
deepin
2023-08-29 18:11
#57

最早搞安卓手机时,这些模式就是最常见的哪几种了,试试怎么样

Reply View the author
132******94
deepin
2024-05-14 00:19
#58
## 沉贴打捞
 
我的电脑是intel cpu,按帖子说的是intel_patate调度配置,在终端命令中也体现了出来
 
问题在于,我的笔记本电源模式默认是平衡模式,然而在终端中显示为performance(性能)模式,经测试结果为:
 
* 平衡模式 == performance
* 高性能模式 == performance
* 节能模式 == balance_performance
 
### 这个等式它正常吗?deepin开发的各位大神大神请查收一下
====
Reply View the author
3 / 3
To page