Mac が急に重くなりました。ウィンドウの切り替えが引っかかり、ファンが回りっぱなしです。見てみると load average が 500 を超え、スワップを 14GB 使っていて、空きメモリはほとんど残っていませんでした。
アプリを閉じても軽くならないので、何が動いているかを順に見ていきました。
uptime # load average
sysctl vm.swapusage # スワップの使用量
docker ps --format '{{.Names}}\t{{.Status}}'
lsof -nP -iTCP -sTCP:LISTEN # 待ち受けているポートと、そのプロセス
起きていたこと
docker ps に、Supabase のローカル環境が2組・約20コンテナ並んでいました。どちらも何日も前に、生成AI(Claude Code)に作業させたときに supabase start で立ち上げ、そのまま止めていなかったものです。Docker Desktop の仮想マシンだけで約13GB(圧縮分を含む)、CPU も 75〜88% を使っていました。
不思議だったのは、Docker Desktop の「ログイン時に起動」は切ってあったことです。それでも、その日に別の作業で Docker を起動した時点で、2組とも動き出していました。
原因:restart policy が unless-stopped
コンテナごとの再起動の設定を見ると、こうなっていました。
docker inspect -f '{{.Name}} {{.HostConfig.RestartPolicy.Name}}' $(docker ps -q)
# /supabase_db_my-project unless-stopped
# /supabase_kong_my-project unless-stopped
# ...
unless-stopped は「自分で止めない限り、Docker が起動するたびに立ち上げ直す」という設定です。supabase stop をせずに作業を終えると、コンテナは「止められていない」扱いのまま残ります。次に誰かが Docker を起動すると、使っていない Supabase が全部よみがえります。
直し方
そのプロジェクトのフォルダで止めます。
cd my-project
supabase stop
フォルダが分からないときは、名前で絞って止めます。
docker ps --filter name=supabase_ --format '{{.Names}}'
docker stop $(docker ps -q --filter name=supabase_)
docker stop で止めたコンテナは、unless-stopped でも次の Docker 起動では立ち上がりません。
ほかに、使っていない開発サーバー(next dev)や python -m http.server も残っていたので、lsof で接続が無いことを確かめてから止めました。http.server は既定ですべてのネットワークに向けて待ち受けるので、止め忘れは重さ以外の意味でもよくありません。
止めたあと、load average は 500 台から 30 前後まで下がり、空きメモリは 35% から 62% になりました。
止め忘れを減らす
-
supabase start・docker compose up・開発サーバーを立ち上げたら、作業の最後に止めるところまでを手順に入れる - 生成AIに作業させるときも同じ。AIが立ち上げたものは、AIが終わりに止めるように指示しておく
- データベースだけ使えればよいなら、Docker を使わずに Homebrew の PostgreSQL を入れる手もある(自分はこちらに移した)
まとめ
- Mac が重いときは
uptime・sysctl vm.swapusage・docker ps・lsof -iTCP -sTCP:LISTENを順に見る - Supabase のローカルのコンテナは restart policy が
unless-stopped。止めずに終えると、Docker を起動するたびに蘇る -
supabase stop(またはdocker stop)で明示的に止める
Mac が重くなったときに見る順番とコマンドをまとめたもの(有料・100円):https://note.com/kaito_cometa/n/nd9dff0c9fe42
生成AI(Claude Code)に書かせて一人で会社を回している記録を note に書いています。
https://note.com/kaito_cometa