運維與審計 2026年4月27日

OpenClaw launchd:ThrottleInterval、KeepAlive 與健康探針——2026 租用 Mac mini 矩陣

VmMac Engineering Team 2026年4月27日 約 23 分鐘閱讀

在 VmMac 租用的 Apple Silicon Mac mini 上以 LaunchAgentOpenClaw 時,ThrottleInterval 可能掩蓋崩潰迴圈,KeepAlive 會把「中毒」程序一次次拉起,而 SuccessfulExit 的語義又常與 Node 閘道器在升級時的退出碼不一致。本文給出 2026 對照矩陣:安全組合、誤報重啟風暴、無頭健康探測,以及與香港、日本、韓國、新加坡、美國一致的觀測欄位。請同時閱讀 閘道器恢復預釋出與生產隔離結構化日誌與磁碟輪換,避免 plist 全靠猜。

基線路徑見 安裝與部署;訪問與賬號問題見 幫助;把金絲雀閘道器拆到獨立機器時參考 定價

為什麼 launchd 策略比 Node 版本號更重要

即便 OpenClaw 語義化版本釘死,只要健康探針把 LLM 延遲誤判為宕機,launchd 仍可能每 12 秒 拉起一次閘道器。請把 plist 鍵當作 SLA 契約的一部分:它們定義作業系統如何理解成功、失敗與退避。在 VmMac 沒有虛擬機器監管器——launchd 就是監管器

Node 閘道器還要遵守 macOS 訊號語義:部署時的 SIGTERM 必須關閉 HTTP 服務、刷出結構化日誌並在 launchd 升級到 SIGKILL 前退出。若程序因 WebSocket 懸掛而忽略 SIGTERM,你會看到互動 shell 裡「手動重啟永遠成功」,而代理自動化卻「飄忽」。把期望的訊號階梯寫進與 Node LTS 同級的 README,並先在可丟棄的 VmMac mini 上演練,再動生產 plist。

最後,ThrottleInterval 不是修 bug 的替代品——它只改變失敗尖叫的音量。請把 OS 級退避與應用級斷路器配對,避免一次壞配置在五地同時把 CPU 打滿。

  • ThrottleInterval:限制重啟頻率,但可能掩蓋持續的部分不可用。
  • KeepAlive:保持常駐,卻會讓有計劃的下線變複雜。
  • ExitTimeOut:決定優雅退出視窗,超時後才會 SIGKILL。

矩陣:ThrottleInterval、KeepAlive、ExitTimeOut 的取捨

目標 主旋鈕 風險 緩解
阻止崩潰迴圈 ThrottleInterval ≥ 30s 真實崩潰後恢復變慢 與退出碼外部分頁配對
常駐閘道器 KeepAlive true + SuccessfulExit false 有意關機時仍被拉起 單獨維護用 Label
優雅排空 ExitTimeOut 25–40s 卡死關機阻塞重啟 預算後看門狗 SIGKILL
防止重啟驚群 錯開 StartCalendarInterval 或包裝器隨機 sleep 就緒晚於同伴 健康門等待依賴而非牆鍾

當 OpenClaw 與使用者會話裡的其他 launchd 代理共存時,可在 plist 使用 NiceLowPriorityIO,避免失控日誌船運餓死閘道器事件迴圈。它們不能替代容量規劃,但能在區域性事故中爭取幾分鐘——足夠 on-call 有意識地放寬 ThrottleInterval,而不是被誤報風暴牽著走。

誤報重啟風暴:症狀與根因

常見起點是健康檢查打 localhost 時閘道器仍在繫結套接字,而磁碟壓力拖長了模組載入。另一類是 Spotlight/mds 拉長冷啟動,觸發探針超時——請先對照 索引策略,再認定是 OpenClaw 自身問題。

護欄:若無預熱門,探針間隔不要短於冷啟動 p95 的 2 倍

另一類風暴來自依賴抖動:若探針先測外部 SaaS 再測本機就緒,日本或新加坡的路由抖動會把健康閘道器判死。請分層:外層監控先 loopback,再可選地以寬鬆超時取樣外部金絲雀,不要把程序生命週期綁在你無法掌控的第三方 SLA 上。

磁碟寫滿會造成殘酷假象:閘道器寫 JSONL 直到 APFS 返回 ENOSPC,非零退出,KeepAlive 立刻復活,日誌又立刻失敗——有時快過 ThrottleInterval 降溫。請把 日誌輪換與磁碟預算 的護欄對齊,讓重啟因正確原因變慢。

無頭健康探測:無需 VNC 的模式

用輕包裝器對閘道器健康埠執行 curl——僅在迴環上可關閉 TLS 校驗——更好的是呼叫 OpenClaw 自帶 CLI 狀態子命令(若版本提供)。記錄 HTTP 狀態TLS 握手毫秒、以及探針後的 PID,讓值班區分「程序在但卡死」與「程序已退出」。

若可行,讓探針傳送合成 X-Probe-Trace-Id 頭並在閘道器日誌回顯,以便把探針失敗與程序內慢查詢縫合——這條關聯技巧比任何 plist 微調都更能終結 P1。

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

2026 八步調參階梯

  1. 改 plist 前先採集 7 天基線退出碼。
  2. 把 ThrottleInterval 調到能消滅任何低於 20s 的重啟節奏。
  3. 讓 ExitTimeOut 與文件化的優雅關機 SLA 對齊。
  4. 為每次重啟寫入結構化日誌與原因碼。
  5. 先在一個 VmMac 區域跑 72 小時金絲雀。
  6. 對比 HK、JP、KR、SG、US 的重啟計數。
  7. 在 git 標籤 launchd-YYYYMMDD 記錄可回滾 plist。
  8. 季度演練:kill -9 閘道器並度量恢復。

在步驟四與五之間,即使指標全綠也要把金絲雀 Label 的功能凍結 72 小時——許多風暴只在週末流量形態出現。視窗內抓取 samplefootprint,對比各地 VmMac 節點的記憶體迴歸。

恢復類文章講該重啟什麼;本文講作業系統何時替你重啟。若數字不一致,人類會失去信任並開始習慣性 kill -9。請讓預釋出與生產使用相同數值旋鈕,參見 環境隔離,使晉升可 diff,而不是口口相傳。

數值習慣:若每小時重啟超過 6 次且持續 20 分鐘 以上,應觸發分頁——這幾乎從不只是「模型延遲波動」。

可觀測性表:每次重啟要記什麼

欄位 用途
launchd_exit_status 區分 OOM 與乾淨退出
uptime_s 發現「短命」迴圈
rss_mb 在 SIGKILL 前關聯洩漏
fds_open 發現被 KeepAlive 放大的控制代碼洩漏
last_http_5xx_ts 把上游 5xx 與本地死亡分開

請把這些欄位打成 JSON 行送到與閘道器請求相同的接收端,讓 SRE 從「launchd 重啟了作業」一鍵鑽取到「RSS 超過基線 1.2×」。欄位名在香港、日本、韓國、新加坡、美國保持一致,比第一版就追求完美基數更重要。

常見問題:Mac mini 上的 launchd 與 OpenClaw

要不要改成 LaunchDaemon? 僅在經過明確安全評審後——LaunchAgent 繼承的使用者 TCC 邊界可能是你有意依賴的。

能按區域不同調參嗎? 僅在有書面例外時;預設應保持一致。

升級 npm 依賴時呢? 遷移視窗臨時放寬 ThrottleInterval。

SuccessfulExit false 是否等於「任何退出都重啟」? 對多數閘道器實質如此——請用應用退出碼區分排空完成與崩潰,否則藍綠髮佈會與 launchd 打架。

健康探針應不應該用 root? 優先與網關同一使用者上下文,檔案許可權與鑰匙串/TCC 假設才能對齊;僅在只讀探針確有需要時再提權。

已知維護如何降噪? 讓包裝器檢查維護標記檔案再失敗探針,並給標記加自動過期,避免長假後被遺忘。

為什麼 Mac mini M4 與 VmMac 適合常駐閘道器

Mac mini M4 的持續效能足以吸收偶發冷啟動而不觸發過激探針,統一記憶體也能降低相比超賣 VPS 的 OOM 抖動。VmMac 讓你把閘道器放在香港、日本、韓國、新加坡、美國靠近使用者與合規要求的位置,再租第二臺 mini 專門做 plist 金絲雀,避免拿生產重啟語義做實驗。

租賃還縮短反饋環:當蘋果推送可能微妙改變 launchd 行為的 macOS 安全補丁時,你可以先在非生產 mini 快照 plist 矩陣、打補丁並重放同一健康探針指令碼,再觸碰面向客戶的自動化——這比一次深夜分頁便宜得多。

生產前先金絲雀驗證 plist

在新加坡或東京再租一臺 VmMac Mac mini 驗證 ThrottleInterval 變更,避免半夜叫醒值班。