OpenClaw 内存优化指南:从源码出发,在 2GB VPS 上也能跑
1. 问题背景
OpenClaw 是一个功能丰富的 AI Agent 框架,但功能丰富意味着默认配置下什么都开着。在 2-4GB 内存的小 VPS 上跑 OpenClaw,经常遇到 OOM(内存不足)导致进程被杀。
本文通过阅读 OpenClaw 最新源码(7814 个 TypeScript 文件),系统梳理了所有可关闭的功能开关和内存优化手段。
2. OpenClaw 内存占用分析
2.1 典型内存分布(4GB VPS 实测)
| 进程 | RSS 内存 | 说明 |
|---|---|---|
| openclaw-gateway | 500-900MB | 主进程,功能越多越大 |
| Chrome(主进程) | ~80MB | 浏览器自动化 |
| Chrome(渲染进程) | ~186MB | 每个标签页一个 |
| Chrome(网络进程) | ~42MB | |
| Chrome(其他) | ~40MB | GPU、crashpad 等 |
| **Chrome 合计** | **~350MB** | 不用浏览器就是纯浪费 |
| Docker daemon | ~60MB | 如果跑了 sandbox |
| **总计** | **900-1300MB** | 单个 gateway 实例 |
2.2 常见陷阱:多个 Gateway 同时运行
一个实际案例中发现 3 个 gateway 进程同时运行:
jay 用户的 gateway → 911MB
root 用户的 gateway #1 → 642MB
root 用户的 gateway #2 → 536MB
合计 → 2.1GB(占 4GB 机器的 55%)
这通常是因为:
- 用不同用户启动过
openclaw gateway start - systemd 服务和手动启动同时存在
- 旧进程没有正确退出
诊断命令:
ps aux | grep openclaw-gateway | grep -v grep
只保留一个:
# 先停掉所有
sudo systemctl stop openclaw-gateway 2>/dev/null
pkill -f openclaw-gateway
# 只启动一个
openclaw gateway start
3. 可关闭的功能开关(源码级梳理)
以下所有配置项均在 ~/.openclaw/openclaw.yaml(或 openclaw.json)中设置。
3.1 Browser(浏览器自动化)— 省 ~350MB 🔥🔥🔥
这是单项收益最大的优化。
OpenClaw 内置了完整的无头 Chrome 浏览器,通过 Playwright + CDP 控制。默认开启后,Chrome 常驻内存。
browser:
enabled: false
关闭后影响:
browser工具不可用(snapshot/screenshot/act 等)web_fetch仍然可用(不依赖浏览器)- 对于大部分纯文本对话场景,完全没影响
什么时候需要开:
- 需要操作 JS 渲染的页面(SPA、React 应用)
- 需要绕过 Cloudflare 等反爬
- 需要截图验证网页渲染
- 需要自动化填表、点击等操作
折中方案: 平时关闭,需要时在 openclaw.yaml 里临时开启并重启 gateway。
Browser 架构简介
Agent
│
▼
browser 工具(7 种 action)
│
▼ HTTP
Browser Control Server
│
▼ CDP (Chrome DevTools Protocol)
Headless Chrome
├── 主进程 (~80MB)
├── 渲染进程 (~186MB/标签)
├── 网络进程 (~42MB)
└── GPU/其他 (~40MB)
两种 Profile:
- openclaw:自管理的无头 Chrome,独立 user-data 目录
- chrome:通过 Browser Relay 扩展接管用户已打开的 Chrome 标签(可利用已登录的 session)
核心技巧:snapshot 返回 accessibility tree(纯文本),比 screenshot(图片+视觉模型)便宜 10 倍以上。
3.2 Canvas Host — 省 ~20-50MB
Canvas 是 OpenClaw 的实时 UI 渲染功能,用于在对话中展示交互式内容。
canvasHost:
enabled: false
关闭后影响: canvas 工具不可用,无法在对话中渲染交互式 UI。
3.3 ACP(Agent Communication Protocol)— 省 ~30-80MB
ACP 是 sub-agent 编排系统,允许 spawn 独立的子 agent 会话。
acp:
enabled: false
关闭后影响:
sessions_spawn工具不可用- 无法创建 sub-agent
- 如果你不用多 agent 协作,可以关
注意: 如果你用了 Codex CLI、Claude Code 等通过 ACP 接入的工具,不能关。
3.4 Memory Search(语义记忆搜索)— 省 ~50-100MB
OpenClaw 可以对 memory 文件建立向量索引,实现语义搜索。
agents:
defaults:
memorySearch:
enabled: false
关闭后影响:
- Agent 不再自动索引和搜索记忆文件
- 仍然可以手动
read文件 - 对于依赖文件读取而非语义搜索的工作流,没有影响
3.5 Web Channel(WebChat)— 省 ~10-20MB
内置的网页聊天界面。
web:
enabled: false
关闭后影响: 无法通过浏览器访问 WebChat。如果只用 Telegram/Discord/微信等渠道,不需要。
3.6 Control UI(管理界面)— 省 ~10-20MB
Gateway 的 Web 管理界面。
gateway:
controlUi:
enabled: false
关闭后影响: 无法通过浏览器访问 Dashboard。CLI 管理不受影响。
3.7 OpenTelemetry(遥测)— 省 ~10-30MB
diagnostics:
enabled: false
otel:
enabled: false
关闭后影响: 无 traces/metrics/logs 导出。除非你接了 Grafana/Jaeger 等监控系统,否则这些数据也没人看。
3.8 Wide-area Discovery(广域发现)— 省 ~5-10MB
mDNS 广域发现,用于跨网络发现其他 OpenClaw 实例。
discovery:
wideArea:
enabled: false
关闭后影响: 无法跨网络发现其他 gateway。本地 mDNS 发现不受影响。
3.9 Link Understanding(链接预处理)— 省处理开销
不是常驻内存,但会在每条消息中自动抓取和摘要 URL。
tools:
links:
enabled: false
关闭后影响: 消息中的 URL 不再自动预处理。Agent 仍可手动用 web_fetch 抓取。
3.10 Compaction Memory Flush(压缩前记忆刷盘)
agents:
defaults:
compaction:
memoryFlush:
enabled: false
关闭后影响: 上下文压缩前不再自动触发记忆保存。如果你的 agent 不依赖自动记忆,可以关。
4. 系统级优化
4.1 添加 Swap(必做)🔥🔥🔥
小内存机器必须有 swap,否则内存用尽直接 OOM kill。
# 创建 2GB swap
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 开机自动挂载
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 调整 swappiness(小内存建议 60-80)
sudo sysctl vm.swappiness=60
echo 'vm.swappiness=60' | sudo tee -a /etc/sysctl.conf
4.2 限制 Node.js 堆内存
OpenClaw 基于 Node.js,默认堆内存上限是物理内存的 ~70%。可以显式限制:
# 在启动命令前设置
export NODE_OPTIONS="--max-old-space-size=512"
openclaw gateway start
建议值:
- 2GB 机器:
--max-old-space-size=384 - 4GB 机器:
--max-old-space-size=512 - 8GB+ 机器:不需要限制
4.3 减少 Cron 任务
每个 cron 任务触发时都会创建一个 agent 会话,消耗内存。
# 查看当前 cron 任务数量
openclaw cron list | wc -l
精简不必要的 cron,合并频率相近的任务。
4.4 使用更小的模型
大模型的上下文窗口意味着更大的 token 缓存。如果内存紧张:
- 用 Sonnet 替代 Opus(更小的默认上下文)
- 减小
contextWindow配置 - 启用更积极的 compaction(更早压缩上下文)
5. 推荐配置模板
5.1 极限省内存(2GB VPS)
browser:
enabled: false
canvasHost:
enabled: false
acp:
enabled: false
web:
enabled: false
gateway:
controlUi:
enabled: false
diagnostics:
enabled: false
discovery:
wideArea:
enabled: false
tools:
links:
enabled: false
agents:
defaults:
memorySearch:
enabled: false
compaction:
memoryFlush:
enabled: false
预期效果: Gateway 内存从 ~900MB 降到 ~300-400MB。
5.2 平衡配置(4GB VPS)
browser:
enabled: false # 需要时临时开
canvasHost:
enabled: false
diagnostics:
enabled: false
discovery:
wideArea:
enabled: false
web:
enabled: false # 只用 Telegram/Discord
预期效果: Gateway 内存 ~500-600MB,保留 ACP 和 Memory Search。
5.3 全功能(8GB+ VPS)
保持默认即可,所有功能都开。建议只关 diagnostics 和 discovery.wideArea。
6. 优化效果汇总
| 优化项 | 预估节省 | 风险 | 推荐度 |
|---|---|---|---|
| 杀多余 gateway 进程 | 500-1200MB | 无 | ⭐⭐⭐⭐⭐ |
| 添加 Swap | 防 OOM | 无 | ⭐⭐⭐⭐⭐ |
| browser.enabled: false | ~350MB | 无法浏览器自动化 | ⭐⭐⭐⭐⭐ |
| canvasHost.enabled: false | ~20-50MB | 无 Canvas UI | ⭐⭐⭐⭐ |
| acp.enabled: false | ~30-80MB | 无 sub-agent | ⭐⭐⭐ |
| memorySearch.enabled: false | ~50-100MB | 无语义记忆搜索 | ⭐⭐⭐ |
| diagnostics.enabled: false | ~10-30MB | 无遥测 | ⭐⭐⭐⭐ |
| web.enabled: false | ~10-20MB | 无 WebChat | ⭐⭐⭐⭐ |
| controlUi.enabled: false | ~10-20MB | 无 Dashboard | ⭐⭐⭐ |
| NODE_OPTIONS 限制堆 | 防止膨胀 | 可能影响大上下文 | ⭐⭐⭐ |
理论最大节省: 从默认 ~1.3GB 降到 ~300MB(不含系统开销)。
7. 诊断命令速查
# 查看总内存使用
free -h
# 按内存排序看进程
ps aux --sort=-%mem | head -15
# 查看 OpenClaw gateway 详细内存
cat /proc/$(pgrep -f openclaw-gateway | head -1)/status | grep -i "vmrss\|vmsize\|threads"
# 查看是否有多个 gateway
pgrep -fa openclaw-gateway
# 查看 Chrome 进程
pgrep -fa chrome | grep -c ""
# 查看 swap 使用
swapon --show
# 查看 Node.js 堆使用(运行时)
node -e "console.log(process.memoryUsage())"
8. 总结
OpenClaw 默认是"全家桶"模式——浏览器、Canvas、ACP、Memory Search、遥测、WebChat 全开。这在 8GB+ 的机器上没问题,但在小 VPS 上会把内存吃光。
核心原则:
1. 先杀多余进程 — 确保只有一个 gateway 在跑
2. 加 Swap — 小内存机器的安全网
3. 关掉不用的功能 — browser 是最大的优化点
4. 按需开启 — 需要浏览器时临时开,用完关掉
OpenClaw 的模块化设计让这些优化成为可能——每个功能都有独立的开关,不是全有或全无。
基于 OpenClaw 源码分析(2026-03-26 最新版本,7814 个 TypeScript 文件)