維運與稽核 2026 年 5 月 15 日

2026-05-15 在租用 ProxyMac Mac mini 上為 OpenClaw LaunchAgent 設定 ThrottleInterval、KeepAlive 與 SuccessfulExit:別讓崩潰迴圈偽裝成「模型壞了」

ProxyMac 工程團隊 2026-05-15 約 18 分鐘閱讀

香港、日本、韓國、新加坡或美國 的租用 Mac mini M4 上以 LaunchAgent 常駐 OpenClaw 時,常見劇本是:閘道一退出,launchd 在一秒內又拉起,推理介面回傳 429 或空流,團隊立刻歸咎於「模型」。本文面向維運與平台工程,交付 (1) 受眾與量化門檻、(2) 崩潰迴圈與供應商側限流的症狀切分、(3) 針對 ThrottleIntervalKeepAliveSuccessfulExit四列決策矩陣(4)重啟恢復開發/預發/生產隔離 對齊的九步手冊(5) HTTP 429 突發的情境表,以及 (6) ThrottleInterval0 時的典型坑。請與 ulimit 與記憶體無人值守工作企業 HTTP 代理編碼 交叉閱讀。規格與預算見 定價頁;事故範本見 說明中心;一次性 GUI 信任彈窗可借助 VNC

誰必須為 OpenClaw 調 ThrottleInterval 與 KeepAlive

凡是閘道程序會因與模型品質無關的原因退出—設定 JSON 損毀、MCP 子程序區段錯誤、TLS 中間人憑證輪替、或發佈中途短暫遺失 token 檔—都應審視 plist。若 LaunchAgent 未明確設定 ThrottleInterval,macOS 可能允許極密的自動重啟,其重試頻率遠高於你在 SSH 裡手動的節奏。反之,若只開 KeepAlive 而不約定退出語意,一次「成功的」維護停機仍可能被立刻拉起。

  • 量化門檻:log show --predicate 'process == "launchd"' --last 15m 對同一 Label 記錄到超過 12 次啟動事件,即進入崩潰迴圈區間。
  • 供應商門檻:429 與重啟時間戳落在 ±5 秒 內相關時,先節流自動重啟,再調模型溫度。
  • 隔離門檻:多環境機群絕不應共享同一 plist Label—在改節流參數前,先落實 隔離文章 的一環境一 Label 紀律。

症狀:崩潰迴圈 vs 供應商側限流

崩潰迴圈常呈鋸齒 CPU:0% 閒置、約 8 秒內衝到 180% 啟動 OpenClaw、硬退出、周而復始。供應商限流則 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 校驗通過後的受控發佈 自動化若以 tight loop 呼叫 kickstart,會複刻風暴

九步穩定化手冊

  1. Label 稽核:確保生產 OpenClaw 僅由一個 plist 擁有,遵循 環境隔離
  2. 採集退出風暴:匯出依 Label 過濾的統一日誌最近 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 上把 ThrottleInterval 設為 0—你的崩潰會變成所有人的限流故事。

情境表:HTTP 429 突發 與 launchd 行為

情境 可觀測模式 第一槓桿
MCP 區段錯誤迴圈 退出碼 1392–4 秒重複 將 ThrottleInterval 提到 30;修復 MCP 路徑
發佈時 token 檔競態 連續 6 次退出 78 後成功 增加發佈互斥;ThrottleInterval ≥ 15
供應商全局限流 429 且 Retry-After: 60 ThrottleInterval ≥ 60;降低並行 Agent
維運 kickstart -k 腳本缺陷 無論健康與否每 60 秒啟動一次 移除 cron 包裝;改用 KeepAlive + 健康探針

坑:ThrottleInterval 為零與重複看門狗

不少從範本複製的 plist 把 ThrottleInterval 留在 0—那些範本本為互動式守護程序設計。OpenClaw 再疊加激進的 KeepAlive,會在亞秒級耗盡檔案描述符,最終以 MCP 24 類錯誤呈現,與工具邏輯無關。第二個坑是:在 KeepAlive 已 true 時仍用外部 cron 週期性 launchctl kickstart,會在健康期雙觸發。只保留一層監督機制。

defaults read /path/to.plist ThrottleInterval

常見問題

ThrottleInterval 會拖慢正常發佈嗎?它只在程序退出後約束自動重拉之間的最短牆鐘間隔。維運人員以 launchctl kickstart 執行的手動重啟不受該節流影響。

金絲雀升級期間是否應把 KeepAlive 設為 true?長期閘道通常建議 true,但務必搭配 ThrottleInterval,避免壞二進位瞬間反覆拉起;金絲雀 plist 應使用獨立 Label,參見環境隔離指南。

維護停機應把哪個退出碼寫入 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