插電響應快、斷電用得久:用 pmset 管理 macOS 的睡眠
Matrix 精選
Matrix 是少數派的寫作社區,我們主張分享真實的產品體驗,有實用價值的經驗與思考。我們會不定期挑選 Matrix 最優質的文章,展示來自用戶的最真實的體驗和觀點。
文章代表作者個人觀點,少數派僅對標題和排版略作修改。
Power Manager Setting (pmset) 是 macOS 的系統級電池管理工具,通過調整 macOS 的睡眠計劃,可以讓Mac睡得更「好」,達到 「插電響應快,斷電用得久」 的理想目標。
Mac 是怎麼睡覺的?
Mac 的睡覺分成兩種, 「休眠」 (sleep) 和 「睡眠」 (hibernate) 。簡單點說,休眠和睡眠就好比人的小憩和睡大覺,小憩醒得快,睡大覺就醒得慢。
當你長時間不操作 Mac 或把 MacBook 的蓋子合上或點擊 Apple Logo 菜單下的 Sleep 選項,系統會進入 「休眠」 狀態,由於數據仍存儲在內存中,此時系統可以被快速喚醒,快速恢復到休眠前的狀態。
在「休眠」一段時間後,Mac 會根據你的設定進入更深一層的 「睡眠」 狀態,此時 Mac 會考慮將內存中的數據作爲一個鏡像寫入到硬盤中(GB 級別大小),然後放棄內存供電,達到更加省電的目的。此時喚醒系統,數據需要從硬盤重新裝載至內存,耗時長,速度慢。
總結一下,「休眠」和「睡眠」的主要區別:
- 喚醒速度快慢
- 是否向內存供電
- 是否向硬盤寫入內存鏡像
當然,Mac 到底要怎麼「睡」,我們是可以通過 pmset
調整的。
macOS 系統睡眠流程
如圖所示,當我們不使用 Mac 時,一段時候後,系統先進入 sleep
狀態,然後根據 hibernatemode
的模式,決定將鏡像數據寫入內存還是硬盤。
standby
和 autopoweroff
相當於兩個並行的模式計時器,Mac 會根據當前供電條件作出模式的選擇,在計時器階段內,當時間條件滿足,Mac 就會將鏡像寫入硬盤並睡眠。
pmset 用法
sudo pmset [-選項] <參數>
例子:
pmset -g custom pmset -g cap sudo pmset restoredefaults
常用選項
pmset -a pmset -c pmset -b pmset -g
常用參數
:art: sleep
sleep 控制進入休眠所需要的空閒時間
:art: hibernatemode
hibernatemode supports values of 0, 3, or 25. Whether or not a hibernation image gets written is also dependent on the values of standby and autopoweroff.
hibernatemode 負責管理睡眠模式。值得注意的是,休眠時的內存鏡像是否寫入硬盤,除了受 hibernatemode
的控制,還和 standby
以及 autopoweroff
的值有關。
hibernatemode 有 3 種休眠模式可選擇
-
hibernatemode = 0
- iMac, Mac Mini等 Mac桌面設備默認參數
- 持續向內存供電,將數據保留在內存
- 喚醒速度快,減少硬盤佔用
- 數據有丟失風險
- 耗電量大
-
hibernatemode = 25
- 將數據寫入硬盤
- 不向內存供電,將內存鏡像直接寫入硬盤
- 數據不易丟失,鏡像佔用硬盤空間
- 喚醒速度慢
- 耗電量少
-
hibernatemode = 3
- MacBook 筆記本設備默認參數
- safe sleep, 數據既寫入內存又寫入硬盤
- 持續向內存供電
- 喚醒時,根據設備電量自動選擇從 內存/硬盤 恢復
:art: standby
standby causes kernel power management to automatically hibernate a machine after it has slept for a specified time period.
standby 是 Mac 在休眠時的計時器,當滿足時間條件,Mac就會由「休眠」狀態轉至「睡眠」狀態。
standby模式需要以下條件:
- 電池供電
- 沒有外接設備
- 沒有網絡活動
- 沒有外接顯示器
在滿足條件的前提下, standbydelayhigh/low
秒後,會進行睡眠。比較人性化的的一點是,standby 提供了兩個倒計時,通過一個閾值 ( highstandbythreshold
) 進行控制。
:art: highstandbythreshold
highstandbythreshold(電池剩餘電量百分比)它是 standbydelay
模式選擇閾值,默認 50% 電量。
standbydelayhigh standbydelaylow
:art: autopoweroff
autopoweroff is enabled by default on supported platforms as an implementation of Lot 6 to the European Energy-related Products Directive. After sleeping for <autopoweroffdelay> seconds, the system will write a hibernation image and go into a lower power chipset sleep. Wakeups from this state will take longer than wakeups from regular sleep.
autppoweroff 是爲了滿足 歐盟能源效率 Lot 6 條例 (關於待機和關閉模式的要求)而設計的,但並不是全部設備都有這個這個設定,需要通過 pmset -g cap
查看是否能調節此項參數。
autopoweroff
模式需要滿足以下條件:
- 外部電源供電
- 沒有外接設備
- 沒有網絡活動
在滿足條件的前提下, autopoweroffdelay
秒後,系統會寫入內存鏡像然後睡眠。與上文提到的 standby
不同, autppoweroff
更多是爲了連接外部電源充電時設計的。
:art: gpuswitch
gpuswitch
這個參數用於管理顯卡的選擇,適合有獨立顯卡/外置顯卡的 Mac
gpuswitch=0 gpuswitch=1 gpuswitch=2
調節這個參數可以避免在電池供電時使用耗電量高的獨立顯卡,以節省電量。
其他常用參數
lidwake tcpkeepalive displaysleep disksleep acwake
更多參數在終端運行 $ man pmset
, 查閱 pmset
的說明
:star2: 個人設置方案
我個人所希望的睡眠計劃是:外接供電條件下響應儘可能快,電池供電條件下耗電少。
:zap:️ 外部供電下的 pmset 設置
在進行外部供電的時候,我希望 MacBook 是處於一個 「時刻準備着」 的狀態(參考 iMac ),因此我希望我的 Mac能清醒更久,並且永不 「睡眠」。因此我會作出以下設置:
永不睡眠:
-
hibernatemode
設置成0
,讓外部電源持續給內存供電。 - 關閉
standyby
和autopoweroff
模式,阻止 MacBook 睡眠。
詳細設置:
// 120 分鐘後進入休眠,延長清醒時間 sudo pmset -c sleep 120 // 顯示器休眠時間:30 分鐘 sudo pmset -c displaysleep 30 // 硬盤休眠時間:60 分鐘 sudo pmset -c disksleep 60 // 內存供電,內存鏡像不寫入硬盤 sudo pmset -c hibernatemode 0 // 關閉 standby 模式 sudo pmset -c standby 0 // 關閉 autopoweroff sudo pmset -c autopoweroff 0 // 休眠時持續聯網 sudo pmset -c tcpkeepalive 1
:battery: 電池供電下的 pmset 設置
在通過電池供電的時候,我希望 Mac 能耗電少一些,同時「睡眠」後喚醒速度不太慢。因此我會作出以下設置:
-
hibernatemode
爲3
,將鏡像數據既寫入內存又寫入硬盤,同時對內存只供電一段時間。 -
standby
的電量閾值設置成75%
,當電量低於 75% stanby的計時器就使用standbydelaylow
作爲休眠倒計時。 -
tcpkeepalive
設置成0
, 休眠時電腦將會斷網,以節省電量。但此時無法進行下載工作, FindMy 也無法定位。 -
acwake
設置成 0, 關閉被同一網絡下的同 iCloud 設備喚醒
詳細設置:
// 20 分鐘後進入休眠 sudo pmset -b sleep 20 // 向硬盤寫入鏡像,同時內存供電 sudo pmset -b hibernatemode 3 // 顯示器休眠時間:15 分鐘 sudo pmset -b displaysleep 15 // 硬盤休眠時間:60 分鐘 sudo pmset -b disksleep 30 // 休眠時斷網 sudo pmset -b tcpkeepalive 0 // 高電量下 standby: 4小時 sudo pmset -b standbydelayhigh 14400 // 低電量下 standby: 2小時 sudo pmset -b standbydelaylow 7200 // standby 電量閾值:75% sudo pmset -b highstandbythreshold 75 // 開蓋喚醒 sudo pmset -b lidwake 1 // 關閉被同一 iCloud 下的設備喚醒 sudo pmset -b acwake 0
:book: 參考資料:
- StackExchange: Difference between autopoweroff and standby in pmset
- tutsplus: How to Hibernate a Mac
- WikiPedia: pmset
P.S. 「Hibernate」 英文直譯爲「睡得深的睡眠,如冬眠」,本文取「睡眠」之義,以表達設備的低功耗運作。
> 下載少數派客戶端、關注少數派公衆號,瞭解更妙的數字生活 :leaves: