运维与审计 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