M1チップのMacBookを手に入れてから、使わずに置いておくと1週間で電池が切れてしまいます。昨晩充電して観察したところ、一晩蓋を閉じてスリープ状態にしても10%の電池を消耗していました。
TL;DR:
sudo pmset -b powernap 0
を実行してスリープをオフにすると、一晩蓋を閉じても1%も減りませんでした。
消えたスリープ#
MacBookのバッテリー設定(デスクトップでは「省エネルギー」と呼ばれます)には、常に2つのスイッチがあります:
- ネットワークアクセスのためにウェイクアップ
- パワースリープを有効にする
これら2つの具体的な意味は公式サポートで確認できますが、簡単に言うと:
- ネットワークアクセスのためにウェイクアップ:コンピュータがアクセスされるときにサービスを提供するためにウェイクアップを許可します。例えば、プリンターやファイルを外部に共有する場合です。また、ファイル共有が有効になっている場合は、ファイル更新通知をブロードキャストするために定期的にウェイクアップします。注意:このオプションの意味は「本機のプログラムがネットワークに接続して更新できるようにウェイクアップする」ではありません。
- スリープ:スリープ中に自身のデータを更新するためにウェイクアップを許可します。例えば、メール、iCloudの同期、タイムマシンなどです。
これでこの2つのオプションの役割が理解できたと思います。macOS 12のシステム設定では「スリープ」についての説明があり、比較的明確でした。しかし、macOS 13では「ネットワークアクセスのためにウェイクアップ」の説明が追加されており、言葉が非常に混乱を招くもので、さらにM1チップのデバイスでは「スリープ」のスイッチが表示されなくなりました。
上の図からわかるように、macOS 13の「ネットワークアクセスのためにウェイクアップ」の説明はスリープに非常に似ており、この2つのオプションが統合されているかのような錯覚を与えます。この説明に基づくと、ネットワークウェイクアップをオフにすると、バックグラウンドでデータが更新されなくなると理解できます。しかし、実際には「ネットワークウェイクアップ」をオフにしても、「スリープ」は常にオンのままで、スリープ中もバックグラウンドで更新が行われており、これがスリープ時の電力消耗の元凶です。
Appleの心機一転を感じます。ARMチップの消費電力に自信を持ちすぎて、勝手にバックグラウンド更新をデフォルトでオンにしています。ユーザーに面倒をかけないように、別のオプションの説明を変更して、オフにできるように感じさせています。ネット上にはM1デバイスの待機時の電力消耗に関する不満が大量にあり、さまざまな分析が行われましたが、結局解決には至りませんでした。
pmset電源管理#
pmset
(Power Management Set)は、macOSのコマンドライン電源管理ツールで、システム設定の関連オプションを管理しますが、pmsetはより詳細な設定を提供します。
「ネットワークウェイクアップ」と「スリープ」が統合されていないとどうやって判断するのか?
pmset
では、「ネットワークウェイクアップ」はwomp
を管理し、「スリープ」はpowernap
に関連しています。
注意:異なるデバイスがサポートする設定パラメータは異なり、多くのパラメータ(例えばstandbydelaylow/high
)はM1デバイスでは無効です。おそらくAppleの自信から、これらの詳細な省電力戦略が削除されたのでしょう。
設定の確認#
区別に注意:
- スリープ sleep:メモリに電力供給を維持
- 休眠 standby:メモリデータをハードディスクに書き込み、メモリの電源を切る
- hibernate:待機モード。待機状態に入る操作(例えば、蓋を閉じる)を強調し、具体的にスリープか休眠かは設定によります。
現在有効な設定を確認:
ユーザー設定を確認:
いくつかのプロセスが待機を妨げる可能性があるため、これらは現在有効な設定に反映されるため、必ずしもユーザー設定と同じではありません。
対照表を示します:
属性 | 単位 | 備考 | システム設定 (macOS 13) |
---|---|---|---|
standby/autopoweroff* | 0/1 | スリープから休眠に切り替えることを許可 | |
powernap | 0/1 | パワースリープ | バッテリー - オプション - パワースリープを有効にする |
networkoversleep | 0/1 | スリープ時の共有ネットワークの処理方法。変更はサポートされていません | |
disksleep | 分 | ハードディスクのスリープ待機時間、0はオフ | |
sleep* | 分 | スリープ待機時間、0はスリープしない | |
hibernatemode* | 0/3/25 | 待機モード。0: スリープ、25: 休眠、3: 先にスリープしてから休眠 | |
ttyskeepawake | 0/1 | アクティブなtty(ターミナルセッション)があるときはスリープしない | |
displaysleep | 分 | ディスプレイのスリープ待機時間 | 画面をロック - 非アクティブ時にディスプレイをオフ |
tcpkeepalive* | 0/1 | tcp接続を許可 | |
lowpowermode | 0/1 | 省電力モード | バッテリー - 低電力モード |
womp | 0/1 | ネットワークウェイクアップを許可 | バッテリー - オプション - ネットワークアクセスのためにウェイクアップ |
gpuswitch | 0/1/2 | 0: 統合グラフィックス、1: 独立グラフィックス、2: 自動 | |
standbydelayhigh/low* | 秒 | スリープから休眠への切り替え待機時間 | |
highstandbythreshold | 0-100 | 残りの電量がこの数を超えるとstandbydelayhigh が有効になり、それ以外はlowが有効になります | |
proximitywake | 0/1 | 同じアカウントにログインしているデバイスが近くにあるときにウェイクアップ |
pmset -g custom
を実行していくつかの属性が欠けている場合、それは現在のデバイスがサポートしていないことを意味します。
これらの属性の実際の効果は、文字通りの意味だけでは判断できません。多くの場合、組み合わせて使用されるため、以下は一般的な注意事項です:
- sleep: スリープタイマーの条件が満たされても、必ずしも待機状態に入るわけではありません。例えば、「画面がオン」の場合はスリープを妨げます。すべての条件が満たされる必要があります。M1 MacBookのバッテリーモードではデフォルトで
sleep=1
となっており、つまりスリープ待機時間は実際にはdisplaysleep
によって制御されています。 - hibernatemode:具体的にメモリがハードディスクに書き込まれるかどうかは、
standby
とautopoweroff
の制御も受けます。- 0:スリープのみ、永続メモリ内のデータは保持しません。電源が切れると未保存のデータは失われます。
- 25:休眠のみ。毎回待機時にメモリを永続化し、メモリの電源を切ります。再起動時にハードディスクからメモリを復元します。明らかにウェイクアップ時は少し遅くなります。
- 3:ハイブリッドモード、先にスリープしてから休眠します。
- tcpkeepalive: コマンドラインでオフにすると警告が表示され、システムのコア機能に影響を与える可能性があります。実際には、影響はあまり大きくなく、
powernap
をオフにするだけで十分です。 - standby/autopoweroff:これら2つは現在のところ同じ効果を持つように見えますが、背景が異なります。
standby
はMacBookのバッテリー寿命を延ばすためのもので、autopoweroff
はデスクトップがEUの省エネルギー要件を満たすためのもので、したがってMacBookにはこの属性はありません。
設定の変更#
sudo pmset restoredefaults
を実行すると、デフォルトに戻すことができます。
設定の変更にはsudo権限が必要です。
設定変更のコマンド形式は:
pmset [-a | -b | -c | -u] [setting value] [...]
-a
: すべてのモードに適用-b
: バッテリーモードに適用-c
: 電源アダプタ下で適用-u
: UPS電源下で有効
pmset -g custom
の出力に特定のモードがない場合、それはデバイスがサポートしていないことを意味します。
以下は一般的な設定コマンドの例です:
- バッテリーでスリープをオフにする(推奨):
sudo pmset -b powernap 0
- バッテリーでTCP接続を禁止する(システム機能の一部が使用できなくなる可能性があります):
sudo pmset -b tcpkeepalive 0
- バッテリーで待機時に強制的に休眠する(メモリを永続化し、電源を切る):
sudo pmset -b hibernatemode 25
ウェイクアップ分析#
起動以来のスリープ/ウェイクアップ回数を確認:
出力結果:
フィールド | 注釈 | |
---|---|---|
Sleep Count | スリープ回数 | |
Dark Wake Count | バックグラウンドウェイクアップ回数(画面が点灯しない) | |
User Wake Count | 画面が点灯するウェイクアップ回数(通常はユーザーによる手動ウェイクアップ) |
詳細なバックグラウンドウェイクアップ記録を確認:
pmset -g log | grep -e "Wake from" -e "DarkWake" -e "due to"
理解するのが難しいです。
AOP.OutboxNotEmpty spu_queue_overflow_ep42
: 1-2時間ごとに発生するのは正常です。
待機ロックを確認:
時々、システムやアプリケーションが待機状態に入るのを妨げることがあります。これらの実行時の一時的な待機ロックはassertions
と呼ばれ、リアルタイムの電源設定(pmset -g
)に反映され、上記のコマンドでも確認できます。出力は以下の通りです:
Assertion status system-wide:
BackgroundTask 0
ApplePushServiceTask 0
UserIsActive 1
PreventUserIdleDisplaySleep 0
PreventSystemSleep 0
ExternalMedia 0
PreventUserIdleSystemSleep 1
NetworkClientActive 0
Listed by owning process:
........
後ろの配列は対応するロックが起動しているかどうかを示しており、ロックの数ではありません。以下には具体的にどのプロセスがロックを起動したか、またはタイムアウトがあるかどうかが表示されます。通常、UserIsActive
とPreventUserIdleSystemSleep
の2つのロックは常に起動しています:
- UserIsActive: システムプロセスがユーザーがアクティブかどうかを判断しており、タイムアウトは120秒です。
- PreventUserIdleSystemSleep: システムプロセスが画面が点灯しているためにこのロックを保持しており、画面がスリープすると自動的に解放されます。