DevOps / 監査 2026 年 5 月 15 日

2026-05-15 レンタル ProxyMac Mac mini 上の OpenClaw LaunchAgent:ThrottleInterval、KeepAlive、SuccessfulExit でクラッシュループをモデル障害と見誤らない

ProxyMac エンジニアリングチーム 2026-05-15 約 18 分

香港・日本・韓国・シンガポール・米国 のレンタル Mac mini M4OpenClawLaunchAgent として常駐させると、典型的にはゲートウェイが終了し、launchd が 1 秒未満で再起動し、推論 API が 429 や空ストリームを返し、チームは「モデルが悪い」と断定します。本稿は運用・プラットフォーム向けに、(1) 対象と定量ゲート、(2) クラッシュループとプロバイダー側スロットルの切り分け、(3) ThrottleIntervalKeepAliveSuccessfulExit4 行マトリクス(4) 再起動復旧開発/ステージング/本番の分離 に沿った9 ステップ手順(5) HTTP 429 バーストのシナリオ表(6) ThrottleInterval0 にしたときの落とし穴をまとめます。ulimit とメモリ無人ジョブ企業 HTTP プロキシの plist 化 と併読してください。SKU は 料金、インシデント雛形は ヘルプ、GUI の一度きりの信頼ダイアログは VNC を利用します。

OpenClaw で ThrottleInterval と KeepAlive を必ず調整すべきケース

ゲートウェイがモデル品質とは無関係に終了する—壊れた設定 JSON、MCP 子プロセスのセグフォ、TLS MITM の CA ローテ、デプロイ途中で token ファイルが一瞬消える—といったフリートでは plist を点検します。ThrottleInterval を明示しないと、macOS は SSH で人間が再試行するより速い自動再起動を許しがちです。逆に KeepAlive だけを有効にし終了セマンティクスを書かないと、「成功した」メンテ停止ですぐに再起動されることがあります。

  • 定量ゲート:log show --predicate 'process == "launchd"' --last 15m で同一 Label の起動が 12 回を超えたらクラッシュループ領域です。
  • プロバイダーゲート:429 が再起動タイムスタンプと ±5 秒 で相関するなら、まず自動再起動を遅らせ、温度調整は後回しにします。
  • 分離ゲート:複数環境で plist Label を共有しない—スロットル変更前に 分離ガイド の一環境一 Label を徹底します。

症状:クラッシュループとプロバイダー側スロットル

クラッシュループは CPU ののこぎりが典型で、0% のアイドルから約 8 秒で 180% まで立ち上がり、ハード終了を繰り返します。プロバイダー側の制限は CPU が比較的平坦で、retry-after や指数バックオフのヒントがログに現れます。JSONL の先頭バナーが多数のファイルで同一なら、プロセスが定常状態に入っていない可能性が高いです。ベンダーにチケットを切る前に、stat -f '%m' ~/Library/LaunchAgents/com.example.openclaw.plist で plist の更新時刻を揃え、JSONL 診断 と突き合わせてください。

証跡トリオ:(1)launchctl print の最終終了ステータス、(2)ゲートウェイログの HTTP ステータスヒストグラム、(3)MCP 子の終了コード—MCP が安定し HTTP が 429 主体なら、まず自動再起動を遅らせます。

意思決定マトリクス:ThrottleInterval・KeepAlive・SuccessfulExit

キー 制御内容 上げる/有効化するタイミング 誤設定の主なリスク
ThrottleInterval(秒) 終了後の自動再起動の最短間隔 429 嵐やロールアウト中の不安定 MCP 大きすぎると障害時の実回復が見えにくい
KeepAlive true ジョブ終了時の自動再起動(plist セマンティクスに従う) 再起動後も常駐すべき長寿命ゲートウェイ スロットルなしだと枠を焼き尽くす
SuccessfulExit false KeepAlive と組み合わせ、終了 0 を自動再起動しない成功として扱う メンテ用のセンチネルスクリプト ブールを逆にするとゾンビ再起動が残る
手動 launchctl kickstart -k 運用者主導の再起動でスロットル周期をバイパス plist 検証後の制御されたリリース 自動化が kickstart をタイトループすると嵐が再現する

9 ステップ安定化手順

  1. Label 監査:本番 OpenClaw は 1 plist のみ、環境分離 に従います。
  2. 終了嵐の取得:Label でフィルタした unified log の直近 200 行をエクスポートします。
  3. ベーススロットル:開発は 10 秒から、本番は初回 429 クラスタ後に 30 秒へ引き上げます。
  4. SuccessfulExit の定義:アップグレードスクリプトで終了 0 をグレースフルとして文書化します。
  5. メモリ上限の整合:ulimit 記事 と揃え、OOM をネット障害に見せかけないようにします。
  6. Webhook の抑制:Slack Webhook 利用時は、スロットルがプロセスを冷却している間はアラートをデバウンスします。
  7. 故障注入:秘密でない設定ファイルを一時的に退避し、再起動間隔が ThrottleInterval を守るか確認します。
  8. ソーク:ピーク並列の 40%45 分の合成トラフィックを流し、隠れた外部ウォッチドッグが二重起動しないか見ます。
  9. ポストモーテム:plist の diff と再起動ヒストグラムを 設定バージョン管理 と同じ Git に保存します。
本番 API キーを載せた共有テナントの mini で ThrottleInterval0 にしないでください—あなたのクラッシュが全員のレート制限事故になります。

シナリオ表:HTTP 429 バーストと launchd の挙動

シナリオ 観測パターン 最初のレバー
MCP セグフォループ 終了コード 1392〜4 秒周期 ThrottleInterval を 30 に上げ、MCP パスを修正
デプロイ中の token ファイル競合 6 回の終了 78 の後に成功 デプロイ用ミューテックス追加、ThrottleInterval ≥ 15
プロバイダー全体スロットル 429 と Retry-After: 60 ThrottleInterval ≥ 60、並列エージェント削減
運用 kickstart -k スクリプトの不具合 健全でも 60 秒ごとに起動 cron ラッパーを外し、KeepAlive + ヘルスプローブへ

落とし穴:ThrottleInterval がゼロと二重ウォッチドッグ

対話型デーモン向けテンプレからコピーした plist は ThrottleInterval0 のまま残りがちです。OpenClaw に攻撃的な KeepAlive を重ねると、サブ秒でファイル記述子が枯れ、MCP の 24 系エラーとして現れます(ツール本体の欠陥ではありません)。もう一つは、KeepAlive が true のまま外部 cron が launchctl kickstart を定期実行するパターンで、健全時に二重起動します。監督レイヤは一つに絞ります。

defaults read /path/to.plist ThrottleInterval

FAQ

ThrottleInterval は通常デプロイを遅らせますか?終了後の自動再開の最短間隔だけを制約します。運用者が launchctl kickstart で手動再起動する場合はスロットル対象外です。

カナリア中は KeepAlive を true にすべきですか?常駐ゲートウェイでは多くの場合 true ですが、ThrottleInterval と併用し不良バイナリの瞬間再起動を防ぎます。カナリア用は別 Label の plist にします。

メンテ停止に SuccessfulExit で書くべき終了コードは?ラッパーが約束するセンチネル—多くは 0 がグレースフル—を plist 横に文書化し、障害時の終了シグネチャと混同しないようにします。

なぜ ProxyMac Mac mini で launchd の再起動規律を稽古すべきか

レンタル Mac mini M4 は予測可能なシングルテナント CPU で熱スロットルと再起動嵐を切り分けやすく、開発者ノートと同じネイティブ macOS の syslog 挙動を得られます。HK / JP / KR / SG / US のリージョン選択で、遅延実験を実ユーザー分布に近づけられます。ここでスロットル算を検証したら、同じ plist 断片を 料金 が透明な第二台 mini へ昇格させ、launchd セマンティクスが隠れる共有 CI Runner で推測する必要はありません。

枠に触れる前に OpenClaw launchd を硬化

ThrottleInterval · KeepAlive · HK / JP / KR / SG / US