⚠この記事はブログ移転前のアーカイブです

El capitanから?よくわからないけどMacのスリープ中にバッテリーがモリモリ減る現象が出るようになった。夜100%、朝80%とかになってたり。MBA2012モデル使ってたときは夜100%朝100%ってくらいスリープ時にバッテリーは減らなかったので、直したいなあと思ってました。原因はいくつかあるので1つずつ潰してみたいと思います。

Power Napの設定を確認する

システム環境設定 -> 省エネルギー -> バッテリー の項目で

「バッテリー電源使用中にPowerNapをオンにする」にチェックが入っていないか確認してください。

スリープ中勝手に起きて更新やらなにやらを確認する設定です。自分の環境では既にオフ状態でした。

詳細な電源設定を確認する

バッテリー電源で動作させているときに以下のコマンドを実行します

pmset -g

こんな感じの結果が出力されたでしょうか。

System-wide power settings:
Currently in use:
 standbydelay         1800
 standby              1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             0
 gpuswitch            2
 disksleep            0
 sleep                3
 autopoweroffdelay    0
 hibernatemode        3
 autopoweroff         0
 ttyskeepawake        1
 displaysleep         3
 acwake               0
 lidwake              1
  • stanbydelay
    • カバーを閉じてから、スタンバイモードに突入する時間です(秒)デフォルトは10800秒
  • hibernatemode

stanbydelay を1800秒(30分)にしました。10分程度の離席ならまだ良いけど30分以上だったらスタンバイしてて低エネルギー状態になって欲しいので。

変更を反映するには以下のコマンド

sudo pmset -a stanbydelay 1800

pmset -a に続いて項目名と値書けばOK

SDカードを挿しっぱなしにしていないか

SDカードを挿しっぱなし(マウント)状態にするとスタンバイモードになりません。Macを閉じる場合はSDカードを取り出すか、以下の方法でスリープ前にSDカードを自動アンマウントしましょう。

【スクリプトで】Mac でスリープ時にSDカードを自動アンマウントさせる

スリープ時にもネットワーク接続を許可するオプションを確認

このコマンドを打ってみてください。

log show --style syslog | fgrep "Wake reason"

スリープ中に復帰した時間と理由が出てきます。

夜使用していないときのログに注目してみてください。以下のようなログが見つかりましたか?

2017-05-15 00:18:14 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 00:18:14 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 02:18:17 〜中略〜 (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2017-05-15 02:18:27 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 02:18:27 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 04:18:29 〜中略〜 (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2017-05-15 04:18:41 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 04:18:41 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 06:18:44 〜中略〜 (AppleTopCaseHIDEventDriver) [HID] [ATC] AppleDeviceManagementHIDEventService::processWakeReason Wake reason: Host (0x01)
2017-05-15 06:18:54 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)
2017-05-15 06:18:54 〜中略〜 (AppleACPIPlatform) Wake reason: RTC (Alarm)

2時間ごとにスリープから復帰しています。

それでは以下のコマンドも打ってみましょう

ioreg -l | grep IOPlatformFeatureDefaults
| | |   "IOPlatformFeatureDefaults" = {"TCPKeepAliveDuringSleep"=Yes,"DNDWhileDisplaySleeps"=No,"TCPKeepAliveExpirationTimeout"=43200,"NotificationWake"=Yes}

TCPKeepAliveDuringSleep・・・とても怪しい。スリープ中にネットワーク接続を保持する設定ですね。寝るんならしっかり寝てほしい派なのでこれをオフにします。

SIPをオフに

この設定はSIPをオフにしないと変更できませんのでSIPをオフにします。

SIPオフの仕方は以下を参照してください。(Sierraでも同じ操作です)

Mac OS X El CapiptanでSIPを無効化する

再起動したら以下のコマンドを打ってsipがdisableなのか確認します。

csrutil status
System Integrity Protection status: disabled.

TCPKeepAliveDuringSleepをオフに

SIPをオフにしたらまずはボードIDを取得します。私の場合はこうでしたね。

ioreg -l | grep board-id
    |   "board-id" = <"Mac-E43C1C25D4880AD6">

/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/Mac-【ボードID】.plist を編集します

sudo nano /System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext/Contents/Resources/Mac-E43C1C25D4880AD6.plist
<key>TCPKeepAliveDuringSleep</key>
<false/>
<key>TCPKeepAliveExpirationTimeout</key>
<integer>43200</integer>
<key>NotificationWake</key>
<false/>
<key>DNDWhileDisplaySleeps</key>
<true/>

「TCPKeepAliveDuringSleep」、「NotificationWake」、の項目は【false】に。「DNDWhileDisplaySleeps」の項目を【true】にして保存します。インデントは合わせてください。

編集できたら再起動しましょう。

12時間スリープで1%消費まで改善

12時間スリープさせて1%の消費で収まるようになりました。バッテリーにも精神的にも易しい。でめたしでめたし。