手贱开了 OpenClaw 的 self-improvement 技能。理论上是让 Agent 分析自己的历史执行记录,找不足然后自动优化自己的 Skill 定义。
结果呢?直接进了无限自我修改循环,内存吃满,Docker 宿主机跟着一起挂了。
翻车时间线
| 时间 | 发生了什么 |
|---|---|
| 14:22 | 开启 self-improvement |
| 14:25 | Agent 分析了 50 条历史日志,找出 12 个"优化点" |
| 14:27 | 开始重写自己的 Skill 文件 |
| 14:31 | 觉得改完的还不够好,接着改 |
| 14:35 | 死循环了,每 90 秒重写一次 |
| 14:41 | 内存飙到 3.8G(上限 4G) |
| 14:42 | OOM Killer 出手,Docker 一起挂了 |
| 14:45 | IPMI 硬重启 |
根本原因
这个 Skill 没做递归保护。改完触发评估 → 评估觉得不够好 → 再改 → 无限循环。
每次迭代还保留上一次的完整上下文,大概 200KB/次,三十分钟就把 4G 内存吃完了。
恢复方法
# 1. 强制停掉容器
docker kill openclaw
# 2. 删掉损坏的 skill 文件
docker run --rm -v openclaw_data:/data alpine sh -c "rm -rf /data/skills/self-improve*"
# 3. 清上下文缓存
docker run --rm -v openclaw_data:/data alpine sh -c "rm -rf /data/cache/context/*"
# 4. 加内存限制重启
docker run -d --name openclaw --memory=4g --memory-swap=4g -v openclaw_data:/data openclaw/openclaw:latest
血泪教训
- 一定要设 Docker 内存限制,不然 OOM 会把宿主机一起拖下水
- 自我提升这种实验性功能,千万别在生产环境开
- 说白了 Skill 就是渐进式披露的提示词,别想太多