ARTICLE · Engineering Systems

Windows 睡眠、休眠与电源计划:一份可验证的排查指南

从 powercfg 的实际输出出发,区分 S3、S4 与 Modern Standby,并用受支持的命令排查合盖、唤醒和电源计划问题。

Windows 的“睡眠”不是单一实现。遇到合盖断网、无法唤醒、待机耗电或电源计划消失时,第一步不是套用网上的注册表补丁,而是确认这台机器实际支持哪一种电源模型。

本文只使用 Windows 公开支持的界面和命令。微软明确说明:在传统 S3 与 Modern Standby 之间切换并不是受支持的配置操作,不能把修改注册表视为可靠方案;如果设备平台要改用另一种模型,需要重新安装完整操作系统。

1. 先分清 S3、S4 与 Modern Standby

状态数据保存位置断电后能否恢复典型特征
S3(传统睡眠)内存仍被供电并刷新通常不能;若同时启用“混合睡眠”,系统还会把内容写入休眠文件,意外断电后才可能恢复大部分硬件进入低功耗状态
S4(休眠)内存内容写入非易失性的休眠文件可以恢复通常比从 S3 更慢,但不需要持续给内存供电
Modern Standby(S0 低功耗空闲)系统保持在 S0,并在活跃与低功耗阶段之间切换不能把它等同于 S4可能显示“网络连接”或“网络断开”,由设备设计和策略决定

微软没有为这些状态承诺统一的“几秒唤醒时间”。实际恢复时长会受固件、驱动、存储、外设和系统负载影响。

直观地说,S3 像“暂停后让内存继续通电”,S4 像“把内存状态写入休眠文件后关掉大部分硬件”;Modern Standby 则仍处于 S0,只是在活跃与低功耗阶段之间快速切换。这个类比只帮助理解,不替代 powercfg /a 对本机能力的判断。

先在终端运行:

powercfg /a

只按当前输出解释:

  • 出现“待机 (S3)”:这台系统当前支持传统 S3。
  • 出现“待机 (S0 低电量空闲)”:这台系统使用 Modern Standby。
  • Modern Standby 后若标注“网络已连接”或“网络已断开”,它描述的是该平台支持的待机网络模式,不代表 SSH 会话一定持续。
  • 某个状态列在“以下睡眠状态在此系统上不可用”中,就不要用注册表强行“解锁”。

参考:System Power StatesModern StandbyModern Standby validation overview

2. 查看和设置合盖动作

先查看当前电源计划的合盖设置:

powercfg /query SCHEME_CURRENT SUB_BUTTONS LIDACTION

LIDACTION 的公开取值为:

动作
0不采取操作
1睡眠
2休眠
3关机

图形界面的入口是:

控制面板 → 硬件和声音 → 电源选项 → 选择关闭盖子的功能

也可以打开对应控制面板页面:

control.exe /name Microsoft.PowerOptions

微软仍记录了旧式 powercfg.cpl 调用方式,但新的 canonical name 更清楚。

如果只是希望接通电源时合盖继续运行,建议只改交流电:

powercfg /setacvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0
powercfg /setactive SCHEME_CURRENT

电池供电时仍可保留睡眠,以免放进包里后持续发热。确实需要修改电池行为时,再显式执行:

powercfg /setdcvalueindex SCHEME_CURRENT SUB_BUTTONS LIDACTION 0
powercfg /setactive SCHEME_CURRENT

参考:Lid switch close actionExecuting Control Panel items

3. 合盖不睡眠,不等于远程连接一定在线

把合盖动作设为“不采取操作”,只能避免“合盖”这一事件直接触发睡眠。下面这些因素仍可能中断远程连接:

  • Modern Standby 进入网络断开模式;
  • 网卡驱动或适配器电源管理关闭设备;
  • 系统更新、重启或网络切换;
  • SSH 服务停止、监听地址变化或防火墙策略变化;
  • 笔记本散热条件变差,触发降频或保护。

因此,远程使用前应分别验证:系统没有进入睡眠、网卡仍在线、SSH 服务仍在监听,以及合盖后的温度和通风条件可接受。

4. 用正确的报告回答不同问题

这些命令的用途不能互换。

即时线索

powercfg /lastwake
powercfg /devicequery wake_armed
powercfg /waketimers
powercfg /requests
  • /lastwake:报告最近一次睡眠转换的唤醒信息。
  • /devicequery wake_armed:列出当前允许唤醒系统的设备。
  • /waketimers:列出活动的唤醒计时器。
  • /requests:列出应用程序和驱动当前提出的电源请求;它适合解释“为什么现在不睡”,不是历史睡眠报告。

历史报告

在管理员终端中可生成:

powercfg /systemsleepdiagnostics /output "$env:USERPROFILE\Desktop\system-sleep-diagnostics.html"
powercfg /systempowerreport /output "$env:USERPROFILE\Desktop\system-power-report.html"
  • /systemsleepdiagnostics:分析最近一段时间内用户不在场的区间,以及系统是否进入睡眠;需要管理员权限。
  • /systempowerreport:报告系统电源转换,包括连接待机相关转换;需要管理员权限。

只有设备使用 Modern Standby 时,/sleepstudy 才是对应的待机质量报告:

powercfg /sleepstudy /output "$env:USERPROFILE\Desktop\sleepstudy.html"

在传统 S3 机器上,不要把 SleepStudy 当作通用睡眠诊断工具。

参考:Powercfg command-line options

5. 事件查看器只能作为辅助证据

可以在“事件查看器 → Windows 日志 → 系统”中按时间检查电源转换。常见线索包括:

  • Provider 为 Microsoft-Windows-Kernel-Power、事件 ID 42:常见于系统进入睡眠;
  • Provider 为 Microsoft-Windows-Power-Troubleshooter、事件 ID 1:常见于系统从低功耗状态恢复,并可能记录唤醒来源。

应同时核对 Provider、事件 ID、时间和事件正文,不要只凭一个数字判断原因。Windows 版本、驱动和电源模型不同,实际记录也可能不同;powercfg 报告与设备日志才是更完整的上下文。

具体操作是:

  1. Win + R,运行 eventvwr.msc
  2. 打开“Windows 日志 → 系统”;
  3. 以复现问题的准确时间为中心筛选,而不是先假定某个事件 ID;
  4. 同时查看 Kernel-PowerPower-Troubleshooter 等 Provider 的事件正文;
  5. 把睡眠、唤醒、重启、网卡掉线分别记录,避免把“SSH 断开”直接当成“机器睡眠”。

6. 电源计划:只操作本机实际存在的 GUID

先列出并确认当前计划:

powercfg /list
powercfg /getactivescheme

切换、复制或删除时,使用 /list 返回的真实 GUID:

powercfg /setactive <PLAN_GUID>
powercfg /duplicatescheme <EXISTING_PLAN_GUID>
powercfg /delete <PLAN_GUID>

删除前先确认目标不是当前活动计划,并保留至少一个可用计划。

“卓越性能”不是所有 Windows 设备都会提供的通用计划。它最初面向工作站场景,会以更高能耗换取更少的微延迟;只有当 powercfg /list 确实列出它时,才应把它当作可选项。

不能把三种电源计划简单写成固定的处理器百分比。更合适的比较是:

计划/模式设计倾向不能据名称直接断言的内容
平衡根据负载在能耗与响应之间调整最低频率、风扇策略和瞬时性能
高性能减少部分节能带来的响应延迟CPU 一定锁定基准频率或所有设备都禁用节能
卓越性能面向部分工作站减少微延迟所有 Windows 版本都提供、一定快于厂商性能模式

实际差异必须用 powercfg /query、厂商控制软件、功耗和任务基准共同确认。

Modern Standby 系统只允许“平衡”或由“平衡”派生的计划。若设置页面可用,更合适的性能入口通常是:

设置 → 系统 → 电源和电池 → 电源模式 → 最佳性能

设备厂商的性能模式还可能同时调整风扇、功率限制和固件策略,不能由一个通用 powercfg 命令完全替代。

参考:Power policy settingsChange the power mode for your Windows PC

7. 处理器最小状态不是“整机性能百分比”

PROCTHROTTLEMIN 表示处理器最小性能状态相对于最大处理器性能的百分比。它只是电源计划中的一个 CPU 子设置,不代表整机性能,也不能把普通计划“变成”另一个计划。

查看当前值:

powercfg /query SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMIN
powercfg /query SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX

长期把最小状态设得很高,可能增加空闲功耗、温度和风扇噪声,而且未必改善实际任务性能。优先选择 Windows 或厂商提供的性能模式,再用基准测试和温度数据验证效果。

如果确有可重复的延迟问题,可以在记录原值后做单变量实验。下面是受支持的设置语法,MIN_PERCENTMAX_PERCENT 必须替换为 0–100 的实际整数:

powercfg /setacvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMIN MIN_PERCENT
powercfg /setacvalueindex SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX MAX_PERCENT
powercfg /setactive SCHEME_CURRENT

测试后用同样命令恢复先前查询到的值。把两者都设为 100 只改变当前计划的两个处理器参数,不等同于“卓越性能”,也不包含 USB、存储、PCIe、显示和厂商固件策略。

参考:Minimum processor performance state

8. 一条可复现的排查顺序

  1. 运行 powercfg /a,记录这台机器当前的电源模型。
  2. 运行 powercfg /getactivescheme 与合盖设置查询,确认正在修改正确的计划。
  3. 复现一次问题,并准确记录合盖、睡眠、断网和恢复的时间。
  4. /lastwake/waketimers/requests 检查即时原因。
  5. 按电源模型生成 systemsleepdiagnosticssystempowerreport,Modern Standby 再加 sleepstudy
  6. 把报告时间线与事件查看器中的 Provider、事件 ID 和正文交叉验证。
  7. 每次只改一个设置,复测后再决定是否保留。

这套流程的重点是先辨认状态,再选择证据。它比复制固定 GUID、硬编码唤醒时间或使用未受支持的注册表切换更可靠,也更容易回退。

9. 已撤回的操作记录(历史,不是当前建议)

不要照抄本节命令。 这一节记录一次已经撤回的排查过程,用来说明相关风险。尤其不要通过 PlatformAoAcOverride 试图在 S3 与 Modern Standby 之间切换;微软不支持这种转换,执行后还可能暂时出现所有睡眠状态均不可用。当前建议仍是按前八节先确认本机能力,再使用受支持的设置。

“睡眠像打盹、休眠像把手头工作写进笔记本再睡”可以帮助区分 S3 与 S4;“睡眠约 1–2 秒、休眠约 20–30 秒”则只是某台设备上的粗略感受,不能作为 Windows 或其他电脑的保证。

历史排查中还使用过复制传统“高性能”和“卓越性能”模板的命令:

# 历史记录:不保证模板在当前设备或 Windows 版本中存在
powercfg /duplicatescheme 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
powercfg /duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61

/duplicatescheme 本身是受支持的语法,但固定模板 GUID 是否存在、复制后是否显示,以及设备是否允许切换到该计划,都必须以本机 powercfg /list 的输出为准。Modern Standby 设备常把可见配置收敛到“平衡”计划及电源模式,不能据此断定命令失败或系统损坏。

下面是一套曾采用、现已撤回的注册表切换流程,仅用于说明为什么本文改成了可验证的排查方法:

# 已撤回的历史做法:不要执行
reg add HKLM\SYSTEM\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD /d 0 /f
# 当时的记录是在重启后复制并激活电源计划,随后删除该项并再次重启
reg delete HKLM\SYSTEM\CurrentControlSet\Control\Power /v PlatformAoAcOverride /f

当时在一台机器上观察到:删除该项并恢复 S0 后,先前创建的计划仍留在列表中。这只是一次历史观察,既不能证明切换受支持,也不能推广到另一台设备。若已经执行过类似修改,应先保存 powercfg /apowercfg /list 和注册表当前状态,再根据设备厂商与微软文档恢复,不要继续叠加更多网络教程中的补丁。