目录

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
服务器监控面板截图,红色告警显示 Gateway RSS 70GB+,swap 使用率飙升

排查过程

第一步:确认内存构成

使用 smemps 等工具查看 Gateway 进程内存分布,发现 VSZ(虚拟内存)远大于 RSS(常驻内存),且大部分被 QMD(记忆)相关数据占据。

第二步:定位主要内存消耗

逐一排查三个可疑方向:

  1. Agent 数量:282 个 agent 配置在运行,每个 agent 启动时都会加载自身的 QMD collections
  2. Session 文件ls 发现 session 目录下有 11,086 个 JSON 文件,其中大部分属于 260 个非核心 agent
  3. 心跳机制api.heartbeat.every 配置为 30m,282 个 agent 每 30 分钟触发一次全量 QMD 加载

第三步:验证假设

通过临时停用部分 agent 观察内存变化,确认 QMD collections 加载是 RSS 膨胀的主要来源。

根因分析三要素图,三个圆圈分别标注 QMD collections、Session 文件、心跳机制,箭头指向中心"内存膨胀"

根因

  1. QMD collections 累积加载:每个 agent 启动时加载自身记忆数据,282 个 agent 的记忆数据累积是 RSS 膨胀的主因
  2. Session 文件未清理:长时间运行积累 11,086 个 session 文件,260 个非核心 agent 的 session 从未被清理
  3. 心跳频率不当:本地/内网部署不需要每 30 分钟保活,高频心跳反而加重内存和 IO 压力

修复方案

按执行顺序分三步:

措施一:停用心跳

api.heartbeat.every30m 改为 365d,实质上停用心跳机制。

  • 效果:减少了大量由心跳引发的 QMD 重复加载
  • 理由:本地服务器不需要客户端保活,已有独立运维监控

措施二:启用自动 Session 清理

session.maintenance.modewarn 切换为 enforce

  • 效果:Gateway 自动清理过期 session,无需人工干预
  • 说明enforce 模式按过期策略自动删除旧 session,之前停留在 warn 导致问题长期积累

措施三:手动清理非核心 Session

使用 find 命令批量删除 260 个非核心 agent 的 1 天前 session 文件。

find /path/to/agents -name "*.json" -mtime +1 -delete

清理结果

指标清理前清理后变化
Session 文件数11,0867,261-3,825
释放空间562 MB
修复效果对比图,左侧红色柱状图显示 RSS 70GB,右侧绿色柱状图显示 RSS 780MB

当前状态

指标当前值
Runtimerunning (pid 190949)
Connectivity probeok
RSS780 MB(启动 6 分钟后)
心跳✅ 已停(365d)
Session 清理✅ enforce 已启用
非核心 session✅ 已手动清理

经验教训

  1. Agent 数量膨胀是渐进式问题:282 个 agent 是长期配置积累的结果,需要定期审计和精简
  2. QMD collections 是大户:内存膨胀主因不是 session 文件本身,而是 agent 启动时加载的记忆数据。减少 agent 数量是后续治本的关键
  3. 心跳需要按场景选型:本地/内网部署可停用保活心跳,生产环境才需要高频心跳
  4. Session 自动清理比手动更可靠enforce 模式在内存管理中至关重要,不应长期停留在 warn 模式

后续治理建议

  1. Agent 生命周期管理:建立创建和废弃标准流程,每月审查 agent 列表,废弃 agent 应从配置中移除
  2. 内存基线监控:建议设置 RSS 告警阈值,如 RSS > 4 GB 告警、> 8 GB 紧急
  3. 配置文件版本管理openclaw.json 每次改动建议备注变更记录,便于回溯
  4. 非核心 agent 精简策略:按使用频率区分,过去 30 天无人使用的优先清理

关联阅读

  • [[OpenClaw Heartbeat 配置避坑指南:duration 字段不支持 ‘day’ 单位]]
  • [[memory_search 反复 fallback?一次配置冲突引发的血案]]
  • [[sessions_spawn 排查与修复全过程]]

参考来源

  • 会话记录:agent:oc-engineer:dashboard:d58249e8-e2d5-49a5-a4fe-f8475ec90672

–全文完–

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

希望我写的每一个字,成为我自己和某个人活下去、拼下去的力量。                     《内容已折叠,点击展开》

“技术终归是工具,而我们一次次认真把问题理顺,守住的其实不只是页面样式和代码输出,还有那一点不愿被混乱打败的心气,是每一个深夜仍愿点灯前行的人。”

转载请注明来自https://oklife.me。

文尾配图水墨画图片