TLP 是适用于 Linux 的功能丰富的命令行实用程序,无需深入研究技术细节即可节省笔记本电脑电池电量。之前我们的系统使用的laptopmode,但是相较于TLP还有有部分劣势:比如tlp脚本是被动唤醒,可以以较小的开销完成电源管理相关内容。而且TLP文档支持非常完善,所以可以方便用户自行调整相关配置。以下是TLP官方文档内容的和我自己的理解的结合,各位系统用户可以结合自己的实际情况diy自己的电源策略文件,也可以将好的电源配置在deepin 论坛中分享。
Qt 作为 Linux 上最重要的开发工具之一,为中国信创产业的发展和创新提供了更多的可能性和选择。Qt Group 中国区负责人许晟在开幕致辞中表示,“Qt 中国作为 Qt Group 在中国的本地化团队,不仅通过源代码交付帮助本地企业实现软件的自主创新,还基于强大的跨平台能力支持针对本地操作系统和主流芯片的开发,为中国信创产业的发展和创新提供了更多的可能性和选择。
Breakpoint 1, startline (c=0x4f8270, d=TO_SERVER, format=0x417a71"%04x:%3u: Request(%hhu): %s ") at parse.c:5252if( (print_timestamps || print_reltimestamps)
(gdb) bt
#0 startline (c=0x4f8270, d=TO_SERVER, format=0x417a71 "%04x:%3u: Request(%hhu): %s ") at parse.c:52
#1 0x000000000040b5f5 in print_client_request (c=0x4f8270, bigrequest=false) at parse.c:1692
#2 0x000000000040cc2d in parse_client (c=0x4f8270) at parse.c:1996
#3 0x0000000000403b4a in mainqueue (listener=4) at main.c:406
#4 0x00000000004045d4 in main (argc=4, argv=0x7fffffffdef8) at main.c:706
(gdb) c
Continuing.
Breakpoint 1, startline (c=0x4f8270, d=TO_CLIENT, format=0x417b32"%04x:%u: Reply to %s: ") at parse.c:5252if( (print_timestamps || print_reltimestamps)
(gdb) bt
#0 startline (c=0x4f8270, d=TO_CLIENT, format=0x417b32 "%04x:%u: Reply to %s: ") at parse.c:52
#1 0x000000000040c1f3 in print_server_reply (c=0x4f8270) at parse.c:1859
#2 0x000000000040d0e5 in parse_server (c=0x4f8270) at parse.c:2064
#3 0x00000000004035ed in mainqueue (listener=4) at main.c:336
#4 0x00000000004045d4 in main (argc=4, argv=0x7fffffffdef8) at main.c:706
// connect socket
Breakpoint 2, generateSocketName (addr=0x7fffffffdd30, display=9) at x11common.c:114114 snprintf(addr->sun_path,sizeof(addr->sun_path),"/tmp/.X11-unix/X%d",display);
(gdb) p display
$5=9
(gdb) c
Continuing.
[Detaching after fork from child process 7682]
Got connection from unknown(local)
Breakpoint 2, generateSocketName (addr=0x7fffffffd9d0, display=0) at x11common.c:114114 snprintf(addr->sun_path,sizeof(addr->sun_path),"/tmp/.X11-unix/X%d",display);
(gdb) p display
$6=0
(gdb) bt
#0 generateSocketName (addr=0x7fffffffd9d0, display=0) at x11common.c:114
#1 0x0000000000404c92 in connectToServer (displayname=0x7fffffffe363 ":0", family=1, hostname=0x0, display=0) at x11client.c:77
#2 0x0000000000402766 in acceptConnection (listener=3) at main.c:95
#3 0x0000000000403edd in mainqueue (listener=3) at main.c:452
#4 0x00000000004045d4 in main (argc=2, argv=0x7fffffffdf18) at main.c:706
(gdb)
近期,我们收到用户反馈,在使用 deepin 系统过程中遇到了 CPU 功耗过高导致的设备发热、续航较差情况,而用户在这些负载场景下,CPU 的占用往往不高。为了解决这个痛点,统信软件开源社区中心特别成立专项计划,对于 deepin 的电源进行专项优化,本文旨在针对此问题根因进行分析于说明。
在对电源进行专项优化之前,我们首先对 deepin 系统进行了深入的调查和分析,以了解其在负载场景下的实际运行情况。经过对 CPU 使用率和功耗的监测,我们发现了一个令人惊讶的事实:尽管在高负载场景下 CPU 的占用率不高,但其功耗却持续升高,最终导致设备发热并影响续航。也就是说,我们前期做的省电优化工作,不仅无效,还起了反作用(具体情况作者将在下文作出仔细说明)。
ACPI 是 Advanced Configuration and Power Interface 的缩写,是一种计算机硬件和操作系统之间交换能源相关信息的接口规范。它定义了计算机硬件的能源相关信息,如电源供应器状态、设备功耗、设备功率因数等。ACPI 是操作系统控制计算机硬件能源管理的标准,同时也是硬件厂商和操作系统之间通信的标准。
在/sys/devices/system/cpu/cpufreq目录下有许多文件名为policy<x>(x 代表核心编号),这些文件对应着你电脑上的 CPU 核心,而 CPU 的电源调度细节就在这些文件夹里面。在policy<x>目录下有一个文件`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 负载动态调整频率。当负载大于最大阈值时步进递增频率,当负载小于最低阈值时步进递减。
应用级别的省电,应该就是在保证用户使用流畅度的情前提下下节省性能。之前也有用户提出过,是否能参照 vivo 的 origin3 os 的不公平调度算法来实现优化。毕竟安卓系统的底层也是 linux,理论上实现难度不大。
Cgroups,全称 Control Groups,是 Linux 内核提供的一种资源管理机制,用于对进程分组并对其资源进行限制和隔离。Cgroups 可以用于限制进程的 CPU、内存、磁盘、网络等资源,也可以用于限制进程的优先级和 IO 权限。利用其提供的能力,我们很容易实现类似不公平调度算法(我们新的 AM 天然支持 Cgroups 的操作),但是我还有一些顾虑: