Bot プログラミングスキル 環境構築・インフラ 開発ログ

🛠️開発記録#260(2025/7/6)Mac mini × Docker Desktop 24 GBメモリ機でも“重さ”を寄せ付けない——仮想通貨自動トレード Bot 開発向けチューニング完全版

本稿は Docker Desktop・Cursor IDE・仮想通貨トレード Bot を同時に動かしている M-series Mac mini(RAM 24 GB)で、突然のメモリ飢餓を撲滅した実録です。
最新の除外方針(data_links / .secrets / backtest24/logs / logs は監視対象に残し、htmlcov / __pycache__ / *.pyc のみ除外)を反映しています。


1. なぜ 24 GB でも RAM が枯渇するのか

レイヤ典型症状原因概要
Docker VM (qemu-system)RSS が 10–16 GB に膨張VM に固定割当て (‐m 8 GB 等) + virtiofs キャッシュ
コンテナ単体プロセスが数 GB 消費mem_limit 未設定/リーク/Java などヒープ拡大
IDE ウォッチャーFD 3 万超・CPU 60 %VS Code / Cursor が node_modules 等を全文監視
Spotlight / Time Machinemds_stores が CPU 100 %Docker のレイヤ展開を全インデックス化

2. メモリ状況を一瞬で可視化するワンライナー

# 全体サマリ & 空き率
vm_stat && echo && memory_pressure -Q

# VM 実メモリ (GB)
ps -o rss= -p $(pgrep -f qemu-system) | awk '{printf "Docker-VM RSS: %.1f GB\n",$1/1048576}'

# 上位メモリプロセス
ps aux | sort -nrk 4 | head -20

System-wide memory free percentage15 % を切ったら危険域 です。


3. ステップ① ― VM メモリ上限と Ballooning

  1. Docker Desktop ▸ Settings ▸ Resources
    Memory を 6 GB(開発なら 4 GB でも可)に。
  2. Docker Desktop ≥ 4.43 なら Advanced
    ☑︎ Enable dynamic memory managementApply & Restart
    • アイドル時に VM RSS が 2〜4 GB まで縮む。

4. ステップ② ― コンテナに mem_limit / cpus

# docker-compose.yml
services:
  api:
    image: myapi:latest
    mem_limit: 1g    # ←必ず上限を書く
    cpus: 1
  db:
    image: postgres:16
    mem_limit: 2g
    cpus: 1

docker stats で LIMIT 列が付けば成功。


5. ステップ③ — トレード Bot 向けファイルウォッチ最適化

5-1 監視したい・したくないディレクトリ

意味監視を 維持除外
トレード判断に直結data_links/**.secrets/**
backtest24/logs/**logs/**
不要・肥大化要因htmlcov/**
__pycache__/**
*.pyc

5-2 VS Code / Cursor 設定例

{
  "files.watcherExclude": {
    "**/htmlcov/**": true,
    "**/__pycache__/**": true,
    "**/*.pyc": true
  },
  "search.exclude": {
    "**/htmlcov/**": true,
    "**/__pycache__/**": true,
    "**/*.pyc": true
  }
}

維持したい 4 フォルダは 除外リストに入れない ことがポイントです。

5-3 効果測定

lsof -c "Cursor Helper" | wc -l   # ← 1 万未満なら合格

6. ステップ④ ― Spotlight/Time Machine 除外

sudo mdutil -i off ~/Library/Containers/com.docker.docker
sudo mdutil -i off ~/Library/Group\ Containers/group.com.docker

Time Machine → “オプション” で同パスを追加。


7. ステップ⑤ ― 週次 Auto-Prune

cat <<'PL' | sudo tee /Library/LaunchDaemons/com.local.dockerprune.plist
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0"><dict>
 <key>Label</key><string>com.local.dockerprune</string>
 <key>ProgramArguments</key>
  <array><string>/usr/local/bin/docker</string><string>system</string><string>prune</string><string>-af</string><string>--filter</string><string>until=168h</string></array>
 <key>StartCalendarInterval</key><dict><key>Weekday</key><integer>7</integer><key>Hour</key><integer>4</integer></dict>
 <key>StandardOutPath</key><string>/tmp/dockerprune.log</string>
 <key>StandardErrorPath</key><string>/tmp/dockerprune.err</string>
</dict></plist>
PL
sudo launchctl load /Library/LaunchDaemons/com.local.dockerprune.plist
0 4 * * 0 /usr/local/bin/docker system prune -af --filter "until=168h" > /tmp/docker_prune.log 2>&1

8. ビフォー/アフター計測

指標BeforeAfter
Docker-VM RSS15 GB6〜8 GB(Idle 3 GB)
free% (memory_pressure)20 %65〜80 %
swap / compressed数百 MB / 5 GB0 MB / 1–2 GB
ウォッチャー FD25 k8 k
Spotlight CPU80 %≈0 %

9. トラブル対処 Q&A:Engine stopped ループ

症状解決策
Docker Engine stopped が 3 分以上1) pkill -9 -f com.docker → 再起動
2) rm -rf ~/Library/Containers/com.docker.docker/Data/vms/0/* → 再起動
connection refused 192.168.65.xSettings ▸ Advanced ▸ Use new virtualization framework を OFF(vf-kit → QEMU)
UI も起動しない/Applications/Docker.app/Contents/MacOS/Docker --uninstall → 最新版を再インストール

10. まとめ

  1. VM 6 GB+Ballooning
  2. コンテナ全てに mem_limit / cpus
  3. トレード Bot に必要なフォルダだけ監視
  4. Spotlight & Time Machine から Docker を切り離し
  5. 週次 Auto-Prune

これで 24 GB マシンでも swap 0 のまま
バックテストもリアルタイム Bot もストレスフリーに動かせます。

これらを試して、数値でラクさを体感してみてください!

付録:リアルタイム監視ツール

## 未インストールなら brew で導入
brew install htop   # 一度だけ実行

## 起動 (q で終了)
htop

-Bot, プログラミングスキル, 環境構築・インフラ, 開発ログ