睡觉类型介绍
Mac 的睡觉分成两种,「睡眠」 (sleep) 和 「休眠」 (hibernate)。简单点说,睡眠和休眠就好比人的小憩和睡大觉,小憩醒得快,睡大觉就醒得慢。
当长时间不操作 Mac 或把 MacBook 的盖子合上或点击 Apple Logo 菜单下的 睡眠 选项,系统先进入「睡眠」状态,此时数据仍存储在内存中,系统可以被快速唤醒,快速恢复到睡眠前的状态。
在「睡眠」一段时间后(根据设置睡眠参数设置),Mac 会根据hibernatemode 的模式进入更深一层的 「休眠」 状态,此时 Mac 会将内存中的数据作为一个镜像写入到硬盘中(GB 级别大小),然后放弃内存供电,达到更加省电的目的。此时唤醒系统,数据需要从硬盘重新装载至内存,耗时会变长,速度慢。
总结一下,「睡眠」和「休眠」的主要区别:
唤醒速度快慢
是否向内存供电
是否向硬盘写入内存镜像
借用一个流程图给大家看
Mac 会根据当前供电条件作出模式的选择,在计时器阶段内,当时间条件满足,Mac 就会将镜像写入硬盘并睡眠。
我们可以通过 pmset 查看与调整参数:
pmset -g custom:查看当前所有睡眠计划
pmset -g cap:查看当前供电条件下可以调节的参数
sudo pmset restoredefaults:还原全部设置
常用选项
pmset -a:调整任何条件下的睡眠计划
pmset -c:调整外部供电的睡眠计划
pmset -b:调整电池供电的睡眠计划
pmset -g:查看计划
常用参数说明:
hibernatemode
hibernatemode 负责管理睡眠模式。值得注意的是,睡眠时的内存镜像是否写入硬盘,除了受 hibernatemode 的控制,还和 standby 以及 autopoweroff 的值有关。
hibernatemode 有 3 种休眠模式可选择:0,25,3;
hibernatemode = 0
iMac, Mac Mini等 Mac桌面设备默认参数,持续向内存供电,将数据保留在内存,唤醒速度快,减少硬盘占用,数据有丢失风险,耗电量大;
hibernatemode = 25
将数据写入硬盘,不向内存供电,将内存镜像直接写入硬盘,数据不易丢失,镜像占用硬盘空间,唤醒速度慢,耗电量少;
hibernatemode = 3
MacBook 笔记本设备默认参数,safe sleep, 数据既写入内存又写入硬盘,向内存供电一段自定义时间,唤醒时,根据设备电量自动选择从 内存/硬盘 恢复;
sleep
sleep 控制进入睡眠所需要的空闲时间
standby
standby 是 Mac 在休眠时的计时器,当满足时间条件,Mac就会由「休眠」状态转至「睡眠」状态。
standby模式需要以下条件:
电池供电
没有外接设备
没有网络活动
没有外接显示器
在满足条件的前提下, standbydelayhigh/low 秒后,会进行睡眠。比较人性化的的一点是,standby 提供了两个倒计时,通过一个阈值 (highstandbythreshold) 进行控制。
highstandbythreshold
highstandbythreshold(电池剩余电量百分比)它是standbydelay模式选择阈值,默认 50% 电量。
高于阈值,采用 standbydelayhigh 计算时间,当电池电量高于阀值时,内存保留的秒数。
低于阈值,采用 standbydelaylow 计算时间,当电池电量低于阀值时,内存保留的秒数。
autppoweroff
autopoweroff模式需要满足以下条件:
外部电源供电
没有外接设备
没有网络活动
在满足条件的前提下, autopoweroffdelay秒后,系统会写入内存镜像然后睡眠。与上文提到的 standby 不同,standby 和 autopoweroff 相当于两个并行的模式计时器,autppoweroff 更多是为了连接外部电源充电时设计的。
gpuswitch
gpuswitch 这个参数用于管理显卡的选择,适合有独立显卡/外置显卡的 Mac
gpuswitch=0 只使用集成显卡
gpuswitch=1 只使用独立显卡
gpuswitch=2 自动切换显卡
调节这个参数可以避免在电池供电时使用耗电量高的独立显卡,以节省电量。
其他常用参数
powernap:电能小憩,系统偏好设置里也有这个,1是开启 0是关闭
tcpkeepalive:睡眠时是否保存网络连接,1是开启 0是关闭
displaysleep:屏幕休眠时间
disksleep: 硬盘休眠时间,Mac闲置多长时间后关闭硬盘,这个时间不能长于sleep 时间,时间设置一般 sleep>=disksleep>=displaysleep,否则就可能出问题
proximitywake:被同一网络下的相同 iCloud 设备唤醒。1是开启 0是关闭
ttyskeepawake:远程用户正在活动时防止Mac进入睡眠,1是开启 0是关闭
acwake: 电源改变时唤醒,也就是插上或者拔掉外置电源时唤醒Mac,1是开启 0是关闭
halfdim:显示器睡眠时使显示器亮度改变为当前亮度的一半,1是开启 0是关闭。如果关闭这个功能的话,显示器睡眠会直接关掉显示器。
lessbright:使用电池时使显示器亮度暗一点,1是开启 0是关闭
休眠文件位置:/private/var/vm/sleepimage (隐藏文件)
下列命令可显示、隐藏 隐藏⽂件
更多参数在终端运行 $ man pmset, 查阅 pmset 的说明
个人设置方案
我个人的睡眠计划是:外接供电条件下响应尽可能快,即减少使用休眠;电池供电条件下选用耗电少方案
外部供电时的设置:
hibernatemode 设置成 0,即 持续向内存供电,将数据保留在内存,唤醒速度快,减少硬盘占用,数据有丢失风险,耗电量大;
关闭 standyby 和 autopoweroff 模式,阻止进入休眠。
详细设置:
// 内存供电,内存镜像不写入硬盘
sudo pmset -c hibernatemode 0
// 30 分钟后进入睡眠,延长清醒时间
sudo pmset -c sleep 30
// 显示器睡眠时间:15 分钟
sudo pmset -c displaysleep 15
// 硬盘睡眠时间:20 分钟
sudo pmset -c disksleep 20
// 关闭 standby 模式
sudo pmset -c standby 0
// 关闭 autopoweroff
sudo pmset -c autopoweroff 0
// 睡眠时持续联网
sudo pmset -c tcpkeepalive 1
电池供电时的设置
hibernatemode 设置成 3,即 数据既写入内存又写入硬盘,向内存供电一段自定义时间,唤醒时,根据设备电量自动选择从 内存/硬盘 恢复;
standby 的电量阈值设置成 50%,当电量高于 50% stanby的计时器就使用 standbydelayhigh 作为休眠倒计时,反之则使用 standbydelaylow 作为休眠倒计时。
tcpkeepalive 设置成 0, 休眠时断网,以节省电量。但此时无法进行下载工作。
proximitywake 设置成 0, 关闭被同一网络下的相同 iCloud 设备唤醒
详细设置:
// 向硬盘写入镜像,同时内存供电,如不支持模式3的可以选择模式25
sudo pmset -b hibernatemode 3 //sudo pmset -b hibernatemode 25
// 20 分钟后进入睡眠,延长清醒时间
sudo pmset -b sleep 20
// 显示器睡眠时间:10 分钟
sudo pmset -b displaysleep 10
// 硬盘睡眠时间:15 分钟
sudo pmset -b disksleep 15
// 开启 standby 模式
sudo pmset -b standby 1
// 高电量下 standby: 2小时,(AOAC 机器可以适当调小阀值,如120)
sudo pmset -b standbydelayhigh 7200
// 低电量下 standby: 1小时,(AOAC 机器可以适当调小阀值,如120)
sudo pmset -b standbydelaylow 3600
// 关闭 autopoweroff
sudo pmset -b autopoweroff 0
// 休眠时断网
sudo pmset -b tcpkeepalive 0
// 关闭被同一网络下的相同 iCloud 设备唤醒
sudo pmset -b proximitywake 0
如果仅使用hibernatemode 0 可以减除休眠文件,节省空间,但想恢复休眠时记得把休眠文件夹删除。
(删除休眠文件:sudo rm -rf /private/var/vm/sleepimage,创建休眠文件夹,防止再次自动生成休眠文件,sudo mkdir -p /var/vm/sleepimage)
休眠模式可以在oc中修改为NVRAM:Misc\Boot\HibernateMode = NVRAM
安装下列 kexts(可能需要)并⾃⾏将相关内容添加到 config 列表中
参考资料: