Skip to content

[性能与架构] 压测 OpenClaw:当并发量达到 1000 时会发生什么?

压测 OpenClaw:当并发量达到 1000 时会发生什么?

Section titled “压测 OpenClaw:当并发量达到 1000 时会发生什么?”

终于到了我们拆解 OpenClaw 架构局限性的终极篇章。

回看第一篇文章,我们夸赞了 Node.js 是如何凭借单线程事件循环和 NPM 生态成为 Agent 开发的风口的。

既然 Node.js 这么牛逼,为什么还有人要重构它?为什么企业在使用 OpenClaw 跑大规模并发任务时会频频遇到崩溃?

今天,我不谈理论,只拿数据说话。我们来进行一场硬核的压力测试:当单台 8 核 16G 的服务器上并发启动 1000 个 OpenClaw Agent 实例去执行混合任务时,到底会发生什么灾难?

  • AWS EC2 c6g.2xlarge (8 vCPU, 16 GiB RAM)
  • OS: Ubuntu 22.04 LTS
  • Node.js: v20.10.0 (开启 --max-old-space-size=8192)

压测脚本逻辑(模拟混合任务)

Section titled “压测脚本逻辑(模拟混合任务)”

启动 1000 个 Agent 实例。每个 Agent 执行一个 10 轮的伪对话,每轮操作包含:

  1. 从 ChromaDB 里读取数据。
  2. 往上下文(Context)中填充约 5KB 的文本历史。
  3. 调用一个需要等待 5 秒的网络查询插件。
  4. 模型执行完毕并解析返回结果。

压测一开始,前 5 秒风平浪静,大家都在等第一次网络 IO 的回调。然而当回调集体涌入事件循环(Event Loop)时,灾难发生了。

灾难一:内存暴涨与 OOM (Out Of Memory)

Section titled “灾难一:内存暴涨与 OOM (Out Of Memory)”

在我们的测试图表上,Node.js 进程的 Resident Set Size (RSS) 在短短一分钟内从 150MB 像坐火箭一样飙升到了 6.8GB

1000 个 Agent,每个分配了各自的 V8 对象树、插件上下文作用域(Scope)、以及越来越长且需要序列化的 JSON 记忆数组。

当内存逼近 7GB 时,V8 引擎的垃圾回收器(GC - Mark-Sweep)开始发疯般地介入。

灾难二:GC 停顿与事件循环阻塞

Section titled “灾难二:GC 停顿与事件循环阻塞”

这是 Node.js 开发者最怕看到的现象。

因为 V8 的 GC 是需要 STW(Stop-The-World,全停顿)的。当它要去扫描 6GB 堆内存中几百万个碎片化对象时,主线程被彻底卡死了。

我们的监控工具显示,Event Loop Lag(事件循环延迟)飙升到了 4.2 秒!

这意味着什么?意味着有数百个回调函数本应该在 5 秒前执行完毕并返回给大模型结果,却硬生生被卡在队列里等了几秒钟。大模型那边以为你超时了,又发起了重试。

重试带来了更多的新对象,更多的新对象触发了更频繁的 GC 停顿,最后整个进程在极度的卡顿中触发了 OOM 崩溃:

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

就算你把内存加到 64G,不用频繁 GC 了。新的瓶颈马上会出现在 CPU 上。

Agent 并不完全是 I/O 密集的。当你使用了 Zod 这种 Schema 验证库,或者在代码里做了复杂的 Markdown 文本解析和正则匹配(这些都是同步的 CPU 密集型操作),Node.js 的单线程就成了最大的噩梦

一个正则回溯如果在单线程里卡了 50 毫秒,1000 个并发就是卡 50 秒。所有的异步 I/O 回调全部排队等着这颗 CPU 核心算完。

3. 为什么优化 OpenClaw 成了玄学?

Section titled “3. 为什么优化 OpenClaw 成了玄学?”

面对这种情况,有经验的架构师马上会说:用 pm2 cluster 模式啊!用 Worker Threads 啊!

但是这些方案在 Agent 场景下极其痛苦:

  • Worker Threads:在 Node.js 中开启多线程极其昂贵。线程间通信只能通过结构化克隆(Structured Clone)传递数据。把 10KB 的上下文数据在线程间来回拷贝的开销,甚至比阻塞还要大。
  • PM2 多进程:你可以起 8 个进程打满 CPU,但问题是,这 8 个进程的内存是不共享的。相当于你需要 8 倍的内存开销(16G 根本不够跑)。并且这也没有解决 V8 基础运行时本身 390MB 开销的问题。

我们得出结论:OpenClaw 并非不够优秀,而是它被底层的 Node.js / V8 运行时锁死了天花板

  • 它的开发门槛极低,NPM 生态极度繁荣,这是它能成为爆款的原因。
  • 但它的内存占用极大、启动慢、并且应对密集并发调度的能力很弱,这也是它在企业级生产环境中频频暴雷的原因。

如果说,我们要打造一个在 1G 内存的边缘设备上都能跑几十个 Agent 的系统,如果我们要实现真正的 Serverless(用完即走,毫秒级冷启动),我们就必须抛弃沉重的 JavaScript 虚拟机。

我们需要一种能够在编译期就保证内存安全、拥有极低的运行时开销、并且原生支持无锁高并发模型的系统级语言。

是的,各位极客们。这就引出了我们专栏接下来的核心主角——一场使用 Rust 语言重构一切的革命:ZeroClaw

请准备好迎接降维打击。咱们下个系列:《[降维打击] ZeroClaw 诞生:Rust 如何重塑 AI Agent 基础设施?》中见!