2026年版:launchd 配下のレンタル Mac mini で OpenClaw の ulimit・メモリ・CPU ガードレールを張る
OpenClaw を HK・JP・KR・SG・US の ProxyMac Mac mini M4 に載せたとき、常駐メモリ(RSS) が launchd が想定した安全域を越えると静かに死ぬ。UI は「稼働中」のままだが、チャネルアダプタはカーネルがページをプローブ間隔より速く追い出した結果、ジョブ受理を止める。運用はしばしば「モデルが悪い」と決めつけるが、実体は無人ジョブの 既定 ulimit -n 256 や、MCP セットアップ で述べた子プロセス急増による fork 圧 である。本稿(2026)は 無言 OOM の手掛かり、シェルと LaunchAgent の ulimit 二世界、三つの数値閾値(物理 RAM の 70% ヘッドルーム、開ファイル 10k、時間当たりスワップイン 2GB)、SoftResourceLimits の コピペ可能 plist 断片、そして 並列エージェント と ヘルスプローブ への接続までを一枚にまとめる。
ログ切り分けは デプロイ障害対応 と併読し、Runbook は ヘルプセンター を参照。上限ではなく設計がボトルネックなら 料金ページ で SKU を上げる。
無言 OOM と上限シグナル:モデルを疑う前に取るログ
unified logging は jetsam を info ノイズの下に埋めがちである。ツール p95 レイテンシが 4 倍以上 に跳ねる一方 CPU が 40% 未満 に留まるパターンは、遅い LLM ではなくメモリ圧迫の典型だ。別の手掛かりは MCP stdio ブリッジでの ENOTFILE や Too many open files—並列エージェント急増時に顕在化する。
- Compressor スワップイン:16GB SKU で持続的に 500MB/h 超 なら快適余白を既に失っている。
- LaunchAgent の throttleReason に
resource-limitsが出る—plist 版を Git に固定する。 - ローカル HTTP GW からの偽 502—ワーカ子が spawn できず、多くは
RLIMIT_NPROC。
launchd と対話シェル:別物の ulimit 宇宙
SSH セッションは ~/.zprofile で ulimit -n 65535 を実行していることがあるが、LaunchAgent は plist に書かない限り複製されない。必ず plist が呼ぶ 同一ラッパースクリプト 内で上限を印字し、ノートのローカルシェルから推測しない。
| コンテキスト | 典型 maxfiles | 設定主体 | リスク |
|---|---|---|---|
| SSH ログイン | 10240+ | シェル rc | launchd デバッグを誤誘導 |
| LaunchAgent 既定 | 256〜1024 | OS 既定 | MCP バーストで即枯渇 |
| plist SoftResourceLimits 後 | 8192〜65535 | 運用チーム | コード側 FD 衛生と一致必須 |
ページに値するテレメトリ閾値
既存の ヘルスプローブ に毎分三値を syslog 追記する:空きページ、ファイル記述子数、コンプレッサページ。連続二サンプルでいずれかが跨いだら当番へ。
Plist 断片:launchd を fork 爆弾にしない SoftResourceLimits
キーはエージェント辞書直下に置き、グローバルドメインに書かない。ハード上限はソフトの 1.25 倍 以内に抑え、誤設定は速やかに失敗させてウェッジを避ける。
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key><integer>8192</integer>
<key>NumberOfProcesses</key><integer>512</integer>
<key>Stack</key><integer>8388608</integer>
</dict>
launchctl kickstart -k gui/$(id -u)/com.example.openclaw は二つ目の SSH セッションを確保してから実行する—手順は ゲートウェイ再起動リカバリ と同じ規律を流用する。
並列性:上限を上げる前に RSS を乗算する
並列ガイド の各エージェントはモデルハンドルと MCP ソケットを複製する。ラボで並列を倍にしたとき RSS が 3.2GB 増えるなら、安易に NumberOfFiles だけ倍にして漏れを隠さない。macOS ベースラインサービス控除後の物理 RAM の 70% に RSS が収まるまで並列を絞る。
RLIMIT_MEMLOCK を上げても効きにくい—キーチェーン優先の秘匿 を維持し、mmap 巨大キャッシュに逃げない。
FAQ
上限確保のため root で OpenClaw を動かすべきか。 いいえ—plist を直す。root はブラスト半径だけ広がる。
Activity Monitor で足りるか。 スポットチェックには足りるが、夜間退行は自動 memory_pressure ログで捕える。
Docker サイドカーは。 同居するなら 70% 予算からコンテナ RSS を先に減算する。
リソース偏重 OpenClaw に Apple Silicon Mac mini が残る理由
M4 の UMA はモデル重みと macOS サービスが帯域を共有しても安価 x86 VM に多い PCIe NUMA 驚きが少ない。料金 単位でリージョン課金を揃えられ、24GB SKU へ上げれば上限ではなく並列度の設計余地が増える。native launchd は Linux コンテナが「Mac っぽさ」を装うより運用が素直である。plist 版は GitOps のコミット横に記録し、オンボーディングに本稿をリンクし、ワークロード終了時に mini を返却すれば—金属が予測可能なら上限談義も単純になる。