運用と監査 2026年4月27日

OpenClaw launchd:ThrottleInterval・KeepAlive・ヘルスプローブ——2026 レンタル Mac mini マトリクス

VmMac エンジニアリングチーム 2026年4月27日 約23分で読了

VmMac で借りた Apple Silicon Mac mini 上の LaunchAgentOpenClaw を動かすと、ThrottleInterval がクラッシュループを隠し、KeepAlive が不調プロセスを蘇らせ、SuccessfulExit の意味が Node ゲートウェイのアップグレード時の終了コードと噛み合わない、という三すくみに出会います。本稿は 2026 年の実務マトリクスとして、安全な組み合わせ、誤検知による再起動嵐、VNC 無しでも使えるヘルスチェック、香港・日本・韓国・シンガポール・アメリカでの観測項目の揃え方を整理します。ゲートウェイ復旧ステージングと本番の分離構造化ログとディスクローテとセットで読むと、plist 調整が勘頼みになりません。

初期導線は インストールとデプロイ、アクセス手順は ヘルプ、カナリア用にホストを増やす判断は 料金 を参照してください。

なぜ launchd ポリシーが Node のバージョンより重要か

OpenClaw のセマンティックバージョンを完璧に固定しても、ヘルスプローブが LLM の遅延を死と誤認して launchd が 12 秒周期で再起動すれば意味がありません。plist の各キーは SLA の一部です。VmMac にはハイパーバイザの監督者がいないので、launchd が監督者です。

Node ゲートウェイはシグナル契約も守る必要があります。デプロイ時の SIGTERM で HTTP を閉じ、構造化ログをフラッシュし、SIGKILL 前に終了できなければ、対話シェルでは「手動再起動は常に成功」し、エージェント経路だけ不安定に見えます。README に期待シグナル順を明記し、捨てられるミニでリハーサルしてから本番 plist を触ってください。

ThrottleInterval はバグ修正の代替ではありません。OS レベルのバックオフとアプリ側サーキットブレーカーを併用し、壊れた設定が全リージョンで CPU を焼くのを防ぎます。

  • ThrottleInterval:再起動頻度を抑えるが、慢性の部分障害を隠す。
  • KeepAlive:常駐に有利だが計画停止を難しくする。
  • ExitTimeOut:グレースフル終了の猶予、その後 SIGKILL。

マトリクス:ThrottleInterval / KeepAlive / ExitTimeOut

目的 主なつまみ リスク 緩和
クラッシュループ停止 ThrottleInterval ≥ 30s 本物のクラッシュ後の復旧が遅い 終了コードで外部ページ
常時オン GW KeepAlive true + SuccessfulExit false 意図停止でも復活 メンテ専用ラベルを分離
グレースドレイン ExitTimeOut 25–40s ハングした終了が再起動を塞ぐ 予算後のウォッチドッグ SIGKILL
再起動サンダリングヘルド抑制 カレンダー分散やラッパ sleep ピアより遅いレディネス 依存待ちのヘルスゲート

同一ユーザーセッションに他の launchd ジョブがいるなら NiceLowPriorityIO でログシッパーがイベントループを飢えさせないようにします。容量計画の代替ではありませんが、局所障害の数分は稼げます。

誤検知再起動嵐:兆候と原因

ローカルヘルスがソケットバインド前に叩かれる、ディスク圧でモジュール読込が遅延する、といったパターンが典型です。Spotlightmds が冷起動を伸ばしてタイムアウトするケースでは、先に インデックス方針 を疑ってください。

ガードレール:ウォームアップ無しで、プローブ間隔を冷起動 p95 の 2 倍未満にしない。

外部 SaaS を先に見るプローブは、日本やシンガポールの経路揺らぎで健全なプロセスを殺します。ループバックを先に、外部カナリアは緩いタイムアウトで任意層に分けてください。ディスク満杯では JSONL が ENOSPC で落ち、KeepAlive が即再起動しログも即死します—ログローテとクォータを先に揃えます。

ヘッドレス・ヘルスプローブ

ループバック向けに限り TLS 検証を切る curl ラッパでも、CLI の status サブコマンドでも構いません。HTTP ステータス、TLS ハンドシェイク ms、PID をログし、「生きているが固まった」と「死んだ」を分けます。

X-Probe-Trace-Id を付けてゲートウェイ側で返すと、プローブ失敗と遅いクエリを縫い合わせられます。

curl -fsS --max-time 3 http://127.0.0.1:18789/health || exit 1

2026 八段階チューニング

  1. plist を変える前に 7 日間の終了コード基線。
  2. 20 秒未満の再起動リズムを潰す ThrottleInterval。
  3. ExitTimeOut を文書化 SLA に合わせる。
  4. 再起動理由を構造化ログへ。
  5. 単一リージョンで 72h カナリア。
  6. HK/JP/KR/SG/US の再起動数比較。
  7. git タグ launchd-YYYYMMDD でロールバック plist を固定。
  8. 四半期ごとに kill -9 復旧演習。

ステップ 4 と 5 の間はメトリクスが緑でも機能開発を止め、週末トラフィック形での嵐を観察してください。

復旧記事は「何を再起動するか」、本稿は「OS がいつ自動再起動するか」です。数値が食い違うと人は kill -9 癖に落ちます。ステージングと本番で同じ数値を保ち、昇格は diff で行けるようにしてください。

運用しきい値:20 分以上、毎時 6 回超の再起動はほぼ常に異常です。

観測テーブル:再起動ごとに残すフィールド

フィールド 目的
launchd_exit_status OOM と正常終了の切り分け
uptime_s 幼児死亡率ループ
rss_mb SIGKILL 前のリーク相関
fds_open KeepAlive が増幅する FD 漏れ
last_http_5xx_ts 上流 5xx とローカル死の分離

JSON Lines をリクエストログと同じシンクへ。フィールド名は五リージョンで揃えるのが先、完璧な基数は後で構いません。

FAQ

LaunchDaemon にすべき? セキュリティレビュー付きでなければ避ける—エージェントの TCC 境界は意図的かもしれません。

リージョンごとに数値を変える? 文書化された例外以外は揃えるのが既定。

npm 大移行中は? 一時的に ThrottleInterval を広げる。

SuccessfulExit false は常に再起動? 実質そう—ドレイン完了とクラッシュを終了コードで分ける。

プローブは root? ゲートウェイと同一ユーザーが無難。

計画メンテの沈黙? メンテフラグをラッパが見て自動失効させる。

Mac mini M4 と VmMac が常時オン GW に合う理由

十分な持続性能とユニファイドメモリで OOM 揺れが減り、攻撃的プローブに冷起動で負けにくいです。五リージョンに置き、第二台で plist カナリアを回せば本番の再起動意味論を壊しません。

レンタルは macOS セキュリティパッチ後の挙動差分を、非本番ミニで plist マトリクスをリプレイ検証しやすくします。深夜ページより安い保険です。

最後に、launchd の変更は「アプリの設定変更」と同列の変更管理に載せてください。承認フローとロールバック手順が無いと、どんなに良い数値でも現場では守られません。

本番前に plist をカナリア検証

シンガポールまたは東京の VmMac Mac mini を追加し、ThrottleInterval 変更をオンコール無しで検証します。