问题
最近从英特尔芯片的iMac 5K,换成了苹果芯片的Mac mini。一切都好,就是电脑在睡眠之后,经常会异常唤醒。表现为显示器由黑转亮,同时显示为无信号;键盘背景灯变亮;外置机械硬盘启动,发出噪音。然后几秒后,电脑又睡眠了。这个过程在电脑睡眠不久就会出现,而且会连续多次出现。
这个问题对于Mac mini这种无电池的台式机还算是小问题,最多就是有点儿烦人,费些电。但是如果是使用电池的Macbook,问题就严重多了。论坛上甚至有人反馈说,自己的电脑的电池电量,一小时就耗光了。
处理
确定了问题,就要研究如何处理。网上有很多种说法。甚至苹果自己也专门为这个问题开了技术说明。
你可以先尝试使用苹果的提供的方法,如果还是没能解决你的问题。你再来使用我的方式。不过,我更建议你先使用我的方式进行调查,确定原因了之后,再使用苹果的或我的方式进行处理。
分析问题
网上对于这个问题的分析有多个思路。比如利用各种日志,通过命令行过滤来查询是什么原因唤醒了系统之类的。这些方法能查到原因,但是那些原因,一般都写得很技术,往往需要上网去查是什么意思,而且指向虽然有了,但是好多却不具备可操作性。
这里,我们采取更直接的方式,直接使用pmset
来进行电源设置的查询。
我注意到Ventura下M1芯片的Mac min的节能设置中,并没有Power Nap的选项。我以为是Ventura的原因,毕竟我用M1不久。但是后来我在论坛上看到,有网友指出,苹果在M1芯片的Mac,移除了Power Nap的选项。我猜测,苹果大概是认为M1芯片的Mac足够省电,所以就把这个选项移除了。保持默认开启状态。
这个是我目前正常,没有异常唤醒状态的电源设置
zhaoxin@zhaoxins-Mac-mini-M1 ~ % pmset -g
System-wide power settings:
Currently in use:
disksleep 10
powernap 0
womp 1
networkoversleep 0
sleep 1 (sleep prevented by powerd, mds_stores)
Sleep On Power Button 1
ttyskeepawake 1
tcpkeepalive 0
autorestart 0
standby 0
displaysleep 10
每个选项的具体含义,可以参考下面的链接。
pmset
另外提一下第8行的sleep项,如果你的系统无法睡眠。那可能是有应用阻止了它睡眠。你可以看看这一行括号里的应用。这些应用都是可能阻止系统睡眠的。注意,是可能,而不是一定。所以你可以先尝试将能关闭的应用先关闭了,然后再来重新执行pmset -g
这个命令,看看是不是生效了。然后再次尝试睡眠。
我的Mac mini,因为是从英特尔平台的系统迁移过来的,所以powernap
默认时关闭的,如果是全新安装的系统,这一项应该是开启的。此外tcpkeepalive
默认是开启的。在我的系统中,这一项的开启是导致系统的在睡眠后还被频繁唤醒的主要原因。
我的理解是,当系统睡眠后,如果tcpkeepalive
还开着,那么系统就会因为各种通知唤醒。同时,由于苹果系统中的一些bug,一些可能具备网卡功能设备,比如各种USB设备(因为存在USB网卡这种设备),也能将系统唤醒。比如,我就在日志中发现,系统被我的M.2的外置移动硬盘唤醒过。
sudo pmset -a tcpkeepalive 0
sudo pmset -a powernap 0 // 如果有需要的话
现在再睡眠你的电脑,应该就不会有异常唤醒了。
New macbook Pro M1 chip waking when asleep with log "SMC.OutboxNotEmpty" wake reason