macOS Mojaveにおけるスリープ中のバッテリー消費

tl; dr

macOS Mojaveにおいてスリープ中に時々妙にバッテリーが消費されることがあったが、pmsetコマンドでstandbydelayhighパラメータを調整したら改善された(みたいだ)よという話。

経緯

MacBook (Early 2015)のOSをSierraからMojaveにアップグレードしたところ、スリープ復帰後、バッテリー残量が予想外に少なくなっていることが度々ありました。 正確には、スリープ中のバッテリー消費が激しいとき(例えば、約6時間で約25%の消費)とそうでないときがあるという感じです。 Sierraではそんなことなかったです。 SMCリセットをしても改善されず…

そんなこんなで色々と調べたところ、pmset -gで表示されるスリープ関連のパラメータが、SierraとMojaveとで異なる事に気付きました。

pmsetのパラメータ

pmsetは、システム環境設定の省エネルギー設定では設定できない、スリープ関連の詳細なパラメータを設定できるコマンドです。

macOSのスリープは、デフォルトではセーフスリープというモードに設定されています。 セーフスリープ・モードでは、スリープ処理が開始されると、まず、メモリ以外の必要でないコンポーネントへの通電を停止し、所定時間経過後に、メモリの内容をストレージに記憶した上で、メモリへの通電も停止するという動作が実行されます。 ここで、スリープ処理開始後のメモリには通電されている状態を「スリープ状態」といい、メモリへの通電も停止された状態を「ディープスリープ状態」と呼ぶことにします。 原則的には、スリープ状態でのバッテリー消費の方が、ディープスリープ状態でのバッテリー消費よりも大きいはずです。

Sierraでは、上記「所定時間」はpmsetstandbydelayというパラメータに相当し、デフォルトだと10800(単位は秒。即ち3時間。)に設定されています。

しかしながら、Mojaveにはstandbydelayパラメータはなく、その代わりに、standbydelayhighstandbydelaylowという2つのパラメータが見つかりました。 デフォルト値は、それぞれ、86400(24時間)と10800(3時間)です。

man pmsetによれば、要するに、standbydelayhighはバッテリー残量が所定値より大きいときの、standbydelaylowはバッテリー残量が所定値より小さいときの、上記「所定時間」に相当するとのこと。

現象についての考察

どうやら、Sierraとは異なり、Mojaveにおいては、スリープ状態からディープスリープ状態に移行するまでの時間(上記「所定時間」)が、バッテリーの残量によって異なるみたいです。

そして、上記のようなデフォルト値の下では、バッテリーの残量が十分である状況の方が、そうでない状況と比べて、よりバッテリー消費の大きいスリープ状態が長く続くことになります。

即ち、スリープ中のバッテリー消費が激しかったのは、たまたまバッテリー残量が多かったときであり、逆にそうでもなかったのは、たまたまバッテリー残量が少なかったときであったという仮説が成り立ちます。

やったこと

pmsetコマンドにより、standbydelayhighパラメータをstandbydelaylowバラメータと同じ値に設定しました。

詳細には、とっととディープスリープ状態に移行してもらった方がよりバッテリー消費は減るだろうと考え、上記両パラメータを600(10分)に設定しました。

即ち、

sudo pmset -a standbydelayhigh 600 standbydelaylow 600

その後

本稿執筆時点で設定から数日経ちますが、今のところ、スリープ中の激しいバッテリー消費は再発してないです。