前两天检查 OpenClaw 2.6 的状态,发现一个让我后背发凉的问题。
定时任务连续3天没跑——每天早上的选题推送、晚上的 X 运营候选、认证监控……全都悄无声息地静默了。顺手查了一下日志,挖出一桩离奇的事故。
这篇文章会完整记录这次故障的排查过程,以及顺带给 OpenClaw 2.6 做了一次全面体检——最终 token 费用降了 30-50%,记忆丢失的问题也一并解决。所有配置都可以直接拿来用。
01 事故现场:4671次无效重启
事情要从一条命令说起。查看服务状态时,作者执行了:
journalctl --user -u openclaw-gateway --since "3 days ago" | grep "start" | wc -l
结果令人意外:4671。
三天,4671 次重启。平均下来每 5 秒崩一次,再自动拉起来,再崩,无限循环。
更值得警惕的是——整个过程中完全感知不到异常。用户级服务一直正常跑着,该回复的消息照常回复。只是 cron 调度器被搞乱了,定时任务全部漏跑了三四天。
根因:两个同名服务在打架
排查路径其实不复杂,原因也有些出人意料:
- 用户级服务(
~/.config/systemd/user/openclaw-gateway.service):正常运行,占着 18789 端口 - 系统级服务(
/etc/systemd/system/openclaw-gateway.service):每 5 秒尝试启动,发现端口被占就立即退出,然后 systemd 再把它拉起来……
两个同名服务,一个稳稳运行,一个疯狂撞墙。36 小时的 CPU 白白消耗,同时 cron 调度器的状态被反复刷乱,nextRunAtMs 跳到了未来某个不存在的时间点。
这类问题怎么来的?大概率是某次执行 openclaw gateway install 时,系统级和用户级各自生成了一个服务文件。
教训很明确:升级或重装 OpenClaw 后,跑一句 systemctl list-units | grep openclaw 确认没有重复服务。
02 三步修复
修复过程反而简单,三条命令就能搞定:
# 1. 停掉并禁用多余的系统级服务
sudo systemctl stop openclaw-gateway.service
sudo systemctl disable openclaw-gateway.service
# 2. 删除系统级服务文件(建议先备份)
sudo rm /etc/systemd/system/openclaw-gateway.service
# 3. 重载 systemd
sudo systemctl daemon-reload
保留用户级服务正常运行即可。
03 全身体检:9项配置优化
修完事故之后,索性对照 OpenClaw 2.6 的最新文档做一次全面体检。
最终调了 9 项配置,效果是 token 费用降了 30-50%,记忆不再丢失,整体体验提升明显。
以下逐条说明,每条都可以直接抄。
① contextPruning:自动裁剪旧内容,省 token
"contextPruning": {
"mode": "cache-ttl",
"ttl": "5m"
}
之前:每次对话都把所有历史 tool 输出带上,token 越聊越多。
之后:超过 5 分钟的 tool 输出自动裁剪,上下文保持精简。
单这一项大概能省 20-30% 的 token。
注意:这只影响发给 LLM 的上下文,不会删除磁盘上的 session 历史(.jsonl 文件保持完整)。
② compaction safeguard:防记忆丢失
"compaction": {
"mode": "safeguard",
"memoryFlush": true
}
OpenClaw 会在对话过长时自动压缩上下文(compaction),但默认模式下压缩时可能把重要记忆挤掉。
safeguard 模式会在压缩前触发一次"记忆刷盘"——把关键信息写入 MEMORY.md,确保什么都不会丢失。
没有记忆的 AI 助手就是个高级复读机。这项必须开。
③ subagents 模型降级:省 60% 费用
"subagents": {
"model": "minimax/MiniMax-M2.1",
"archiveAfterMinutes": 30
}
之前:子任务(cron 定时任务、后台处理)默认继承主模型 Claude Opus 4.6,成本偏高。
之后:子任务用 MiniMax-M2.1,费用大约是 Opus 的三分之一。
大部分 cron 任务其实不需要最强模型——发个早报、跑个监控,够用就行。把好钢用在刀刃上。
archiveAfterMinutes 从 60 降到 30,子 session 回收更快,减少内存占用。
④ heartbeat 降频 + activeHours
"heartbeat": {
"intervalMinutes": 120,
"activeHours": "08:00-24:00"
}
之前:每 30 分钟心跳一次,7×24 小时不间断。每天 48 次心跳。
之后:每 2 小时一次,只在早 8 点到晚 12 点。每天只需 8 次。
一个人睡觉的时候,不需要有人每半小时戳一下看你醒没醒。
⑤ identity:让 AI 认识自己
"identity": {
"agents": {
"main": {
"name": "小墨",
"emoji": "?⬛"
}
}
}
配置之后,AI 在群聊里能识别 @小墨,自动 ack reaction 也会带上身份标识。小事,但体验好很多。
⑥ inbound debounce:连续消息合并
"inbound": {
"debounceMs": 3000
}
在 Telegram 连续发 3 条消息时,OpenClaw 不会触发 3 次处理,而是等 3 秒合并成一次。既省 token,也省等待多次回复的时间。
⑦ session reset:自然过期
"session": {
"resetMode": "idle",
"idleMinutes": 240
}
4 小时没有对话就重置 session。相比于固定时间重置更加自然——深夜聊到 2 点也不会被打断。
⑧ userTimezone:时区修正
"userTimezone": "Asia/Shanghai"
别小看这个。时区不对,AI 说的"今天""明天"全是乱的,cron 任务的触发时间也会偏移。这是基础设施级的配置,第一天就该设好。
⑨ cron 链接修复
升级到 2.6 后,一些旧配置没有跟着更新:
- 文档索引的 URL 还指向旧域名
docs.clawd.bot,需要改成docs.openclaw.ai - 认证监控的命令还是旧的
clawdbot,需要改成openclaw
升级框架版本后,一定要检查 cron 任务里的硬编码路径和命令。这类隐形 bug 不会报错,只会默默失效。
04 进阶:用 QMD 替代默认记忆搜索
基础体检做完,还有一个社区里很多人用的省 token 方案:QMD。
QMD 是一个本地优先的搜索工具,采用 BM25 + 向量 + 重排序的三重机制来检索 Markdown 文件。OpenClaw 2.6 原生支持它作为记忆后端。
为什么要换?
默认的记忆搜索使用远程 embedding API(OpenAI / Gemini / Voyage),每次搜索都要调一次 API。而 QMD 跑在本地,零 API 费用、零延迟,数据不出机器。
社区有反馈称,用 QMD 后 token 节省了 60-97%,因为它只拉取最相关的 2-3 句话进上下文,而不是把整段记忆塞进去。
怎么配?
# 1. 安装 QMD
bun install -g https://github.com/tobi/qmd
# 2. 确认 qmd 命令可用
qmd --version
然后在 OpenClaw 配置里加上一行:
"memory": {
"backend": "qmd"
}
重启 Gateway 即可生效。Markdown 文件仍然是唯一的"真相来源",QMD 只负责检索。
注意事项
- QMD 目前还是实验性功能(experimental),建议先在子 agent 上测试
- 需要单独安装 QMD CLI
- 如果记忆文件不多(少于 50 个),默认的 SQLite 向量搜索其实也够用
05 OpenClaw 2.6 还有什么新东西?
顺便整理一下 2.6 的关键更新,方便判断是否需要升级:
- 模型支持:原生支持 Anthropic Opus 4.6 和 OpenAI Codex gpt-5.3-codex
- xAI (Grok) 接入:可以用 Grok 作为 provider 了
- Web UI token 仪表盘:可以直接查看 token 消耗趋势
- Voyage AI 原生支持:记忆向量搜索多了 embedding 选择
- Cron 调度修复:修了好几个定时任务漏跑和提醒不送达的 bug
- 安全增强:skill/plugin 代码安全扫描,config.get 响应自动脱敏
- Compaction 重试:上下文溢出时允许多次压缩重试,不会直接崩溃
如果还在用 2.5 或更早版本,强烈建议升级。尤其是 cron 调度的修复,2.5 的 cron 在某些场景下会静默停跑。
最终效果
| 指标 | Before | After |
|---|---|---|
| Token 费用 | 基准 | 降低 30-50% |
| 记忆丢失风险 | 有 | 基本消除 |
| 子任务费用 | Opus 全量 | 降低 60%+ |
| 无效心跳 | 48 次/天 | 8 次/天 |
| Cron 任务 | 漏跑 3-4 天 | 全部恢复 |
| 记忆搜索 | 远程 API | 本地 QMD(可选) |
写在最后
AI 助手不是装完就能跑一辈子的。
它就像一辆车——需要定期保养,检查机油、轮胎、刹车。不然哪天高速上抛锚,才会发现发动机早就拉缸了。
这次"体检"发现了一个跑了 4671 次的隐形故障,顺带优化出 30-50% 的成本节省。总共花了不到 2 小时。
如果在用 OpenClaw,建议现在就跑一句:
systemctl list-units | grep openclaw
看看有没有"幽灵服务"在偷偷消耗你的资源。
工具会变强,但不会自己变好。调教它的人,才是真正的竞争力。
