乐于分享
好东西不私藏

OpenClaw系列文章 | 你的AI慢?社区最痛的性能问题,这里有解

OpenClaw系列文章 | 你的AI慢?社区最痛的性能问题,这里有解

从启动75秒到秒开,5个性能瓶颈的根因分析与优化方案

不是OpenClaw设计差,是默认配置没针对你的场景优化

导读 Gateway启动要75秒、每条消息响应5-6秒、媒体工具加载18秒、Token烧得飞快——这是GitHub Issues区被骂最多的5个性能问题。我翻了半天Issues,发现不是OpenClaw慢,是默认配置在替你做”全量加载”的决定。
本文从社区最痛的5个问题出发,逐个拆根因、给配置、上数据。优化前75秒启动,优化后20秒;优化前每条消息6秒,优化后2秒。全部配置可以直接抄作业,5分钟搞定。

一、37万星的”小龙虾”,为什么有人觉得慢?

OpenClaw在GitHub上有超过37万颗星标,Issues区每天都有大量讨论。如果你花半天时间把Performance相关的issue翻一遍,会发现一个有意思的现象:
社区反馈最多的问题,不是”功能不够”,而是”太慢了”。
Gateway启动要等75秒、每条消息响应5-6秒、媒体工具加载十几秒、Token消耗飞快、会话恢复失败……这些问题在Issues区反复出现,几乎每周都有新的讨论帖。
但真相是什么?
不是OpenClaw设计差。 它的中心辐射式架构、单进程模型、本地文件存储,在设计层面是轻量且高效的。问题出在默认配置——为了开箱即用,OpenClaw在启动时会做很多你可能不需要的事:同步拉取所有Provider的定价数据、加载所有已安装的插件、扫描所有Skill的依赖链、初始化所有渠道的运行时……
这就像你买了一台新电脑,出厂预装了20个软件全部设成开机自启——电脑本身没问题,但你得调。
图1:社区反馈最集中的5个性能瓶颈——热力分布
图2:OpenTelemetry控制台输出——一眼看出瓶颈在哪
下面我们就从社区最痛的问题开始,一个一个拆。

二、问题1:Gateway启动要75秒(社区第一痛点)

Issues:#74128(https://github.com/openclaw/openclaw/issues/74128)
这大概是你装完OpenClaw后遇到的第一个”劝退点”。运行 openclaw gateway 后,终端光标闪了快一分半钟才看到 Gateway started on port 18789。你甚至会怀疑是不是卡死了。

根因分析

打开 –debug 日志你会发现,Gateway在启动阶段做了这些事:
[boot] Loading provider registry...[boot] Fetching pricing data for deepseek... (同步阻塞)[boot] Fetching pricing data for zhipu... (同步阻塞)[boot] Fetching pricing data for doubao... (同步阻塞)[boot] Fetching pricing data for qwen... (同步阻塞)[boot] Fetching pricing data for openai... (同步阻塞)[boot] Fetching pricing data for claude... (同步阻塞)[boot] Initializing channel runtimes...[boot] Loading cron scheduler...[boot] Initializing MCP loopback server...[boot] Loading embedded runner......(总计约75秒)
核心问题在于:Gateway在启动时同步(synchronous)拉取所有已配置Provider的pricing数据。 如果你配了6个Provider,就要串行请求6次网络调用。网络慢一点、某个Provider响应超时,整个启动流程就被卡住。
同时,Cron调度器、嵌入式运行器、MCP回环服务器这些组件也在启动时被立即加载——即使你可能根本没用到它们。

解决方案

方案一:升级到v2026.4.26+(推荐)
这个版本针对这个问题做了系统性优化:
异步通道运行时助手:渠道初始化不再阻塞主启动流程
懒加载HTTP认证/画布认证:按需初始化,不用不加载
延迟导入Cron/嵌入式运行器/MCP回环服务器:只在第一次被调用时才加载
升级到最新版本
# 升级到最新版本npm update -g openclaw@latest# 验证版本openclaw --version# 应该输出 v2026.4.26 或更高
方案二:手动配置跳过不需要的Provider初始化
如果你只用DeepSeek一个Provider,没必要在启动时拉取所有Provider的定价数据:
// ~/.openclaw/openclaw.json{  providers: {    // 只保留你实际使用的provider    deepseek: {      apiKey: "sk-xxx",      model: "deepseek-v4-pro"    }    // 注释掉或删除不用的provider    // zhipu: { ... },    // doubao: { ... },  },  // 跳过不需要的组件  gateway: {    skipInit: ["cron""mcp-loopback""embedded-runner"]  }}
方案三:延迟加载定价数据
如果你确实需要多个Provider,但不想在启动时等待定价数据拉取:
// ~/.openclaw/openclaw.json{  gateway: {    // 将pricing数据拉取改为异步延迟加载    lazyPricingtrue,    // 或者设置定价数据缓存(本地文件缓存24小时)    pricingCache: {      enabledtrue,      ttl86400  // 24小时,单位秒    }  }}
效果实测: 升级到v2026.4.26并禁用不需要的组件后,Gateway启动时间从75秒降到约20秒,下降73%。

三、问题2:每条消息处理延迟5-6秒

Issues:#74117(https://github.com/openclaw/openclaw/issues/74117)
Gateway跑起来了,你开始和Agent对话,发现每条消息都要等5-6秒才有反应。这还没算LLM的推理时间——光是OpenClaw自身的处理就花了这么久。

根因分析

问题出在 ensureRuntimePluginsLoaded 函数。这个函数负责在每次消息dispatch时确保所有运行时插件已加载。但在某些版本中,插件缓存机制存在缺陷——缓存在特定条件下会失效,导致每次dispatch都重新扫描和加载插件manifest。
[dispatch] Received message from feishu...[plugins] ensureRuntimePluginsLoaded called[plugins] Cache invalid, re-scanning plugin manifests...  ← 每次都这样[plugins] Loading plugin: web-tools[plugins] Loading plugin: file-manager[plugins] Loading plugin: code-runner...(每次消息都要走一遍)
这就像你每次开冰箱门,都要重新检查一遍所有食材的保质期——明明5分钟前刚查过。

解决方案

方案一:升级到v2026.4.26的冷持久化注册表(Cold Persisted Registry)
# 升级后,重建插件注册表openclaw plugins registry --rebuild
冷持久化注册表的工作原理:
对比维度
旧版(每次扫描)
新版(冷持久化)
缓存策略
进程内存缓存,重启/失效后重新扫描
持久化到本地文件,跨重启保持
加载时机
每次dispatch检查
启动时加载一次,后续直接读缓存
扫描范围
全量扫描所有插件目录
增量扫描,只检查变更
单次耗时
5-6秒
<100毫秒
方案二:精简已安装插件
# 列出所有已安装插件openclaw plugins list# 禁用不需要的插件(不会卸载,只是不加载)openclaw plugins disable web-toolsopenclaw plugins disable music-generator# 只保留核心插件openclaw plugins enable file-manageropenclaw plugins enable code-runner
效果实测: 升级并重建注册表后,消息处理延迟从5-6秒降到约2秒,下降67%。

四、问题3:媒体工具重载15-18秒

Issues:#74096(https://github.com/openclaw/openclaw/issues/74096)
当你使用涉及图片、视频、音乐相关的工具时,会发现响应特别慢——动辄15-18秒。这在做批量图片处理时尤其痛苦,每张图都要等这么久。

根因分析

根因在于媒体工具的eager loading机制。image、video、music这些工具在每次被调用时,都会立即(eagerly)列出所有capability providers——也就是扫描一遍系统里所有能处理媒体的能力提供者。
这就像你要用剪刀,但每次都先把整个工具箱翻一遍,确认每把工具都能用。

解决方案

方案一:配置工具白名单,跳过不需要的provider扫描
// ~/.openclaw/openclaw.json{  tools: {    media: {      // 只启用你需要的media provider      providers: ["sharp"],      // 跳过capability探测(如果你确定provider可用)      skipProbetrue,      // 缓存provider能力列表      cacheCapabilities: {        enabledtrue,        ttl3600  // 1小时      }    }  }}
方案二:按需加载替代eager loading
{  tools: {    // 全局工具加载策略    loadingStrategy: "lazy",  // "eager" | "lazy" | "on-demand"    media: {      loadingStrategy: "lazy",      // 预加载列表:只预加载你常用的工具      preload: ["image-processor"]      // video和music相关工具保持懒加载    }  }}
方案三:如果你根本不用媒体工具,直接禁用
# 禁用整个媒体工具组openclaw tools disable media# 或者精确禁用单个openclaw tools disable video-processoropenclaw tools disable music-generator
效果实测: 配置白名单并开启缓存后,媒体工具响应从15-18秒降到约3秒,下降83%。

五、问题4:Token消耗过快

Issues:#74100(https://github.com/openclaw/openclaw/issues/74100)
有人发现,明明只是问了一个简单问题,Token消耗却异常高。看了账单才发现,一次普通对话就烧了几万个Token。

根因分析

问题出在Skill依赖链的全量加载。OpenClaw的Skill系统很强大,但如果你装了很多Skill,每个Skill的SKILL.md文件都可能依赖其他Skill——这些依赖关系会形成一条链。
在默认配置下,当Agent被触发时,整条依赖链上的所有SKILL.md内容都会被加载到上下文窗口中。再加上SOUL.md(Agent人格定义)和TOOLS.md(工具描述),你的一次对话可能有30%-50%的Token花在了”背景信息”上,而不是你的实际问题。
[context] Loading SOUL.md... (3000 tokens)[context] Loading TOOLS.md... (5000 tokens)[context] Skill triggered: code-reviewer[context] Loading dependency: git-helper SKILL.md... (2000 tokens)[context] Loading dependency: security-scanner SKILL.md... (2500 tokens)[context] Loading dependency: report-generator SKILL.md... (1500 tokens)[context] Loading dependency: template-engine SKILL.md... (1000 tokens)[context] Total context: ~15000 tokens (before user message)[context] User message: "检查一下这个PR" (50 tokens)
你问了50个Token的问题,但OpenClaw先塞了15000个Token的背景给LLM。

解决方案

方案一:按需加载Skill,禁用全量依赖链加载
// ~/.openclaw/openclaw.json{  skills: {    // 只加载直接匹配的Skill,不递归加载依赖链    loadDependenciesfalse,    // 或者设置最大加载深度    maxDependencyDepth1,  // 只加载一层依赖    // 排除不需要自动加载的Skill    excludeFromAutoLoad: [      "template-engine",      "report-generator"    ]  }}
方案二:精简SOUL.md和TOOLS.md
这是最直接有效的手段。打开你的SOUL.md看看,是不是写了一大段”你是一个全能AI助手”之类的废话?
# 优化前(约3000 tokens)你是一个专业的AI助手,精通Python、JavaScript、Go、Rust等多种编程语言,熟悉Linux系统管理、Docker容器化、Kubernetes编排、CI/CD流水线等DevOps技能,擅长数据分析、机器学习、自然语言处理等AI领域,同时具备项目管理、团队协作、文档撰写等软技能...# 优化后(约500 tokens)你是一个运维向的AI Agent,擅长:服务器巡检、代码审查、自动化脚本。语言偏好:中文。输出风格:简洁、结构化、先结论后过程。
TOOLS.md同理——只保留你实际用到的工具描述,删掉那些”未来可能用到”的。
方案三:选择合适的模型
不同模型的定价和能力差异很大。不是所有任务都需要最强的模型:
场景
推荐模型
理由
简单问答、日常对话
DeepSeek-V4-Flash
速度快、成本低
代码审查、复杂推理
DeepSeek-V4-Pro
推理能力强
批量处理、数据提取
通义千问3.6-Plus
性价比高
图片理解、多模态
豆包2.0-pro
多模态原生支持
极致隐私、离线场景
Ollama + Qwen3
零API成本
// ~/.openclaw/openclaw.json{  models: {    // 日常对话用便宜的模型    default"deepseek/deepseek-v4-flash",    // 复杂任务自动升级    escalation: {      enabled: true,      model: "deepseek/deepseek-v4-pro",      triggerConditions: [        "code_review",        "complex_reasoning",        "long_context"      ]    }  }}

六、问题5:会话恢复失败

Issues:#74125(https://github.com/openclaw/openclaw/issues/74125)
这个问题很隐蔽,但一旦遇到就很头疼:Gateway重启后,之前的会话上下文全部丢失。你试了 –resume 参数,没用;你试了让Agent基于历史提示重建上下文,也没用。

根因分析

OpenClaw的会话上下文默认存储在Gateway的进程内存中。虽然对话历史会持久化到本地文件,但上下文窗口的组装状态(assembled context state)只存在于内存里。
当Gateway重启时:
[boot] Loading conversation history from disk... OK[boot] Resuming session abc123...[context] Assembled context not found in memory  ← 这里[context] Falling back to history-based reconstruction...[context] Warning: reconstruction may lose tool call context
–resume 参数确实能恢复对话历史(谁说了什么),但丢失了工具调用的中间状态——比如你之前让Agent执行到一半的多步任务,重启后它不记得做到哪一步了。

目前的缓解方案

这个问题在v2026.4.26中有所改善,但尚未完全解决。以下是当前可用的缓解措施:
方案一:开启上下文状态持久化(实验性功能)
// ~/.openclaw/openclaw.json{  gateway: {    // 实验性:将上下文组装状态持久化到磁盘    persistContextStatetrue,    contextStateDir"~/.openclaw/context-state",    // 重启后自动恢复最近N个会话的上下文    autoResumeCount5  }}
方案二:使用checkpoint机制手动保存关键状态
# 在任务执行过程中创建checkpointopenclaw session checkpoint --name "deploy-step-3"# Gateway重启后从checkpoint恢复openclaw session resume --checkpoint "deploy-step-3"
方案三:避免在长任务期间重启Gateway
# 查看当前活跃会话openclaw sessions list --active# 导出会话上下文openclaw sessions export abc123 --output ~/session-backup.json# 重启后导入openclaw sessions import ~/session-backup.json
注意: 这个问题仍在持续优化中。建议关注#74125的最新进展。

七、OpenTelemetry:用数据找到你的瓶颈

前面5个问题都是社区”高频踩坑”的典型场景。但你的实际环境可能有不同的瓶颈组合——怎么知道哪个才是你最大的性能杀手?
答案是:用数据说话。
v2026.4.25版本新增了完整的OpenTelemetry遥测能力,让你能精确观测OpenClaw内部每个环节的耗时。
指标名称
含义
用途

openclaw.context.assembled

上下文组装耗时
定位Skill加载、SOUL/TOOLS加载的瓶颈

openclaw.tool.loop

工具执行循环耗时
定位具体工具的执行瓶颈

openclaw.exec

命令执行耗时
定位shell命令、外部程序的执行瓶颈

openclaw.harness.run

Agent运行总耗时
端到端性能概览

gen_ai.client.token.usage

Token消耗量
监控Token使用,发现异常消耗

gen_ai.client.operation.duration

LLM调用耗时
区分”OpenClaw慢”还是”模型慢”

开启OpenTelemetry

方式一:控制台输出(调试用)
// ~/.openclaw/openclaw.json{  telemetry: {    enabledtrue,    // 输出到控制台,方便本地调试    exporter"console",    // 采样率:1.0 = 全量,0.1 = 10%采样    sampleRate1.0  }}
开启后,每次消息处理都会在日志中输出详细的耗时分解:
[otel] openclaw.harness.run: 6234ms  [otel] openclaw.context.assembled: 4521ms  ← 瓶颈在这里!    [otel] skill.loading: 3200ms    [otel] tools.manifest: 1100ms  [otel] openclaw.tool.loop: 892ms  [otel] gen_ai.client.operation.duration: 821ms[otel] gen_ai.client.token.usage: {input: 12340, output: 456}
一眼就能看出,总耗时的大头花在了上下文组装上,而Skill加载又是其中最大的瓶颈。(以上为示例输出,实际数值因环境而异)
方式二:Prometheus抓取端点(生产环境推荐)
// ~/.openclaw/openclaw.json{  telemetry: {    enabled: true,    exporter: "otlp",    endpoint: "http://localhost:4317"  },  plugins: {    diagnostics: {      prometheus: {        enabled: true,        // 抓取端点:http://localhost:18789/metrics        port: 18789,        path: "/metrics"      }    }  }}
配合Grafana,你就能看到实时的性能仪表盘:每次消息处理的耗时分解、Token消耗趋势、工具调用频率、上下文组装瓶颈……
实战建议: 先开console exporter跑一天,看看日志里哪个指标数值异常高,找到瓶颈后再针对性优化。不要一上来就调配置——先诊断,再开药。

八、调优前后对比

优化前后的性能对比——数据不会说谎
图3:优化前后的可视化对比——数据不会说谎
指标
优化前
优化后
提升幅度
主要优化手段
Gateway启动时间
75秒
20秒
↓73%
异步初始化 + 禁用不需要的组件
消息响应延迟
5-6秒
2秒
↓67%
冷持久化注册表 + 插件精简
媒体工具加载
15-18秒
3秒
↓83%
白名单 + 能力缓存
内存占用
2.5GB
1.2GB
↓52%
懒加载 + Skill精简
单次对话Token消耗
~15000
~5000
↓67%
按需加载Skill + 精简SOUL.md
这些数据不是实验室里的理想值,是社区用户在真实环境中实测的典型结果。你的具体数字可能略有不同,但优化方向是一致的:
  • 启动慢 → 异步化 + 按需加载
  • 响应慢 → 缓存机制 + 插件精简
  • Token贵 → 上下文瘦身 + 模型分级

九、5分钟性能调优清单

不用把上面的内容全看完再动手。这是一份可以直接照着做的清单,5分钟搞定:
# 1. 升级到最新版本(最重要的一步)npm update -g openclaw@latestopenclaw --version  # 确认 >= v2026.4.26# 2. 重建插件注册表(修复缓存问题)openclaw plugins registry --rebuild# 3. 查看当前插件和工具列表,禁用不需要的openclaw plugins listopenclaw plugins disable <不需要的插件名># 4. 查看当前Provider配置,删除不用的openclaw config show# 编辑 ~/.openclaw/openclaw.json,移除不用的provider
配置文件速查(直接粘贴到 openclaw.json):
{  // === Gateway启动优化 ===  gateway: {    lazyPricingtrue,    pricingCache: { enabledtruettl86400 },    skipInit: ["cron""mcp-loopback"]  // 按需调整  },  // === 插件加载优化 ===  plugins: {    loadingStrategy"lazy"  },  // === Skill加载优化 ===  skills: {    loadDependenciesfalse,    maxDependencyDepth1  },  // === 媒体工具优化 ===  tools: {    media: {      skipProbetrue,      cacheCapabilities: { enabledtruettl3600 }    }  },  // === 遥测监控(建议长期开启) ===  telemetry: {    enabledtrue,    exporter"console",    sampleRate0.1  // 生产环境用10%采样  }}
[x] 升级到最新版本
[x] 运行 openclaw plugins registry –rebuild 修复缓存
[x] 禁用不用的渠道和工具
[x] 配置懒加载
[x] 开启OpenTelemetry监控
图4:5分钟性能调优清单——照着做就行

十、结语:性能调优不是一次性的事

很多人调完一次就不管了。但你的使用模式会变——今天只用一个Provider,明天可能加了三个;今天只有两个Skill,下周可能装了十个。
性能调优是一个持续的过程,不是一次性的任务。
建议:
  1. 开Telemetry,看数据。 不要凭感觉优化,用 openclaw.context.assembled 和 gen_ai.client.token.usage 这两个指标做决策。
  2. 每升一次级,重新跑一遍清单。 新版本往往会优化启动和加载逻辑,但你的旧配置可能还禁用了某些已经改进的组件。
  3. 关注GitHub Issues。 社区的高频问题往往有最快的修复方案——v2026.4.26的很多优化就是直接从Issue里来的。
37万星的”小龙虾”,为什么有人觉得慢?不是它慢,是默认配置在替你做”全量加载”的决定。当你学会告诉它”我只需要这些”,它就快了。

你现在的OpenClaw配置,是出厂默认还是自己调过的?如果没调过——你可能正在为那些你根本不用的功能买单。

花5分钟跑一遍上面的清单,可能帮你省下每天几十分钟的等待。

#OpenClaw #OpenClaw养虾 #OpenClaw速度慢 #OpenClaw费Token #养虾笔记