Note-51072-56

Token ID: 3

ERC-721 1 Transfers

Metadata

{
  "title": "pmset 电源管理让 Macbook Pro乖乖小憩",
  "tags": [
    "post"
  ],
  "sources": [
    "xlog"
  ],
  "external_urls": [
    "https://sakura.catcat.blog/pmset-Macbook-Pro"
  ],
  "date_published": "2023-03-30T11:53:43.548Z",
  "content": "<!-- wp:paragraph -->\n<p>自从 M1 芯片的 macbook 买到手,搁着不用总是一周就没电了。昨晚充满观察了一下,一夜合盖休眠竟然消耗了 10% 的电。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p><strong>TL;DR: 执行 <code>sudo pmset -b powernap 0</code> 关掉小憩,一晚上合盖 1% 都没掉。</strong></p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:heading -->\n<h2>消失的小憩</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>在 MacBook 的电池设置(台式机叫「节能」)里一直有两个开关:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>唤醒以供网络访问</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>启用电能小憩</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>这俩的具体含义在<a href=\"https://support.apple.com/zh-cn/guide/mac-help/mchlfc3b7879/13.0/mac/13.0\">官方支持</a>上可以找到,简单来说:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>唤醒以供网络访问:当电脑<strong>被访问</strong>时允许唤醒以提供服务。比如向外共享打印机或文件。同时也会定期唤醒来广播文件更新通知(如果启用了文件共享的话)。<strong>注意,这个选项的意思<em>不是</em>「唤醒来让本机的程序可以联网更新」。</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>小憩:睡眠时允许唤醒来<strong>更新自身的数据</strong>,例如邮件、iCloud 同步以及时间机器。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>那么这两个选项各自的作用应该可以整明白了。在 macOS 12 的系统设置里,只对「小憩」做了解释,还算清晰。可是 macOS 13 增加了对「唤醒以供网络访问」的解释,用词非常迷惑,<strong>并且 m1 芯片的设备不再显示「小憩」的开关</strong>。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"large\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://i.imgtg.com/2023/03/27/jY0TI.png\" alt=\"\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>从上图可以看出,macOS 13 中对「唤醒以供网络访问」的解释非常类似小憩,<strong>给人一种这两个选项合并</strong>的假象。根据这个解释,可以理解为:关掉网络唤醒,就不会在后台更新数据了。<strong>然而事实是,无论关不关「网络唤醒」,「小憩」始终是打开的,休眠时始终进行后台更新,这就是休眠耗电的元凶了。</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>感觉苹果好心机啊,对 arm 芯片功耗太过骄傲,自以为是地默认开启后台更新。为了不让用户找麻烦,还修改了另一个选项的描述让你感觉可以关闭。看到网上有大量 m1 设备待机耗电的抱怨,各种分析最后也没彻底解决。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2>pmset 电源管理</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><code>pmset</code> (Power Management Set) 是一个 macOS 的命令行电源管理工具,系统设置里的相关选项与它想管理,不过 pmset 提供了更详细的配置。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>我怎么认定「网络唤醒」与「小憩」没有合并的呢?在 <code>pmset</code> 中,「网络唤醒」管理的是 <code>womp</code>,「小憩」关联的是 <code>powernap</code>。</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>注意,不同设备所支持的配置参数不同,很多参数比如 <code>standbydelaylow/high</code> 在 m1 设备上无效。大概还是因为苹果的自信,就去掉这些细节的节电策略了。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3>配置查询</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>注意区分:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>睡眠 sleep:保持内存供电</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>休眠 standby:内存数据写入硬盘,内存断电</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>hibernate:待机模式。强调的是进入待机这一操作(比如关闭盖子),具体是睡眠还是休眠要看设置。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>查询当前生效的配置:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>查询用户配置:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>因为一些进程可能会阻止待机,这些会反映在当前生效的配置中,所以不一定与用户配置相同。</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>给出一个对照表:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table><thead><tr><th>属性</th><th>单位</th><th>备注</th><th>系统设置 (macOS 13)</th></tr></thead><tbody><tr><td>standby/autopoweroff*</td><td>0/1</td><td>允许从睡眠切换到休眠</td><td></td></tr><tr><td>powernap</td><td>0/1</td><td>电源小憩</td><td>电池 - 选项 - 启用电能小憩</td></tr><tr><td>networkoversleep</td><td>0/1</td><td>睡眠时如何处理共享网络。不支持修改</td><td></td></tr><tr><td>disksleep</td><td>分钟</td><td>关闭硬盘等待时间,0 为关闭</td><td></td></tr><tr><td>sleep*</td><td>分钟</td><td>睡眠等待时间,0 为不睡眠</td><td></td></tr><tr><td>hibernatemode*</td><td>0/3/25</td><td>待机模式。0: 睡眠,25: 休眠,3: 先睡眠后休眠</td><td></td></tr><tr><td>ttyskeepawake</td><td>0/1</td><td>有活跃的 tty(终端会话)时不休眠</td><td></td></tr><tr><td>displaysleep</td><td>分钟</td><td>关闭显示器等待时间</td><td>锁定屏幕 - 不活跃时关闭显示器</td></tr><tr><td>tcpkeepalive*</td><td>0/1</td><td>允许 tcp 连接</td><td></td></tr><tr><td>lowpowermode</td><td>0/1</td><td>省电模式</td><td>电池 - 低电量模式</td></tr><tr><td>womp</td><td>0/1</td><td>允许网络唤醒</td><td>电池 - 选项 - 唤醒以供网络访问</td></tr><tr><td>gpuswitch</td><td>0/1/2</td><td>0: 集成显卡,1: 独立显卡,2: 自动</td><td></td></tr><tr><td>standbydelayhigh/low*</td><td>秒</td><td>从睡眠切换到休眠的等待时间</td><td></td></tr><tr><td>highstandbythreshold</td><td>0-100</td><td>剩余电量超过这个数 <code>standbydelayhigh</code> 生效,否则 low 生效</td><td></td></tr><tr><td>proximitywake</td><td>0/1</td><td>登录同一帐户的设备靠近时唤醒</td><td></td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>如果执行 <code>pmset -g custom</code> 发现缺少一些属性,就是当前设备不支持。</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>这些属性实际效果不能光看字面意思,很多时候是配合着用的,下面是几个常见的注意事项:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>sleep: 即使 sleep 计时器条件满足也不见得一定会进入待机,比如「屏幕开启」会阻止睡眠。需要所有条件都满足才可以睡眠。m1 macbook 电池模式下默认 <code>sleep=1</code>,也就是说睡眠等待时间实际上由 <code>displaysleep</code> 控制。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>hibernatemode:具体是否会把内存写入硬盘还同时受到 <code>standby</code> 和 <code>autopoweroff</code> 的控制。<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>0:仅睡眠,不会把持久化内存中的数据。若掉电则丢失未保存的数据。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>25:仅休眠。每次待机都持久化内存,并停止内存供电。重启时从硬盘恢复内存。显然唤醒时会慢一点。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>3:混合模式,先睡眠再休眠。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>tcpkeepalive: 通过命令行关闭时有警告,会影响系统核心功能,比如 FindMyMac。实测开启影响不大,只需关闭 <code>powernap</code> 足够了。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>standby/autopoweroff:这俩目前看作用一样,只是出现的背景不同。<code>standby</code> 是在 macbook 上延长续航,<code>autopoweroff</code> 为了让台式机满足欧盟节能要求,所以 macbook 没有这个属性。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3>修改配置</h3>\n<!-- /wp:heading -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>执行 <code>sudo pmset restoredefaults</code> 可恢复默认。</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p><strong>修改配置需要 sudo 权限</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>修改配置命令格式为:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>pmset [-a | -b | -c | -u] [setting value] [...]</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li><code>-a</code>: 对所有模式生效</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>-b</code>: 对电池模式生效</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>-c</code>: 电源适配器下生效</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>-u</code>: UPS 供电下有效</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>若 <code>pmset -g custom</code> 的输出没有某些模式,就是设备不支持。</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>下面给几个常用配置命令:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li><strong>电池下关闭小憩(推荐)</strong>: <code>sudo pmset -b powernap 0</code></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>电池下禁止 TCP 连接(可能导致部分系统功能不可用): <code>sudo pmset -b tcpkeepalive 0</code></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>电池下待机时强制休眠(持久化内存,断电): <code>sudo pmset -b hibernatemode 25</code></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3>唤醒分析</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>查看从开机以来的睡眠 / 唤醒次数:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>输出的结果:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table><thead><tr><th>字段</th><th>注释</th><th></th></tr></thead><tbody><tr><td>Sleep Count</td><td>睡眠次数</td><td></td></tr><tr><td>Dark Wake Count</td><td>后台唤醒次数(不亮屏)</td><td></td></tr><tr><td>User Wake Count</td><td>亮屏唤醒次数(通常是用户手动唤醒)</td><td></td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:paragraph -->\n<p><strong>查看详细后台唤醒记录:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>pmset -g log | grep -e \"Wake from\" -e \"DarkWake\" -e \"due to\"</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>比较难看懂</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li><code>AOP.OutboxNotEmpty spu_queue_overflow_ep42</code>: 1-2 小时一次是正常的</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>查看待机锁:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>有时系统或应用程序会阻止进入待机,这些运行时的临时待机锁称为 <code>assertions</code>,它们会反映在实时电源配置里 (<code>pmset -g</code>),也可以通过上面命令查询。输出如下:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>Assertion status system-wide:\n   BackgroundTask                 0\n   ApplePushServiceTask           0\n   UserIsActive                   1\n   PreventUserIdleDisplaySleep    0\n   PreventSystemSleep             0\n   ExternalMedia                  0\n   PreventUserIdleSystemSleep     1\n   NetworkClientActive            0\nListed by owning process:\n   ........</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>注意后面的数组代表对应锁是否启动,而不是锁的个数。下面会显示具体哪个进程启动了锁,以及是否有超时时间。通常 <code>UserIsActive</code> 和 <code>PreventUserIdleSystemSleep</code> 这两个锁都是启动的:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul><!-- wp:list-item -->\n<li>UserIsActive: 有个系统进程在判断用户是否活跃,超时 120 秒</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>PreventUserIdleSystemSleep: 有个系统进程因为屏幕已点亮而持有这个锁,屏幕休眠后会自动释放的。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->",
  "attributes": [
    {
      "value": "pmset-Macbook-Pro",
      "trait_type": "xlog_slug"
    }
  ]
}