跳到主要内容

折腾Windows睡眠功能实录

·1967 字·4 分钟

前言 #

看了好多好多网上的调教Windows睡眠功能的视频和帖子,没有一个能解决问题,提出的解决方案也都没有给出一个所以然。Linus差评君通过反复测试的方法尝试寻找睡眠睡死、突然唤醒和“失眠”的规律,这也是我之前的寻找路径,但是反复测试需要的测试量过大,考虑的变量过多。全部测试出来实在不是很现实,不同的人的笔记本又有不同的情况,不讨论原理的话很难在其他人的电脑上复现,所以本文意在授人以渔。

如网上的好多方案一样,我也只是提供我笔记本的情况,以及对应的看似成功了的解决方案。希望能提供一些帮助。

问题 #

系统信息 #

这是一台新安装系统的Thinkbook 14+ ARA笔记本,无独显,处理器是AMD Ryzen 6800H。系统信息如下

设备名称	HIDE-SEEK
处理器	AMD Ryzen 7 6800H with Radeon Graphics            3.20 GHz
机带 RAM	32.0 GB (27.7 GB 可用)
...
系统类型	64 位操作系统, 基于 x64 的处理器
笔和触控	没有可用于此显示器的笔或触控输入

版本	Windows 11 家庭中文版
版本号	24H2
安装日期	‎2024/‎12/‎22
操作系统版本	26100.2605
体验	Windows 功能体验包 1000.26100.36.0

问题描述 #

进入睡眠以后掉电很快,没多久就因为耗电过多(4%)触发休眠门槛,导致系统休眠(hibernate)到硬盘。睡眠时,键盘灯亮,电源灯不呼吸,但是大小写锁定灯和FN锁定灯熄灭。

测试方案 #

win + xa打开管理员终端,输入 powercfg /systempowerreport 生成系统的电池报告,电池报告会生成在%HOME%目录下

SW0%的电池报告

发现在键盘灯点亮期间,系统电源状态是sleep,系统已经进入睡眠状态。进一步分析报告,发现软件的Low Power State Time是0%,同时DRIPS的统计时间中没有数据。说明由于软件的某些影响,系统整体没能进入低功耗的状态。

有问题的DRIPS

根据微软现代待机的文档,这可能是由于该硬件、或软件缺乏合适的驱动程序导致的。电池报告在下方列出了5个在本次睡眠中最活跃的5个设备。可以在被标记为红色session blocker中进一步查看被标记为高耗能的设备。

最活跃的硬件

可以看到,这些设备的活跃时间在90%以上,这是显然是不正常的,符合微软文档中设备异常活跃的描述。因此,需要找到该设备ID对应的设备是什么,去设备管理器中更新或重新安装驱动程序,并检查该设备是否存在其他问题。

向下继续翻电池报告,可以在Detailed FX Devices Information节中,找到每个设备ID对应的位置。

Detailed FX Devices Information

使用下面的代码定位设备的名称

Get-PnpDevice | Select-Object -Property FriendlyName, InstanceId | Out-GridView

Out-GridView

在弹出的窗口中搜索对应的设备位置,搜索即可找到对应的设备在设备管理器中的名字,在设备管理器中找到设备,尝试选择自动更新驱动程序。

在我的案例中,我发现是AMD的USB控制器和其下的USB集线器过于活跃,这些设备的驱动可能本身不含现代待机要求的low-power idle states,我额外检查了对应设备的电源管理设置,发现允许计算机关闭此设备以节约电源选项未勾选。我推测可能是因为系统无法以直接关闭设备的方式停止该设备活动,所以该设备活跃时间畸高。因此,勾选该项再次测试,发现系统可以正常进入睡眠,键盘灯正常熄灭。

电源管理设置

此外,在后期的测试过程中,还会出现个别程序长时间占用音频流(但不发出声音,因此难以察觉,可以使用powercfg /requests查看是否存在这种情况)导致的“高功耗”睡眠的情况,在系统电源报告中也有体现,可以直接寻找红色的电源记录检查是否存在问题。

之后,睡眠期间耗电高的问题成功解决

如果上述方案仍难以解决问题,可以考虑使用Windows性能分析器进一步确定问题。

现代待机 #

现代待机是微软在Windows上退出的的待机机制,实际上Windows已经使用了该机制10年以上,也算是经过了一些检验。根据微软的描述,相比传统s3待机,现代待机有以下几个优势:

  • 迅速恢复:可以在1s内恢复工作
  • 睡眠期间保持后台活动
  • 无需与bios互动,仅需简单的硬件中断即可实现睡眠

Windows在使用电源和电池时的现代待机策略时不同的,以下两图反映了计算机在插入交流电源(上图)和使用电池(下图)时的系统被从DRIPS状态中唤醒时间间隔的不同。

我选择了比较典型的情况,在上述对比中,使用交流电源时DRIPS状态的中断更加频繁,大部分DRIPS状态的持续时段在8-16s之间,而使用电池时DRIPS状态的持续时段大多数在16mins以上。根据我的经验,当在睡眠期间移除和接入交流电源,会使电脑短暂唤醒,然后重新进入睡眠状态。Windows可能在这期间调整电源使用策略。

Windows在处理因超时进入睡眠和因用户操作(如电源按钮、关闭笔记本盖子等)进入睡眠的策略也是不同的。如果系统达到设定的空闲时间,系统会先关闭屏幕,再在设定的超时达到后,进入睡眠。 (如果有音频占用,系统保持关闭屏幕状态,不会进入睡眠,直到因用户操作进入睡眠) 如果用户做出进入睡眠的操作,Windows会暂停音频流,关闭屏幕的同时进入睡眠。

参考文献 #