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 系統睡眠流程

macOS 睡眠流程圖

如圖所示,當我們不使用 Mac 時,一段時候後,系統先進入 sleep 狀態,然後根據 hibernatemode 的模式,決定將鏡像數據寫入內存還是硬盤。

standbyautopoweroff 相當於兩個並行的模式計時器,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 ,讓外部電源持續給內存供電。
  • 關閉 standybyautopoweroff 模式,阻止 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 能耗電少一些,同時「睡眠」後喚醒速度不太慢。因此我會作出以下設置:

  • hibernatemode3 ,將鏡像數據既寫入內存又寫入硬盤,同時對內存只供電一段時間。
  • 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: 參考資料:

P.S. 「Hibernate」 英文直譯爲「睡得深的睡眠,如冬眠」,本文取「睡眠」之義,以表達設備的低功耗運作。

> 下載少數派客戶端、關注少數派公衆號,瞭解更妙的數字生活 :leaves:

相關文章