上上周刚买的新Macbook pro M5,上周有一天我合上 Mac扔进包里,100% 电量。第二天拿出来------87%,没有休眠吗?这样下去电池一年估计就得打8折吧?
简单搜了下,这显然不是个例。翻了下 V2EX 和苹果 fans 博客,一堆人遇到同样的事。有人甚至合盖一晚直接关机,第二天开不了。
今天我花了点时间翻研究这个问题(主要还是claude,哈哈),总算把这事儿彻底搞明白了。结论先说:你的 Mac 合盖之后根本没有真正休眠,WiFi 和一堆后台进程每隔十几分钟就把它叫醒一次。 但是这种唤醒对大部人来说都毫无意义。
先别急着改设置,看看你的 Mac 到底在干嘛
打开终端(Terminal),一条命令就能看你 Mac 的电源管理配置:
bash
pmset -g
我的输出长这样:
perl
System-wide power settings:
Currently in use:
standby 1
powernap 1
networkoversleep 0
hibernatemode 3
tcpkeepalive 1
womp 1
sleep 1 (sleep prevented by powerd, coreaudiod)
几个关键字段翻译一下:
powernap 1--- Power Nap 开着。意思是合盖之后系统还会定期醒来同步邮件、更新 iCloud、刷新 Spotlight 索引。tcpkeepalive 1--- TCP 连接保活开着。合盖之后 WiFi 不断,Find My Mac 持续在线。womp 1--- Wake on LAN 开着。局域网里的设备可以把你的 Mac 唤醒。hibernatemode 3--- 混合休眠。内存一直通电,数据同时备份到硬盘。内存通电 = 持续耗电。
等等。这么多东西在后台跑,那合盖掉电不是理所当然吗?
但更夸张的是唤醒日志。跑一下这条:
bash
pmset -g log | grep -i "darkwake\|Wake reason\|wake from"
DarkWake(暗唤醒)就是"系统偷偷醒了但不亮屏"。我截取了其中一段:
vbnet
10:11:26 DarkWake from Deep Idle : due to NUB.SPMI0Sw3IRQ rtc/Maintenance
10:22:14 DarkWake from Deep Idle : due to smc.sysState.Wake wifibt
10:28:10 DarkWake from Deep Idle : due to NUB.SPMI0Sw3IRQ rtc/Maintenance
17 分钟内醒了 3 次。一次是 RTC 定时维护(Spotlight 索引之类),一次是 wifibt------WiFi 和蓝牙模块直接把系统拉起来了。
再看看唤醒总次数:
bash
pmset -g log | grep "Total Sleep/Wakes"
yaml
Total Sleep/Wakes since boot at 2026-04-15 12:21:17 : 69
从昨天中午开机到现在,不到 24 小时,系统被唤醒了 69 次。平均每 20 分钟醒一次。
你的 Mac 根本没在睡觉。
真凶找到了
拿到日志之后我去翻了 Apple 的开发者文档和 pmset 的 man page,整个链条是这样的:
第一个大户:Power Nap
苹果设计 Power Nap 的初衷是让你掀盖就能看到最新邮件。实现方式是合盖之后每隔一段时间唤醒系统,拉取邮件、同步 iCloud、更新 Spotlight、检查软件更新。每次唤醒都要开 WiFi、跑 CPU、读写磁盘。
在日志里对应的就是 rtc/Maintenance 类型的 DarkWake。
第二个大户:WiFi 保活
tcpkeepalive 1 意味着合盖之后系统维持 WiFi 连接。Find My Mac 需要这个------你丢了电脑还能定位。但代价是 WiFi 模块一直通电,而且 mDNSResponder(苹果的网络发现服务)会定期广播。
在日志里对应的是 wifibt 和 mDNSResponder:maintenance 类型的唤醒。
看一下内核层面的断言:
bash
pmset -g assertions
ini
Kernel Assertions: 0x100=MAGICWAKE
id=590 level=255 0x100=MAGICWAKE
description=en0
owner=IOSkywalkNetworkBSDClient
en0 就是 WiFi 网卡。它持有一个 MAGICWAKE 断言------字面意思,"魔法唤醒"。只要这个断言存在,WiFi 模块就有权随时把系统从深度睡眠中拉起来。
第三个大户:定时唤醒事件
bash
pmset -g sched
csharp
Repeating power events:
wakepoweron at 2:55AM every day
Scheduled power events:
[0] wake at 04/16 11:59 by calaccessd.travelEngine
[1] wake at 04/16 12:30 by donotdisturb.server
[2] wake at 04/16 21:22 by com.apple.acmd.alarm
日历同步、勿扰模式定时器、系统维护任务......全在排队等着唤醒你的 Mac。
三步解决,从简单到彻底
第一步:关掉 Power Nap(30 秒,立竿见影)
打开「系统设置」→「电池」→ 点右下角的「选项...」→ 把「启用 Power Nap」关掉。
电池和电源适配器两个状态都关。
不想翻 GUI 的话,终端一条命令:
bash
sudo pmset -a powernap 0
-a 表示 all(电池 + 插电都关)。这一步就能干掉大部分 rtc/Maintenance 类型的暗唤醒。
第二步:关掉 WiFi 保活和网络唤醒
bash
# 关闭 TCP 保活(WiFi 不再在合盖后维持连接)
sudo pmset -b tcpkeepalive 0
# 关闭 Wake on LAN(局域网设备不能唤醒你的 Mac)
sudo pmset -a womp 0
-b 表示 battery only(只在电池模式下关闭)。插电的时候保持开着没问题,反正不心疼电。
注意:关掉 tcpkeepalive 之后,合盖状态下 Find My Mac 定位功能会失效。如果你特别依赖这个(比如经常在咖啡厅用电脑),可以只关 womp 不关 tcpkeepalive。
第三步:电池模式切深度休眠(进阶,效果最好)
macOS 有三种休眠模式:
| 模式 | 内存供电 | 数据写入硬盘 | 唤醒速度 | 省电效果 |
|---|---|---|---|---|
| 0 | 是 | 否 | 最快 | 最差 |
| 3(默认) | 是 | 是 | 快(< 1秒) | 一般 |
| 25 | 否 | 是 | 慢(3-8秒) | 最好 |
模式 3 是笔记本默认的:内存一直通电所以唤醒秒开,同时把数据备份到硬盘防止断电丢失。但"内存一直通电"就是合盖掉电的物理根因。
模式 25 切断内存供电,数据全写硬盘。合盖之后基本零功耗。代价是唤醒要等几秒。

bash
# 电池模式用深度休眠
sudo pmset -b hibernatemode 25
# 插电模式保持默认
sudo pmset -c hibernatemode 3
如果你嫌每次唤醒等 3-8 秒太久,可以设一个缓冲时间------合盖前 1 小时保持浅休眠(方便随时掀盖),超过 1 小时自动切深度休眠:
bash
# 高电量时(>50%),1 小时后转深度休眠
sudo pmset -b standbydelayhigh 3600
# 低电量时(<50%),15 分钟后就转
sudo pmset -b standbydelaylow 900
这个设置特别适合"下班塞包里明天早上再用"的场景。
改完怎么验证
改完之后别急着合盖等一晚。先快速验证配置是否生效:
bash
pmset -g
确认输出里:
scss
powernap 0
tcpkeepalive 0
womp 0
hibernatemode 25 (如果是电池模式)
然后合盖等 10 分钟,打开,再看日志:
bash
pmset -g log | grep "DarkWake" | tail -5
如果 10 分钟内没有 DarkWake 记录,说明配置生效了。
再来一个狠的:合盖过夜,第二天早上先记下电量,然后跑:
bash
pmset -g log | grep "Total Sleep/Wakes"
对比一下改之前和改之后的唤醒次数。我改完之后从 69 次/天 降到了个位数。
进阶:合盖自动关 WiFi
如果你想更彻底------合上盖子的瞬间直接断 WiFi,连 tcpkeepalive 的问题都不存在了。
macOS 本身没有"合盖关 WiFi"的选项。但你可以用 sleepwatcher + 脚本实现:
bash
# 安装 sleepwatcher(用 Homebrew)
brew install sleepwatcher
# 创建合盖时执行的脚本
echo '#!/bin/bash
networksetup -setairportpower Wi-Fi off' > ~/.sleep
chmod +x ~/.sleep
# 创建开盖时执行的脚本
echo '#!/bin/bash
networksetup -setairportpower Wi-Fi on' > ~/.wakeup
chmod +x ~/.wakeup
# 启动 sleepwatcher 服务
brew services start sleepwatcher
这样合盖就断网、开盖就连网,全自动。
如果不想装第三方工具,也可以手动养成习惯------合盖之前 Cmd + 空格 打开 Spotlight 搜"Wi-Fi",点一下关掉。虽然笨了点,但有效。
M 系列和 Intel 的区别
如果你用的是 M1/M2/M3/M4/M5 这些 Apple Silicon 芯片的 Mac,需要知道一件事:M 系列的睡眠机制跟 Intel 时代不一样。
Intel Mac 用的是经典的 S3 状态(Suspend to RAM),CPU 完全关闭,只有内存通电。功耗低,但唤醒需要重新初始化 CPU。
M 系列用的是 S0 Low Power 模式。芯片不完全关闭,而是进入超低功耗状态。好处是唤醒快到你感觉不到延迟。坏处是------因为芯片没有完全关闭,后台唤醒事件更容易把它拉起来。
所以 M 系列 Mac 对 Power Nap 和 WiFi 保活更敏感。同样的配置,Intel Mac 可能一晚掉 5%,M 系列可能掉 15%。不是因为 M 系列更耗电,而是它"太容易被叫醒了"。
关掉 Power Nap 和 WiFi 保活之后,M 系列的超低功耗优势才能真正发挥出来。我改完配置之后合盖过夜,电量从"掉 20-30%"变成了"掉 1-2%"。

还是掉电?排查清单
如果上面的步骤都做了还掉电,按这个清单逐条排查:
1. 检查是不是有进程在阻止睡眠
bash
pmset -g assertions
看 PreventUserIdleSystemSleep 那一行。如果是 1,说明有进程在阻止系统休眠。下面会列出是哪个进程。常见的捣蛋鬼:Spotlight 索引(mds_stores)、Time Machine 备份、某些音频软件。
2. 检查外接设备
拔掉所有 USB-C 设备(扩展坞、显示器、硬盘)再合盖试试。某些廉价的 USB-C 集线器会持续发送唤醒信号。
3. 检查蓝牙设备
蓝牙鼠标和键盘也可能唤醒 Mac。在「系统设置」→「蓝牙」→「高级」里关掉「允许蓝牙设备唤醒这台电脑」。
4. 重置 SMC / NVRAM
如果以上都没用,试试重置 SMC(Intel Mac)或者重启按住 Option + Cmd + P + R 重置 NVRAM。M 系列 Mac 关机等 30 秒再开机就行。
5. 检查电池健康度
bash
system_profiler SPPowerDataType | grep -A 3 "Health"
如果 Maximum Capacity 低于 80% 且 Cycle Count 超过 500,可能是电池本身老化了,该去 Apple Store 看看。
我的最终配置
折腾完之后,我现在的电池模式配置是这样的:
bash
sudo pmset -b \
powernap 0 \
tcpkeepalive 0 \
hibernatemode 25 \
standbydelayhigh 3600 \
standbydelaylow 900 \
womp 0
插电模式保持默认不动,该快就快。
合盖过夜实测:从 80% 到第二天早上 79%。掉了 1%。
说句题外话。苹果把 Power Nap 默认打开、把 TCP 保活默认打开,本意是让用户体验更"无缝"------掀盖就是最新邮件、丢了电脑还能定位。但代价是合盖之后系统根本停不下来。
这种"我替你做决定"的设计哲学在 iPhone 上问题不大(反正每天充电),但在笔记本上就会让人抓狂。周五扔包里周一没电这种事,换谁都火大。
好在改起来不复杂。上面那几条命令,5 分钟搞定,从此告别假睡眠。

如果你的 Mac 也有合盖掉电的问题,试完记得回来说一下效果。