MacBook Proが不眠症!なぜかスリープしない原因とは
引用元:https://news.ycombinator.com/item?id=44745897
アクティビティモニタのエネルギー>“Preventing sleep”って項目でアプリをソートすると、Macのスリープを妨げてる奴がわかるぞ。俺の場合はDevonthinkが原因だった。Appleの電力管理がこんな状況をアラートで教えてくれないのがマジ驚きだよ。カバンの中でMacが熱くなってバッテリーが減るなんて、絶対阻止すべきでしょ。
蓋を閉じてもアプリがスリープを妨げられるなんて、マジで信じられない!メディアプレイヤーがタイムアウトでスリープを防ぐのは理解できるけど、蓋閉じやスリープボタンを無視するなんて、大半の場合はMacがカバンの中で熱暴走するだけじゃん。適当なウェブページがスリープを妨げるなんてクレイジーだよ。パーミッションを分けて、ユーザーが「蓋閉じたらスリープ」みたいなコアな挙動をコントロールできるようにすべきだね。
どんな適当なアプリでもシステム全体のスリープを妨げられるなんて知らなかったよ。これってユーザーが制御できる許可の裏に隠すべきじゃない?開発者はこのAPIを呼ぶのに、せめて特別な権限を使うべきだと思うんだけど。
実は俺、Amphetamineってオープンソースアプリを常用してるんだ。Macをスリープさせずに蓋を閉めておけるから、長時間かかる遺伝子プロセスをMacBookで実行したり、Vision Proに2160p HDRの映画をストリーミングしたりするのに超便利なんだよね。移動中でもMacを開かずに使えるし。あと、最新Macは蓋を閉めるとマイクがハードウェアレベルで無効になるって豆知識もあるよ!
どんなウェブサイトやアプリでもスリープを防げるんだよ。ZoomとかGoogle Meet、YouTube、Spotifyなんかも実際にそうしてるね。全部隠す必要はないけど、ユーザーが設定で上書きできるようにすべきだよ。LinuxのKDEみたいに、macOSでもスリープを妨げてるものがあるってインジケータを追加するのは難しくないと思うんだけどな。
見えるかどうかが問題じゃないんだよ。OPも言ってるけど、Activity Monitorを見ればどのアプリがこれをやってるか簡単にわかるんだから。問題は、ユーザーがそれをコントロールしたり、特定のアプリを止めたりする方法がないってことなんだ。
多くの人がMacを外部モニターとキーボードに繋いで、蓋を閉じて作業してるのを見かけるよ。参考までにね。
ドックに繋がったMacを、蓋を閉じた状態で使うのは俺にとってもよくある使い方だよ。
蓋を閉めた時にプロセスを止めるか、それともバッテリーが切れるまでカバンの中で熱暴走させるか、って選択なら、絶対に前者を選ばせてくれよ!昔の車が室内灯つけっぱなしでバッテリー上がっちゃうみたいに、なんでそんな設計になってるのか理解できないね。
ダミーHDMIプラグで解決するってこと?
ディスプレイを少し開けたらどう?高価なノートPCのディスプレイが動作中に筐体と接触するのは嫌だね。
深く埋もれすぎだね。バッテリーをクリックして「スリープを妨げているアプリがある>」って表示されて、そこにカーソルを合わせるとリストが見える方が、アクティビティモニタを掘り下げるよりずっといいよ。スリープを妨げるアプリのセクションが他にあってもいいかもね、電力消費アプリみたいにさ。
「オープンソースアプリのAmphetamineは、その有効化に関するオプションを公開しているだけだ」ってあるけど、これってどういう意味?
アプリがスリープを妨げようとしたら、OSが「許可/拒否」のダイアログを出すようにすればいいんじゃない?アプリが実際にそれを実行する前にね。
「この権限はユーザーが制御できる許可の裏にあるべきじゃない?」って意見だけど、あんたたち本当にコンピューティングを可能な限り迷惑にしたがるよね?
Amphetamineは、デバイスを起動状態、スリープなし、ロックなしなどに保つアプリだよ。俺はいつもAmphetamineを使ってる。特にagentic codingの時にね。ライブデータ処理やプレゼンテーションとか、他の理由でも何年も不可欠なアプリなんだ。
「Claudeのコードが、MacBookでネットワーク接続が必要な長時間の遺伝子プロセスを実行するせいで、蓋を閉じてもスリープしない主な原因になってる」ってあるけど、これどういう意味かわからないな。もっと詳しく教えてくれる?
iOSにもこんな洞察(と制御)があったらいいのにね。たくさんのアプリがテレメトリーやデータ収集、通知で、ビジネス(良くないね)のためにバッテリーと帯域幅を食い潰してるからさ。
ユーザーにはたくさんの邪魔が入るから、必要な時だけ見えるインジケーターと個別設定がいいね。アプリが一時的にスリープを防ぐのは、ウェブメディアプレーヤーみたいに再生や一時停止のイベントで有効・無効になる感じで使えるからさ。
「見えないけど必要なときそこにある」って、犬の電気柵みたいだね。白木のフェンスじゃなくて、犬に予期せぬショックを与えて、何が許されて何がダメか何度も試させて発見させるってこと?まさに現代のいわゆるデザインで嫌なところをうまく表現してくれたよ。
ダミーじゃ無理かもよ。完全なフェイクディスプレイアダプターが必要だね。HDMIの先端を切っても、今のモニターがやってる双方向の通信はできないと思うな。
KDEならユーザーが設定を上書きできるよ。
Time Machineみたいなシステムサービスがスリープを妨げないのが不思議。バックアップするために起動する設定なのに、半分くらいの確率でMacBook Proを起こしたら、Time Machineがスリープしちゃったせいで終わらなかったって通知が来るんだよね。Time MachineのドライブはUSB-C接続のSSDなんだけど、最初のバックアップは5分くらいで終わったし、増分バックアップにシステムがスリープするほど時間かかるってのが理解できないな。今これをタイプしてて思ったんだけど、もしかしたら別の問題が起きてるのかも。ドライブをディスプレイに繋いでて、ディスプレイがラップトップに電源供給してUSBハブになってるんだけど、モニターがスリープするとドライブの電源も切れるのかもね。でもそれだったら、不正な取り出しの通知が出るはずなんだけどな。
caffeinate -i
ってコマンドがあるよ。
アプリとかいらないから。
俺は両方欲しいな。Chromeのやつの方が実装は簡単だろうし、パーミッションを尋ねるか尋ねないかのどちらかだろ。蓋を閉めた後も接続を閉じたり、ファイルをディスクに保存したりする正当な理由があるんだから、どれくらい長く続けたら長すぎるのか判断するのは難しいのかもね。
蓋を閉じたままで問題ないんじゃない?
MacBook Proをそんな使い方するのって、サポートされてないって本気で思ってるの?
投稿者が言ってるのは「agentic」って意味だよ。
MacBookを閉じてる間もClaude AIが動き続けるってことね。
バッテリー使用状況のバックグラウンドアクティビティ時間で確認できるんじゃないの?
「Chromeがデバイスを見つけるのを許可するか、毎回聞かれるのが重要じゃない」って言ってるけど、お前には関係なくても誰かにとっては重要なんだよ。
昔のMacBook Proで同じ経験があるよ。ルーターのDHCPリース時間をデフォルトから15分に短くしてたのが原因だった。MBPが15分ごとにIPアドレスを更新するために起きて、すぐまたスリープする前に起き直してたみたい。デフォルトに戻したらバッテリー消費が完全に直ったよ。MBP購入時に設定変更したから気づいたけど、まさかこれが原因だとは思わなかったな。
もっとコメントを表示(1)
これはmacOSのバグだね。スリープ中にIPアドレスは必要ないはずなのに、DHCPリースを更新するために起きるのはおかしいよ。クローズドソースOSは本当に厄介だね。
「macOSのバグで、スリープ中にIPアドレス更新で起きるのはおかしい」って言うけど、実はそうじゃないんだ。ユーザーはデバイスが起きたときに同じIPアドレスを期待するもんね。正しいのは長いDHCPリースだけど、安物ルーターじゃ設定できないことが多いんだよ。
「DHCPリース時間をデフォルトから15分とかの短い値に変えた」って言ってたけど、それ、何がしたかったの?
面白いね。別のユーザーとしては逆の意見だな。「スリープ中」のコンピューターは何もしてほしくないし、勝手に起きるべきじゃないと思うよ。
僕は短いDHCPリース時間が好きだよ。DHCPサーバーがネットワーク上の状態を把握できるし、大量にIPを要求されても15~30分で収まるからね。長い時間にすると、翌日に不具合に気づくし、短い時間にすればDHCPサーバーの設定ミスもすぐわかるからね。
ハハ。お前の答えは逆に質問が増えるだけじゃん。一体何がそんなにたくさんのDHCPリースを要求してるんだよ?
え、マジ変だね。DHCPリース更新のためのスリープ解除に、どんだけmAh食うの?mAmSとか?スマホは深いスリープでもずっとセルラーと通信してるし、ラップトップがWi-Fiスタックを動かして数パケットやり取りするだけだろ?Apple Siliconじゃないから何してるか分かんないって話だけどさ!もしかして起きてる間に他のことしてたのかな?
リースを全部使っちゃうようなこと、うっかりやったことない?俺は何度か経験あるよ。あとは、今アクティブなホストリストが分かるし、DHCPサーバーの異常を早く察知できるのは助かるね。静的リースに移すと、ちゃんとIPが再設定されるのも便利だよ。キャッシュや長いリース時間は平均性能にはいいけど、問題を隠蔽しちゃうこともあるから、良い落としどころを見つけるのがコツだ。
俺たちが期待する状態は4つだよね。
ー off: 電源なし、活動なし
ー hibernate: 電源なし、活動なし、セッション状態は不揮発性ストレージに保存
ー sleep: 最小限の電力、RAMは電源オンでセッション状態保持、すぐに再開可能
ー on
でも現状は実質的に“sleep++”みたいな感じで、元々の普通のスリープには戻せないんだよね。
リースが切れたらルーターがすぐにそのIPを他のマシンに割り当てようとするのか知りたかったんだ。使われなくなったリースのマッピングをキャッシュしてて、元のマシンが戻ってきた時のために古いIPを割り当てないようにしてる感じがした。ただその挙動をより理解したかっただけなんだ。
MacはDHCPリースを更新するのに完全にスリープ解除する必要はないよ。BluetoothとWi-Fiの無線は、こういう低レベルの操作のために独立して動けるんだ。一方で、俺はコンピューターが寝てる間に起きてバックアップ取ったり、システムやアプリの更新をチェックしたり、メールを処理したりするのは機能であってバグじゃないって思ってるけどね。
うわ、うちのルーター(MikroTik)のリース期間、デフォルトで10分なんだって、今知ったよ。
特定のIPアドレスを特定のデバイスに固定したいの?それともランダムに割り振られる方がいい?
リース更新にかかる時間より長く起動してるかもね。多分、起動するたびに60秒くらいオンになってて、メールチェックとか他のこともやってるんじゃない?
>ユーザーとしては、デバイスがスリープから復帰してもリース継続で同じIPアドレスを期待する。ほとんどのユーザーはIPアドレスが何かすら知らないし、自分のIPが何か気にしないよ。Appleは君のために最適化してないし、すべきじゃないと思うね。
マシンをオフにするとアプリの状態は全部消えちゃうし、アプリもOSも再起動が必要になる。だから俺がマシンをスタンバイにする時は、ちゃんとスタンバイ状態になって、俺が明示的に起こすまでそこにいてほしいんだ。OS開発者とかアプリ開発者とか他の第三者が「やるべき」って思うようなバックグラウンドタスクを勝手にやり続けないでほしい。
900秒から86400秒の間で調整できる範囲は広いね。どんなことでも極端にするのは良くない。自分でいじってその結果が分かったってことだね。
それはApple Siliconより前の話で、ソフトウェアとスリープ解除の統合前だよ。DHCPリースを更新し続けるのは、特に古いネットワークやルーターだと、再接続までの時間を短縮するのに役立つね。Touch IDで一瞬で戻れるし、一部のユーザーには初期接続の遅延やバグのあるアプリのエラーが出てたのかも。Find My(有効にしてると接続を維持したい)も理由の一つ。定期的に接続しないとダメで、例えばリモートでデバイスをロックしたりワイプしたい場合もあるし。
最新のデバイスはWi-FiやEthernet接続時に、指定しない限りMACアドレスをランダム化するよ。一般的な/24のサブネットだと、数十台以上のデバイスが出入りすると、古いリース予約が期限切れになるまでリース表がいっぱいになることがあるんだ。
どちらでもないけど、うちのルーターはMACアドレスでIPを割り当てられるからデバイスに予約されてるのと同じ。DHCPリースが切れたらデバイスがリストから消えるか見てみたかったんだ。消えた時、予約してないのに同じIPで再表示されたと思った。なんで?Web UIが全部表示してないのかもね。ルーターがDHCPリース時間を超えて以前のデバイスの記録を持ってるのかも。
>それはApple Siliconより前の話で…
俺の2014年製Intel MacBook ProもPower Napがあって、M1と同じように無線通信してた。別に新しい話じゃない。
無線が動いてても、OSがTCP接続を維持したり更新してるわけじゃない。普通のことだよ。Find Myは24時間接続してない。システムがスリープ解除した時にコマンドを取得するんだ。電源なしで蓋を閉じたラップトップで「15分前」や「2時間前」と表示されるのは普通だよ。
スマホのモデムはメインプロセッサと独立してて最適化されてる。MacのBluetoothやWi-Fiも半独立で、ディープスリープ中でも接続を維持できるよ。大きなプロセッサの起動や停止はかなり複雑で、オーバーヘッドが大きいんだ。Intelの改善点は周波数調整のオーバーヘッド削減だったけど、消費者向けシステムでは目立たなかったね。>たぶん起きてる間に他のことしてた?
それはPower Napって言って、デフォルトでは電源接続時のみ有効だよ。
>自分でいじってその結果が分かったってことだね。
実際、600~1200秒の範囲の値では特に問題はなかったよ。(俺のMacはバッテリーだとネットワーク維持のためにスリープ解除しないけどね。)
「自発的にスリープ解除する」の定義が曖昧だよね。マウスやキーボードで起きるのはUSBやBluetoothイベントだけど、ユーザーがトリガーしてるから自発的とは言えない。SSH接続で起きるのも、俺が接続したから自発的じゃない。毎日深夜0時にNASへバックアップするように設定してるから、タイマーで起動するのは予想通りで、これも自発的とは言えないよね。
ちょっと分かりにくいね。Macはスリープ中でも特定のメッセージをポーリングできるんだよ(Power Nap)。
DHCPクライアントはリース期間の半分でIPアドレスの更新を要求するから、君が思ってたより状況は悪かったんじゃない?
WiFiとBluetoothが動く半スリープ状態って何の機能に必要なの?ラップトップは昔からこれなしで動いてたし、俺も必要性を感じたことないな。むしろこれのせいで何度も問題が起きたよ。
著者は”Wake for maintenance”オプションが”無効”って書いたけど、これって”有効”の間違いじゃないの?
俺も同じこと思ったよ。この設定が有効じゃないと、ウェイクイベントが時間ごとにまとめられずに一晩中ランダムに起こる可能性がある。そう考えれば著者の説明とぴったり合うね。
これはラベルがひどいね。”必要なメンテナンス作業を毎時間のウェイクセッションにまとめる”みたいにすれば、有効にするとウェイクが減るってことがもっと明確になるのに。
もっとコメントを表示(2)
俺も理解するのに何回か読み直したよ。基本的には、イベントが連続的にじゃなくて、まとめて処理されるってことだよね。
バッチ処理なんてどこにも書いてないじゃん。君はこれを肯定する理由があるの?それとも著者の書いたこと(タイポ以外で)を説明するためのただの仮説なの?
”設定が無効だと、Macは定期的なウェイクアップとイベントのバッチ処理の代わりに、ある種のウェイクアップの狂乱状態になった”って記事に書いてあったよ。
俺も混乱してるよ。わざわざPCをスリープ解除する設定を有効にしたら、スリープ解除が減るってこと?
俺も混乱してるよ。筆者のスクリーンショットだとEnabledになってるから、それが“解決済み”の状態なんだろうけど、無効にするとかえってスリープ解除が増える理由が直感的じゃないな。
直感に反する説明は、もっと詳しく説明するか、少なくともそうだと明記すべきだね。記事を書いた後に編集するのは、こういう問題を見つけるのが難しいんだよ。
俺もそう思ってたんだけど、Sleep Aidってアプリを入れたら、“Wake for Maintenance”を無効にすると、Sleep Aidが厳しく警告してきたんだ。>“Wake for Maintenance”を無効にすると、このMacが数秒おきにスリープ解除する可能性があるよ。これを防ぐには“Disable Wi-Fi”を選んでね。だから、この設定を有効にすると、MacBookが数秒おきにスリープ解除するのを防げるみたい…おそらくWi-Fiが原因かな?Sleep Aidも有効にするのを勧めてるみたいだしね。
俺はこれまで持ってたMacBook Proで、蓋を閉じたら休止状態になるように設定してこの問題を回避してきたよ。蓋を開けると再開するのに20~30秒かかるけど、信頼できるスリープと蓋を閉じたときのバッテリー消費が減ることを考えたら、これは些細なことさ。もし試したいなら、ターミナルで
sudo pmset -a hibernatemode 25
を実行してみて。気に入らなかったら、デフォルトに戻すには
sudo pmset -a hibernatemode 3
だよ。
休止状態ってFDEとちゃんと動くのかな?Linuxだと、ディスク暗号化に関して、メモリをディスクにコミットする際にいろいろ注意点があったりするんだよね。
休止状態から再開するとき、システムが再開するまで認証情報は求められないんだ。だから、ディスクは復号化されたままなんだと思う。つまり、スリープと同じ動作ってことだね。
最近、WindowsノートPCでも同じことやったんだ。普通のスリープだとバッテリーがゴリゴリ減るようになったからね。でも、これでちゃんと早く起動するし、電力管理の問題もなくなったよ!
これって、コメントするくらい気にしてる人が一番求めてる動作を可能にする、一番簡単な解決策だよね。
ありがとう!俺を助けてくれたみたいに、みんなの役にも立つといいな。
これ、何をするのか説明してくれる?
man pmset
によると、hibernatemode
は0、3、25の値をサポートしてるらしいよ。0はデスクトップのデフォルトで、メモリを永続ストレージに保存しない、昔ながらのスリープ。3はポータブルのデフォルトで、メモリのコピーをディスクに保存しつつ電源は供給する。25はpmset
でしか設定できないけど、メモリのコピーをディスクに保存して電源も切るから、ハイバネーションって感じ。遅いけどバッテリーは長持ちするってさ。hibernatefile
はルートボリュームのファイルしか指定できないって注意点もあるね。
俺のMacBookの不安定な不眠症を何時間もデバッグしたけど、原因はWindowServerで、OSの再インストールが必要っぽいんだ。これはもう数ヶ月もToDoリストに入ってるよ。毎月数回、ノートPCのバッグを開けたら熱くて死んでるってのも嫌だけど、それ以上に『あんたが間違ってるんでしょ、俺にはそんなこと起こらないよ!』って言われるのが最悪だね!
Windows Serverって何だよ、どう関係するんだって思ったわ。
この設定、Appleの公式で提供されてるみたいだね。詳細はこのリンクを見て→
https://support.apple.com/en-mn/guide/mac-help/mh40774/mac
macOS 26 DBをM4 MacBook Airで使ってるけど、そこにPower Napは見当たらないね。『Wake for network access』ってのがあって、これが新しい機能なのかもしれない。デフォルトだと『Only on Power Adapter』に設定されてるよ。
『Wake for network access』は新しい設定じゃないよ。IntelとApple SiliconのMacBook両方で何年も前からあるよ。『Power Nap』はIntel専用の設定で、Apple Silicon Macには表示されないんだ。