man pmset して理解した内容を記録しておく。これが正確かは実際の挙動をちゃんと確認してないのでアレだけど、man 読んでないだろみたいなのよりはマシなはず…

Mac のスリープの種類

  • ディスプレイスリープ
  • スリープ
  • セーフスリープ
  • ディープスリープ

「ディスプレイスリープ」は画面の表示だけ消えている状態。ディスプレイのバックライトが消えて他のスリープと似た状態となるのでスリープの一種としたが、CPUはスリープしない。

「スリープ」はメモリへ電力供給したままCPUをスリープさせている状態。

「セーフスリープ」は「スリープ」と似ているが、来たるディープスリープに向けてメモリ内容を書き出した状態。この状態だと急に主電源消失してもディープスリープからの復帰と同じになるので、作業が失われないという意味でセーフ。復帰はメモリからなので早いが、書き出しがあるのでそこが遅い。

「ディープスリープ」はメモリ内容をファイルシステムに書き出して、コンピュータの全ての電源を切る。次回電源オン時は、ブートプロセスでこのファイルの所在を確認してロードする。コンピュータ全体として消費電力がゼロになる。

メモリ内容を書き出すかどうか、そのタイミングはいつかあたりがポイントになる。メモリ内容を書き出したり、読み戻したりするスリープは、メモリが増えるほど時間がかかることになる。(SSD の場合これによって寿命が縮まることを気にする人もいる)

pmset -g で見れる値との関係

pmset でパワーマネジメントまわりの変数を見ることができる。MacBook Pro で実行すると以下のようになった。

$ pmset -g
System-wide power settings:
 SleepDisabled          0
 DestroyFVKeyOnStandby          0
Active Profiles:
Battery Power           1
AC Power                -1*
Currently in use:
 standbydelay         10800
 standby              1
 womp                 1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             1
 gpuswitch            2
 networkoversleep     0
 disksleep            10
 sleep                0 (sleep prevented by iTunes, coreaudiod)
 autopoweroffdelay    14400
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1 

「ディスプレイスリープ」はdisplaysleepの値(単位は分)経過後に起こる。

各スリープは sleep の値(単位は分)経過後に起こる。このとき

  • hibernatemode = 0 なら「スリープ」
  • hibernatemode = 3 なら即座に「セーフスリープ」
  • hibernatemode = 25 なら即座に「ディープスリープ」

となる。

ただし「スリープ」や「セーフスリープ」に入っていても、standby = 1 の場合、standbydelay の値(単位は秒)経過後にメモリメージが書き出され「ディープスリープ」に移行する。また autopoweroff = 1 な場合も autopoweroffdelay の値(単位は秒)経過後にメモリイメージが書き出され「ディープスリープ」に移行する。standby との違いがわかりにくいが、standby はバッテリー駆動時の話で、autopoweroff は AC 接続時の話になっている。ErP Lot6 (待機電力基準) 準拠のため、autopoweroff があとから機能として追加されたという感じになっている。

ハイバネーションイメージを作りたくない場合

スリープ入りが遅くてうざい場合

ラップトップだと必ずセーフスリープする関係で、閉じたり開いたりを繰替えした場合になかなか起きてこなくてイラ立つことがある。この場合は常時セーフスリープに入るのがうざいケースなので、hibernatemode だけ 0 にすれば良さそう。

sudo pmset -a hibernatemode 0 

standbydelay / autopoweroffdelay 経過後のスリープはこの意図だと特段無効にする意味はないと思う。

とにかく絶対書き出したくない場合

ハイバネーションイメージからの復帰がそもそも遅いから嫌という場合とか、SSD が痛むのが気になる場合はとにかく無効にするしかない。消費電力が増えるのと、万が一バッテリー切れになった場合は作業内容が失われるのがデメリット。

To disable hibernation images completely, ensure hibernatemode standby and autopoweroff are all set to 0.

と書いてあるので、その通りにする。

以下のようにすると、全ての状況(バッテリだろうがAC駆動だろうがUPS起動だろうが) イメージ書きだしが無効になる。

sudo pmset -a hibernatemode 0 standby 0 autopoweroff 0

ref.

  1. トップ
  2. tech
  3. OS X のスリープの傾向と対策