Skip to content

Subagent sessions 内存无限累积,gateway RSS 增长 3GB+

问题

长时间运行 subagent 任务后,gateway 进程内存(RSS)持续增长,达到 3GB+ 甚至更高,最终导致 OOM 或系统卡顿。重启 gateway 可临时恢复,但 session 重新加载后内存再次攀升。

数据实证(社区实测):

  • 10 小时 subagent 工作后:896 个 session 文件,281MB 磁盘
  • sessions.json 索引文件:45MB
  • Gateway RSS:约 3.2GB(内存是磁盘的 ~3-5 倍,因 JSON 解析展开)

根本原因

  1. 每次 sessions_spawn(mode="run") 创建新 session 文件,但没有自动清理已完成的 session
  2. Gateway 启动时全量加载所有历史 session 到内存(JSON 全解析,无懒加载)
  3. sessions.json 索引随 session 数量线性增长,本身也会消耗大量内存

解决方案

方案一:定期手动清理旧 session(立即有效)

bash
# 查看 session 文件数量和总大小
ls ~/.openclaw/sessions/ | wc -l
du -sh ~/.openclaw/sessions/

# 备份(重要!删除前先备份)
cp -r ~/.openclaw/sessions/ ~/.openclaw/sessions-backup-$(date +%Y%m%d)/

# 删除 7 天前的 session 文件(保留最近 7 天)
find ~/.openclaw/sessions/ -name "*.json" -mtime +7 -delete

# 重启 gateway 使变更生效(加载内存清空)
openclaw gateway restart

方案二:控制 subagent 调用频率

减少并发 subagent 数量,让 session 文件不至于快速累积:

yaml
agents:
  defaults:
    subagents:
      maxConcurrent: 3    # 限制并发,默认可能更高

方案三:监控 gateway 内存

设置定期重启的 cron 任务(激进方案,适合长期无人值守运行):

bash
# 每 12 小时重启一次 gateway(在 openclaw cron 中配置)
openclaw cron add --schedule "0 */12 * * *" --command "gateway restart"

官方已知此问题(#69628),正在规划 session 懒加载和自动 TTL 清理功能。

常见问题

Q: 删除 session 文件会丢失对话历史吗?

A: 会丢失已完成 subagent session 的历史记录。主 agent session 一般不在批量删除范围内(注意过滤)。如果 session ID 还在使用中,请勿删除对应文件。

Q: 如何判断 gateway 是否命中此内存问题?

A: 运行 ps aux | grep openclaw 观察 RSS 列。若超过 1GB 且在持续增长,同时 ~/.openclaw/sessions/ 下有大量文件,则是此问题。