電腦系統休眠后無法喚醒的問題,可以嘗試以下步驟進行排查和解決:
通過逐步排查上述方面,通常可以解決電腦休眠后無法喚醒的問題。
明明什么都沒做,合蓋睡眠的 Windows 筆電卻熱得燙人。
2020 年 1 月,NotebookCheck 將戴爾 XPS、華碩 ZenBook 等 Windows 筆記本電腦從 Windows「睡眠模式」喚醒后,發現 筆記本表面最高溫度竟然達到 50℃,整機功耗更是高達 27 W。Windows 睡眠模式設計的目標就是安靜、低功耗,但現在有如此異狀,NotebookCheck 認為「取代了 S3 睡眠模式的微軟新型待機是導致(這樣結果的)罪魁禍首」。
那么,S3 睡眠模式代表著什么?它為何被新型待機(Modern Standby)取代?發熱的合蓋筆電和新型待機又有什么關聯?
我們既想讓硬件在干活時,卯足了勁干活;又想在無人操作時,降低功耗節約能源;而且對于筆記本或是平板電腦來說,在不接入外部電源時電池電力總是有限的,因此我們需要電源管理。我們日常接觸到電腦的關機、開機也好,睡眠、休眠也罷,從宏觀上看,都屬于電腦的電源管理的范疇。
顯然,這種系統性工程需要由操作系統、硬件制造商、OEM 等角色共同參與,一個大家共同遵守的規范性文件也自然必不可少。
90 年代中期,英特爾、微軟、東芝等共同制定了幫助操作系統發現、配置計算機硬件和執行電源管理的規范——ACPI。該標準為系統、硬件組件等定義了不同的電源級別,其中,Sx 定義了系統整體的電源狀態,而 Dx 則定義了主板上硬件設備的電源狀態,文章開頭提到的 S3 就隸屬于 Sx 狀態。
在 ACPI 規范 中,系統整體的電源狀態(即 Sx 狀態)從 S0 到 S5 共分六級。但在現實生活中,常見的系統電源狀態只有如下四種:
六個狀態按數字從小到大,用電設備越來越少,功耗也依次降低,不過,將系統恢復到工作狀態 S0 所需時間也逐漸增加:
許多條件會觸發系統在 Sx 狀態中的轉換,比如說長時間無人操作后,系統會由 S0 變為 S3;睡眠狀態的系統如果接收到了鍵盤鼠標的輸入,則會切換到 S0……當然,作為普通用戶的我們并不需要操心如何完成這些轉換,我們只需要知道 Windows 中的負責此任務的組件是電源管理器,電源管理器最重要的兩個任務是告知軟件即將要被掛起到內存或者磁盤和輔助切換各種硬件設備的電源狀態。
如果只是系統和軟件被掛起,但我們的顯示器、藍牙、背光燈等設備仍處于開啟狀態,這時系統也很難說是省電的。因而,ACPI 也為 硬件設備 規定了不同的電源狀態,以 D(Device)開頭:
以低功耗藍牙設備為例,不同電源狀態下的功耗、恢復到正常狀態的延遲和 Sx 狀態類似,參考數據如下表所示:
表注:數據來自 微軟文檔 和 維基百科
設備的電源狀態由對應的驅動程序控制,驅動程序可以相對獨立地控制設備狀態。例如,我們在日常使用(S0)時,攝像頭無需開啟,那么此時的攝像頭就會被調整為 D3 狀態。但是,當電源管理器決定要切換系統狀態時,它們必須接受調度,系統電源狀態和設備電源狀態有預設的映射關系,我們可以在 Windows 設備管理器 > 設備 > 屬性 > 詳細信息 > 電源數據看到:
如上圖所示,我的顯示器支持 D0 和 D3 兩種狀態,在系統為 S0 的情況下,最低可以達到 D0 狀態,也就是說,可以處于 D0 - D3 任意一種狀態;而在系統為 S3 的情況下,則最低可以處于 D3 狀態,也就是必須關閉。硬件設備的制造商大多認為不需要在 S3 模式下保持功能正常,幾乎所有設備被設定為 S3 對應 D3。
在 Windows 7 及之前,以及目前的部分 PC 中,進入睡眠模式實質上就是系統電源狀態由 S0 切換為 S3,設備狀態再根據映射關系,切換對應的 Dx 狀態,這常常也被稱為傳統待機或是 S3 待機。
以管理員權限打開終端,輸入 powercfg /a,如果得到的結果中顯示支持 Standby(S3),則說明你的設備為傳統待機:
因此,在一臺采用了傳統待機模式的 PC 上,進入睡眠模式的步驟大致如下:
至此,我們已經解決了 S3 睡眠模式是什么的問題,那么為什么微軟拋棄它,選擇所謂新型待機呢?
雖然 ACPI 制定了電源管理的規范,但隨著時間的推移,新的需求被發掘,人們開始在 Sx 狀態的基礎上做文章。
例如,Linux、Windows 會支持一種叫做混合睡眠(hybird sleep)的狀態。這種情況下,機器狀態既會被保存到磁盤,也會被保存到 RAM,是 S3 和 S4 狀態的混合;Mac 也曾經宣傳過這項特性。Arch Linux Wiki 解釋了設置這種狀態的目的:
如果電池沒有耗盡,那么系統可以從 RAM 恢復。如果電池耗盡,系統可以從磁盤恢復,這比從 RAM 恢復慢,但至少機器的狀態沒有丟失。
在 S3 睡眠下,系統狀態被保存到了 RAM 中,前面提到過 RAM 一旦斷電,保存的內容就會消失;想要進入系統必須重新進行引導,而 S4 狀態中用于保存系統狀態的磁盤沒有這種問題。所以將兩者結合的混合睡眠,既解決了數據安全問題,也可以在沒耗盡電量之前盡可能縮短喚醒的時間。
另外,比較知名的例子就是 Windows 中的「快速啟動」功能。很多人可能都不知道,在開啟「快速啟動」的這項功能以后,Windows 的關機功能不再是真的關機了,電腦在你點下關機按鈕以后并不會進入 S5 狀態,而是進入了 S4 休眠狀態。但休眠功能不是保存系統的全部狀態嗎?為什么 Windows 關機后還要輸入密碼,重新打開應用呢?
確實,傳統的 S4 休眠會保存系統的全部狀態,包括登錄的用戶、開啟的應用,重啟后,引導程序會直接將磁盤中的狀態加載到內存中,這樣就省去了重新加載內核、初始化硬件的功夫。Windows 10 開始菜單中,休眠選項默認是隱藏的,可以通過 電源選項 > 更改電源按鈕的功能 > 關機設置 重新打開。
但微軟的考量是,S4 休眠生成的文件比較大,Windows 上為可以使用總內存的 40%,我們能用 PowerShell 在 C 盤根目錄看到這個休眠文件:
如圖所示,這個休眠文件大約有 10 GB,這對一些磁盤容量較小的設備是一個不小的負擔。另外如果設備使用的不是固態硬盤,如此大的文件加載時間可想而知也很慢。因此,開啟「快速啟動」以后,Windows 的關機功能確實是休眠,但在休眠之前,Windows 會退出所有應用并注銷用戶會話,再生成休眠文件;這時休眠文件就只占內存大小的 20% 了,「快速啟動」體驗自然也會變得更好。
以上兩個例子說明,廠商并非一定要拘泥于 ACPI 的規范,如果有了新的需求,解決需求才是第一位的。那么,傳統 S3 睡眠遇到了什么無法解決的需求呢?微軟在其 硬件開發文檔 中如此回答:
電源管理架構的目的是滿足不斷增長的用戶需求,包括:
客戶要求他們的計算機隨時可用,即使在關閉時也是如此……在插電或者使用電池時,客戶都希望減少 PC 使用的電量
S3 睡眠也許能做到節能,但離隨時可用差了不少。比如,我們希望電腦上的 IM 軟件也和手機一樣,可以及時接收消息,但 S3 狀態處理器無法工作,就更不用提接收消息了;再比如,我們也希望電腦可以像手機一樣按下指紋就能解鎖,系統需要先花上大概 5 秒從 S3 切換到 S0,才能識別指紋進行解鎖;又比如我們想使用 Windows 下的語音助手,如果系統處于 S3 睡眠狀態,那么收音、網絡設備都處于 D3 關閉狀態,這時語音助手就沒有辦法響應,而讓系統整個保持在 S0,這樣整機功耗就無法控制了。
看到這里,讀者可能會想:這不就是智能手機上的即開即用的使用體驗嗎?確實如此,新型待機正是期望將智能手機的即開即用體驗帶到 Windows 上。
早在 Windows 8 時代,微軟就認識到了 S3 睡眠模式的不足,那時,微軟期望 PC 能夠在睡眠模式下也能正常連接網絡,所以微軟推出了一個新式的睡眠模式并命名為連接待機(Connected Standby),即在保證系統和設備處于 S0 響應速度的基礎上,又能有 S3 的功耗控制。而在 Windows 10 中重新更名為新型待機。
圖注:圖片修改自 WinHEC Fall 2017
傳統 S3 待機控制 CPU 功耗的方法很簡單,斷開 CPU/SoC 部分的供電即可,這時芯片里的寄存器全部清空變成了 0;但在喚醒時,需要重新初始化寄存器,這就是從 S3 恢復成 S0 時需要一點時間的原因,當然這個時間遠比從 S4 恢復所需要的短得多。
但現在連這一點初始化的時間都不能要了,也就意味著需要 CPU/SoC「記住」之前寄存器的狀態。因此,CPU/SoC 內部就需要有一枚專門的芯片按照下圖的步驟,一步步把對應寄存器區域的狀態保存在 CPU/SoC 內部的 nvram 中,再切斷電源。這樣就讓設備實現了在 S0 響應速度的基礎上,又能有 S3 的功耗控制。
所需要功耗從上到下依次變小,且只有每層的任務都完成以后才會操作下一層的目標
首先,CPU/SoC 外部的所有設備都必須進入低功率模式, 也就是 Sx 對應的 Dx 為最低的設備電源狀態。接下來,將網絡和無線電設備置于低功率模式,在此期間,這些設備通常會使用很少的一部分電源以維護連接,并在必要時喚醒 CPU/SoC 。
在 CPU/SoC 外部的所有設備(包括通信設備)都斷電后,CPU/SoC 的芯片組和非處理器核心也將進入低功率模式,這可以進一步節約能源;在這之后,就是處理核心 CPU 和 GPU 以及位于最后的一些其他電路了。如果中間有任何一個部件拒絕進入低功耗狀態,那么整個鏈路就會中斷,重新回到 S0。英特爾將這一系列狀態稱之為低功耗 S0 狀態(low power S0 idle),代號為 S0ix,每讓一層設備進入低功耗狀態則為 S0ix 中的 x 加上一,因此在 CPU 和 GPU 停止工作以前的狀態也常常被稱作 S0i3 休眠狀態。
所以,新型待機對 PC 上的芯片組等設備有一定的要求。以管理員權限運行終端命令 powercfg /a,若結果含有 Standby(S0 low power idle),則說明你的設備為新型待機。使用新型待機的設備,不支持 S1-S3 睡眠模式:
硬件設備的省電還不夠,軟件也有做相應的準備。這方面,新型待機和 S3 睡眠一樣,都將運行的應用掛起到 RAM。和 S3 狀態不一樣的是,新型待機目的是在睡眠狀態下仍能完成一些任務,因此,部分活動享有新型待機下的豁免權。
微軟稱這些應用活動為 激活器,前面提到過新型待機狀態下,網絡甚至是 CPU 都可能不工作,這些激活器的作用就是將這些設備短時間喚醒,執行某些指令。這些激活器全都是 Windows 內置的系統服務,例如負責接收 UWP 應用通知的 WNS、負責處理 Windows 更新的 WU、負責管理網絡連接的 NCSI……它們的存在使 Windows S0ix 待機狀態時也能收到通知,并可以處理后臺維護任務。
以 UWP 后臺任務為例,我們在 Windows 設置中的應用 > 應用和功能 > 設置中看到一項后臺應用權限,這個權限控制的就是在待機時,應用執行后臺任務的能力。默認的「電源已優化」選項意思是根據 PC 連接電源的情況,決定是否執行任務。
當激活器喚醒部分硬件設備時,新版 Windows 還會限制它們能夠使用的資源量,例如 UWP 后臺刷新任務只允許活動 5 秒,5 秒后則會被終止,硬件設備也會再次進入低功耗狀態。需要注意的是,和 S3 睡眠模式不同,這些任務并不會導致系統被喚醒至完全工作狀態,除了需要喚醒的少部分設備外,其他硬件仍處于低功耗狀態,所有第三方應用、服務也仍被掛起。
除了被激活器喚醒的小部分時間中,新型待機 PC 的功耗和 S3 相當。如下圖所示,運行 powercfg /spr 生成的電池報表顯示,在 2022 年 4 月 16 日 2 - 11 時的新型待機過程中,軟件(SW)、硬件(HW)100% 處于低功耗狀態,筆記本電量消耗了 3%:
上面的報表還顯示,在進入睡眠模式前,有一個關閉屏幕(Screen Off)階段。這種設計很符合直覺,按下睡眠按鈕后,PC 直接關閉屏幕,將應用掛起到 RAM、切換硬件設備狀態都在用戶無感知的息屏期間完成,這也是誤觸了睡眠功能后,立刻喚醒 PC 花費時間比正常情況稍長的原因。從關閉屏幕到睡眠的間隔對應著設置面板中的相關選項,一般建議將兩個時間統一:
當然新型待機模式和傳統待機一樣,點擊電源按鈕,或者操作鍵盤鼠標,PC 就會切換為 S0 完全開啟狀態。因為系統本身就處于 S0,部分設備也不需要經歷 D3 到 D0 的高延遲狀態切換,所以新型待機的喚醒可以達到 1 秒以內,微軟稱之為「instant on」。Intel Evo? 認證 主打的「即時喚醒」也正是得益于新型待機。
當然為了進一步增強 S0ix 的省電效果,新型待機還有一個機制叫做 自適應休眠:當新型待機期間耗電量超過 5%,系統會直接進入最深一級的 S0i5 狀態,這個狀態理論上功耗為 0 瓦。有這個機制的存在,有時候將筆記本合蓋后,你會發現第二天再打開時就無法用鍵鼠喚醒了。如下表所示,由于某些軟件活動,我的筆記本待機耗電達到了 5%(264),接著,PC 就直接進入了休眠模式(265),電量停止消耗。
綜上所述,在一臺采用新型待機的 PC 中,進入睡眠模式步驟如下:
我們的第二個問題也就迎刃而解了。讓我們回到文章開頭,新型待機又是怎么制造出了高達 50℃ 的合蓋筆記本呢?
事實上,新型待機推行以來,批評的聲音此起彼伏,文章開頭的新聞只是其中一例。這些批評一部分確實和新型待機有關,也有一部分則應當歸咎于誤操作。
雖然微軟在宣傳中將新型待機功耗和 S3 并稱,但毫無疑問的是,由于傳統待機狀態下沒有任何后臺活動,設備也大都處于關閉狀態,耗電量極小。
但新型待機狀態下,一些設備可能并不會進入低功耗狀態,甚至是拒絕進入低功耗狀態;此外新型待機也有喚醒 SoC 處理指令的機制,所以,新型待機的耗電量必然不會比 S3 更好,但并沒有到不能接受的程度,從前面的報表中可以看出,9 個小時的待機時間耗電量為 3%。
因此,一個非常普遍的觀點是新型待機相較于傳統待機耗電量更大,甚至有 Surface 用戶稱 睡眠模式下短時間內電量驟降 20%。的確,既要即時啟動又要不耗電的黑魔法是不存在的,但 20% 實屬夸張,如果機器電池狀況良好,那么唯一可能的解釋是 PC 根本沒有進入睡眠模式。
那么,為什么 PC 會無法進入睡眠模式呢?答案很有可能是 Windows 的電源請求機制。
試想,我們正在觀看一部 2 個小時的電影,PC 依舊死板地遵照設置,3 分鐘無操作直接息屏睡眠,這樣的體驗實在很差。正是為了解決這些情況,應用可以發送電源請求,系統掃描到電源請求后不會發送切換狀態的指令。電源請求可以使用 powercfg /requests 看到:
音視頻應用之外,其他應用也有可能發送電源請求,它們會阻止閑置的 PC 睡眠,電量消耗自然會高。不過,當我們明確要求 PC 睡眠時,這些應用也會被停止,只需要將合蓋/電源按鈕的功能設置為睡眠,然后執行這些操作即可。
除了對耗電量的批評,還有人認為 新型待機只是假睡,因為他們發現,書包里的 PC 風扇仍在工作。本質上,這是不信任其激活和喚醒機制。
根據前面對新型待機原理的講解,我們知道,和 S3 狀態一樣,除了豁免的少數應用活動,待機狀態下傳統應用、第三方系統服務都被掛起到內存,它們沒有辦法喚醒機器。最有可能將機器喚醒至 S0 完全開啟狀態的并非軟件,而是外設。例如,如果 PC 外接了鼠標,并且在不關閉鼠標的情況下直接合蓋放進背包,那么,鼠標只要受擠壓輕微移動,PC 就會退出睡眠狀態。這種情況并非新型待機獨有,唯一的解決方案是裝包之前,拔出或者關閉外設的電源。
還有一種情況,前面提到過,Windows 是可以在待機狀態下執行更新操作的。根據 微軟的設計,如果連接了網絡,那么 Windows 可以在待機狀態后臺下載已有的更新,如果還連接了電源,那么 Windows 也能安裝更新甚至重啟設備。如果更新下載任務繁重,風扇確實可能會工作,由于此時為合蓋狀態,散熱條件差,很可能造成熱量堆積。要是廠商將待機模式下的風扇設計為完全不工作,那么此時可能會更熱。
由網絡連接引發的問題可以通過禁用新型待機的連接解決。部分設備上的設置面板提供了「允許待機時使用 Wifi」之類的選項,如果沒有提供的話,則可以直接修改注冊表:在 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Power 新建名為 EnforceDisconnectedStandby 的 DWORD,值為 1。這樣,就可以禁止待機時網絡下載。其代價是我們無法在待機狀態下收取郵件等需要聯網的通知。
不過,文章開頭的案例大概率并非由以上原因導致。NotebookCheck 并沒有給出完整的測試數據和步驟,但能確定的是,根據該文章發布兩天后的注釋,文章中的測試機并沒有安裝最新驅動。而戴爾則早在文章發布 5 個月前釋出了針對現代待機的修復補丁,Elevenforum 也有因驅動引發待機異常問題的討論。理論上,新型待機工作需要硬件設備的緊密配合,如果驅動出錯,那么待機溫度異常也是有可能的。
總而言之,如果新型待機異常,可以通過管理員權限運行 powercfg /spr 獲得待機的時間、軟硬件活動、喚醒事件等信息,再從以下方向排查:
不管用戶愿意與否,新型待機都會在更多的設備上應用。就我個人而言,用極少量的待機耗電,換取無需關機、隨時可用的 PC 使用體驗,這筆交易不算虧。然而,由于 PC 上缺少統一推送渠道,UWP 多年來普及緩慢,新型待機離智能手機一樣的使用體驗還有很長一段路要走。