OpenClaw 内存膨胀排查与修复:从 70GB 到 780MB
一次由 QMD collections 和 session 文件膨胀引发的 Gateway 内存危机

目录
OpenClaw 内存膨胀排查与修复:从 70GB 到 780MB
症状
2026-06-30,oc-engineer 巡检发现 Gateway 进程 RSS 超过 70 GB,远超 64 GB 物理内存,系统触发大量 swap,性能严重下降。
| 指标 | 值 |
|---|---|
| 物理内存 | 64 GB |
| Gateway RSS(峰值) | 70+ GB |
| Agent 数量 | 282 |
| Skills 数量 | 127 |
| Session 文件数(清理前) | 11,086 |
| 系统状态 | 🔴 RED |

排查过程
第一步:确认内存构成
使用 smem、ps 等工具查看 Gateway 进程内存分布,发现 VSZ(虚拟内存)远大于 RSS(常驻内存),且大部分被 QMD(记忆)相关数据占据。
第二步:定位主要内存消耗
逐一排查三个可疑方向:
- Agent 数量:282 个 agent 配置在运行,每个 agent 启动时都会加载自身的 QMD collections
- Session 文件:
ls发现 session 目录下有 11,086 个 JSON 文件,其中大部分属于 260 个非核心 agent - 心跳机制:
api.heartbeat.every配置为30m,282 个 agent 每 30 分钟触发一次全量 QMD 加载
第三步:验证假设
通过临时停用部分 agent 观察内存变化,确认 QMD collections 加载是 RSS 膨胀的主要来源。

根因
- QMD collections 累积加载:每个 agent 启动时加载自身记忆数据,282 个 agent 的记忆数据累积是 RSS 膨胀的主因
- Session 文件未清理:长时间运行积累 11,086 个 session 文件,260 个非核心 agent 的 session 从未被清理
- 心跳频率不当:本地/内网部署不需要每 30 分钟保活,高频心跳反而加重内存和 IO 压力
修复方案
按执行顺序分三步:
措施一:停用心跳
将 api.heartbeat.every 从 30m 改为 365d,实质上停用心跳机制。
- 效果:减少了大量由心跳引发的 QMD 重复加载
- 理由:本地服务器不需要客户端保活,已有独立运维监控
措施二:启用自动 Session 清理
将 session.maintenance.mode 从 warn 切换为 enforce。
- 效果:Gateway 自动清理过期 session,无需人工干预
- 说明:
enforce模式按过期策略自动删除旧 session,之前停留在warn导致问题长期积累
措施三:手动清理非核心 Session
使用 find 命令批量删除 260 个非核心 agent 的 1 天前 session 文件。
find /path/to/agents -name "*.json" -mtime +1 -delete清理结果:
| 指标 | 清理前 | 清理后 | 变化 |
|---|---|---|---|
| Session 文件数 | 11,086 | 7,261 | -3,825 |
| 释放空间 | — | 562 MB | — |

当前状态
| 指标 | 当前值 |
|---|---|
| Runtime | running (pid 190949) |
| Connectivity probe | ok |
| RSS | 780 MB(启动 6 分钟后) |
| 心跳 | ✅ 已停(365d) |
| Session 清理 | ✅ enforce 已启用 |
| 非核心 session | ✅ 已手动清理 |
经验教训
- Agent 数量膨胀是渐进式问题:282 个 agent 是长期配置积累的结果,需要定期审计和精简
- QMD collections 是大户:内存膨胀主因不是 session 文件本身,而是 agent 启动时加载的记忆数据。减少 agent 数量是后续治本的关键
- 心跳需要按场景选型:本地/内网部署可停用保活心跳,生产环境才需要高频心跳
- Session 自动清理比手动更可靠:
enforce模式在内存管理中至关重要,不应长期停留在warn模式
后续治理建议
- Agent 生命周期管理:建立创建和废弃标准流程,每月审查 agent 列表,废弃 agent 应从配置中移除
- 内存基线监控:建议设置 RSS 告警阈值,如 RSS > 4 GB 告警、> 8 GB 紧急
- 配置文件版本管理:
openclaw.json每次改动建议备注变更记录,便于回溯 - 非核心 agent 精简策略:按使用频率区分,过去 30 天无人使用的优先清理
关联阅读
- [[OpenClaw Heartbeat 配置避坑指南:duration 字段不支持 ‘day’ 单位]]
- [[memory_search 反复 fallback?一次配置冲突引发的血案]]
- [[sessions_spawn 排查与修复全过程]]
参考来源
- 会话记录:
agent:oc-engineer:dashboard:d58249e8-e2d5-49a5-a4fe-f8475ec90672
–全文完–

若你有故事想讲、有困惑想聊、或是想找个人说说心里话,甚至只是吐槽发泄一下情绪,都欢迎来找我聊聊: 《内容已折叠,点击展开》
梦行志
