AI 博客

E2B vs Daytona vs Modal vs Cloudflare Sandbox:照计费形态来选

一个服务二十步智能体的沙箱,大约七分之六的寿命都在空转,等模型思考完。所以冷启动毫秒数与每 vCPU 小时单价——每份对比都拿来打头阵的两个数字——恰恰是最不要紧的两个。真正决定账单的是空闲时段计不计费,真正决定爆炸半径的是出站网络的默认设置。

作者 智能体 AI 维基 25 分钟读完

每一份沙箱对比都以冷启动毫秒数开场,而在智能体循环里,这恰恰是最不要紧的那个数字。一个服务二十步智能体的沙箱,大约七分之六的寿命都在空转,等一个模型思考完——所以决定你账单的不是它启动得多快,而是等待时段收不收费;决定你爆炸半径的,是它的出站网络默认是什么。这两个答案在 E2B、Daytona、Modal 与 Cloudflare 之间差别悬殊,而它们都不出现在跑分表里。

一眼概览

四个都在运行智能体所写的不可信代码的平台,建立在四种确实不同的隔离原语之上。其余一切都从这个原语推导出来。

平台隔离原语计费形态出站默认
E2B Firecracker 微虚拟机——每个沙箱一套独立的 guest 内核。 沙箱存活期间按秒计费。 敞开;可配允许/拒绝清单,支持域名。
Daytona 由预热快照启动的容器。 存活期间按秒计费;靠自动停止与自动归档结束。 由一层有文档的网络限制管理;姿态随档位而异。
Modal gVisor——一个拦截系统调用的用户态内核。 按实际计算时长按秒计费;空闲不计费。 敞开;每个沙箱可设 block_networkoutbound_cidr_allowlist
Cloudflare Sandbox 挂在 Worker 上、跑在边缘的容器。 按容器运行时长;sleepAfter 结束它(默认 10 分钟)。 enableInternet 默认开启;前面的 Worker 可以做中介。
Where each sandbox platform leans hardest A matrix of E2B, Daytona, Modal and Cloudflare Sandbox against five axes: isolation boundary, whether idle time is billed, session lifetime, egress control granularity and GPU support. No platform leads on every axis, so the choice depends on workload shape rather than overall quality. Five axes, four different bets Isolationboundary Idle timebilled? Sessionlifetime Egresscontrol GPUworkloads E2B Guest kernel While alive Hours IP · CIDR · domain CPU only Daytona Container Alive + auto-stop Until stopped Tier-dependent CPU only Modal gVisor Active only Until stopped Block or CIDR Supported Cloudflare Edge container Until it sleeps 10 min default On/off + Worker CPU only Strongest here Workable, with configuration Weakest here Column two is the one that decides an agent workload's bill, and it is the one no benchmark reports.
没有哪一列在每一行上都胜出,所以这个选择取决于工作负载的形状,而不是整体优劣。

一点背景值得一提:2026 年 4 月 OpenAI 发布 Agents SDK v2 时,原生接入了七家沙箱厂商——Blaxel、Cloudflare、Daytona、E2B、Modal、Runloop 与 Vercel。换厂商如今接近一次配置改动,这让"照错误的维度去选"变得很容易,也让"事后发现"变得很贵。

空闲问题,附带算术

Two billing shapes over the same agent loop A multi-step agent loop is drawn as alternating spans: long model-inference waits separated by short code executions. Under a bill-while-alive model the whole 280-second lifetime is charged. Under a bill-while-active model only the 40 seconds of execution are charged. The ratio is set by inference latency, which rises as reasoning effort rises. Same work, same wall clock, two bills One agent task — 6 of 20 steps shown. Each step: ~12 s of model inference, ~2 s of execution. The loop waiting · running Billed while alive the sandbox existed for all of it 280 s Billed while active 40 s The gap is inference latency — a variable you do not control, and one that grows as reasoning effort goes up. Per-vCPU-hour rates are not comparable until you normalise them by which of these two rules applies.
同样的工作、同样的墙钟时间,两份账单。差额就是那段等待。

设想一个做数据分析的智能体:二十步,每一步是大约十二秒的模型调用,接着约两秒的代码执行。沙箱必须在整个过程中一直存在,因为文件系统与 Python 内核要在步与步之间携带状态。

那就是 280 秒的沙箱寿命里包着 40 秒的计算。在"存活即计费"的模型下你付 280 秒;在"活跃才计费"的模型下你付 40 秒。比值是七比一,而它由推理延迟决定——一个你无法掌控、并且会随着推理强度上升而增大的变量。冷启动跑分对它没有任何预测力。

随之有两个后果。第一,除非按计费形态做归一,否则每 vCPU 小时单价作为比较依据几乎毫无意义;一个每活跃小时明显更贵的平台,在智能体负载上可能便宜得多。第二,空闲占比会随着你模型质量的提升而上升,因为更好的模型思考得更久。用一个又快又小的模型做基准、却拿一个推理模型上线的团队,会看到沙箱这条开销朝着表格没有预测到的方向移动。

反方意见是真实的:一个"存活即计费"的平台,配上很短的自动停止间隔与很快的恢复,能逼近同样的效果,而 Daytona 的自动停止与自动归档控制正是为此存在。但那是一项你必须针对每个负载调对的配置,而它对抗的是一个会花你钱的默认值;Modal 那种模型本身就是默认。默认值决定了大多数团队实际上付多少。

隔离:对同一个威胁的四种不同回答

Four isolation stacks for agent code execution Agent-written code sits at the top of four different stacks over the same host kernel. E2B places a guest kernel inside a Firecracker microVM between them. Modal interposes gVisor, a user-space kernel that filters syscalls before they reach the host. Daytona runs a container from a pre-warmed snapshot over namespaces and cgroups, sharing the host kernel. Cloudflare runs a container attached to a Worker at the edge. E2B Modal Daytona Cloudflare Agent-written code untrusted, always Agent-written code untrusted, always Agent-written code untrusted, always Agent-written code untrusted, always Guest kernel its own, per sandbox gVisor user-space kernel Container namespaces + cgroups Container attached to a Worker Firecracker microVM hypervisor boundary Syscall filtering host kernel reached only through gVisor Pre-warmed snapshot fastest start; no kernel boundary Workers runtime placed at the edge, next to the request Host kernel · host hardware shared by every tenant on the machine Distance from the host kernel — top box is the workload, bottom bar is what everyone shares The boundary you can put in a security questionnaire is the one with its own kernel. For a single-tenant agent running your own code on your own data, a container is usually enough.
智能体的代码离宿主内核有多远——以及每一步距离要付什么代价。

威胁是代码,不是用户

四个平台都假定工作负载是敌意的,这是对的:智能体所写的代码即便出自你自己的智能体,也依然是不可信代码,因为它的行为取决于一些你并不掌控的输入——检索到的文档、issue 评论、网页。差别在于这些代码能够到宿主内核的多少。

E2B 的 Firecracker 微虚拟机给每个沙箱一套自己的 guest 内核,于是内核漏洞要逃逸的是一层 hypervisor 而不是一组命名空间。Modal 的 gVisor 位于中间:一个用户态内核在系统调用抵达宿主之前把它拦下来,这个攻击面比共享内核小得多,又比硬件虚拟化大一些——而且有个实用的好处,它让 GPU 直通保持简单,这一点是微虚拟机做起来别扭的。Daytona 由快照启动的容器启动最快、也最常规,这就是它做的取舍。Cloudflare 的容器继承了 Workers 平台的边界,并且独一份地把沙箱放在了紧挨请求的边缘。

差别真正咬人的地方

对大多数智能体负载来说,隔离层级并不是决定性因素,把这一点讲出来比装作不是更有用。如果你的智能体在自己的账户里,拿自己的数据跑自己生成的 Python,容器就够了。层级开始要紧,是当你在跑别人的智能体——一个多租户产品,一个客户的提示词注入不该够到另一个客户的执行——而在那里,微虚拟机边界是你能写进安全问卷、不必附脚注的那一条。

更大的现实约束是 GPU。如果被沙箱包住的工作会碰到模型——跑一遍嵌入、执行生成出来的 CUDA、驱动一个强化学习环境——Modal 是这组里为此而建的平台。其余几家是 CPU 形态的,而这是一个架构事实,不是路线图上的缺口。

存活与持久化:步与步之间什么活下来

智能体循环需要状态跨越模型调用而存续,而每个平台表达它的方式都不同。这是选错了最可能逼你重写的一个维度。

会话长度。E2B 在付费档上支持以小时计的长寿沙箱,适合一个整下午都在啃同一个问题的研究型智能体。Cloudflare 的沙箱是为更短的交互塑形的,并在一段不活跃窗口后休眠——默认十分钟,可配——这适合一个请求作用域的代码解释器,不适合一个要想一小时的任务。Modal 与 Daytona 都允许沙箱一直活到你结束它,以空闲超时与自动停止间隔作为安全网。

文件系统状态。Daytona 的快照模型在这里最成熟:一次对文件系统、软件包与设置的时间点捕获,任意数量的新沙箱都能从它启动,外加从 Dockerfile 声明式地构建镜像。如果你的智能体需要一个已经克隆好的仓库和已经装好的依赖,这就是"每次运行五分钟的税"与"热启动"之间的差别——而它比那个通常与之并列引用的冷启动数字重要得多。

恢复语义。要向每个平台问的问题是:一个沙箱停下再启动之后会怎样——文件系统回来吗,进程树回来吗,一条打开的网络连接回来吗。答案各不相同,而一个假定"进程能跨越恢复而存活"的智能体架构,会以一种看起来像模型回归的方式失败。按更弱的保证来设计——从文件系统重建——平台选择就不再约束你了。

出站:真正要紧的那个控制,与那个错误的默认

这是没人跑分、却决定一次成功的提示词注入能干什么的维度。如果智能体的沙箱能够到任意主机,那么任何抵达智能体的指令——来自被抓取的网页、某个依赖的安装后脚本、一条 issue 评论——就为沙箱读得到的一切准备好了一条出去的通道。

四个平台如今都提供了控制。Modal 接受每沙箱的 block_networkoutbound_cidr_allowlist。E2B 支持覆盖 IP、CIDR 段与域名的允许与拒绝清单,域名在 80 端口靠 Host 头、在 443 端口靠 SNI 解析,并且允许在不重启的情况下替换一个运行中沙箱的规则——这是四者里最贴合智能体形态的设计,因为它让你能为某一步放宽访问、随后再收紧。Cloudflare 把 enableInternet 做成一个开关,而更有意思的是,它让容器前面的 Worker 去中介出站请求,于是策略可以是代码而不是配置。Daytona 有一层有文档的网络限制,其默认姿态随账户档位而异——去查你自己的,别想当然。

共同的问题是:宽松那一档在所有地方都是默认。用 SDK 的最简构造函数创建出来的沙箱能上网,而那些让厂商可互换的框架集成层,恰恰是这项配置最容易被漏掉不设的地方。默认拒绝出站、只留一个小白名单——你的包仓库、你的代码托管、这项任务需要的那一个 API——是整份对比里杠杆最高的控制,而在四个平台里的三个上,它是构造时的一行。

凭据那一半是同一个故事。一个握着长期有效、范围很宽 API 密钥的沙箱,已经输掉了这场争论,因为出站控制救不了你——那把密钥本来就是智能体有权使用的。按次注入的、范围窄、寿命短的凭据,是出站白名单的配对项;只有其中一个,另一个的洞就照样开着。

什么时候选哪个

情形因为
模型延迟很重的长智能体循环 Modal 空闲不计费,于是沙箱七分之六用来等待的寿命是免费的。
跑别人智能体的多租户产品 E2B 每沙箱一套 guest 内核是你能在安全评审里守住的边界,而且它的出站规则是这里最细的。
环境准备很重——仓库、依赖、fixture Daytona 快照与声明式镜像让热启动成为常态,而不是一项优化。
在既有 Workers 应用里做请求作用域的代码执行 Cloudflare 沙箱就住在请求旁边,而出站策略可以是 Worker 代码而不是配置。
任何会碰到 GPU 的东西 Modal gVisor 让 GPU 访问保持可行;这组里的其他几家是 CPU 形态的。
极高频、极短的执行 Daytona 这是冷启动数字真正占主导的唯一情形,而它最快。

对以上一切的一句提醒:费率与限制按季度变动,本对比里引用的每一个数字,在你据以建立成本模型之前都应当回到厂商自己的文档里重新核对。计费形态——存活 vs 活跃——是架构性的,变得比挂在它上面的费率慢得多,而这正是它值得作为选择依据的原因。

常见问题

沙箱冷启动对智能体重要吗?

比那些对比所暗示的重要性小得多。如果你为每次工具调用新建一个沙箱,它就重要,而那通常是错误的架构——智能体需要的是步与步之间的状态。对极高频的短执行它非常重要,但那是另一种负载。对一个正常的多步智能体来说,环境准备时间与空闲计费都比它更占主导。

对智能体代码来说,微虚拟机真的比容器更安全吗?

是的,在"内核漏洞要跨越的是 hypervisor 而不是命名空间"这个意义上。这个差别值不值得花钱,取决于你的租户结构:在自己的数据上跑自己的智能体,容器通常够用;把不可信的第三方智能体并排跑起来,更强的边界才是让这个答案对别人也站得住的东西。

最重要的那一项沙箱设置是什么?

出站网络策略。默认拒绝加一个窄白名单,框住了一次成功的提示词注入能外泄什么,而且它是模型已经被说服与攻击者合作之后唯一还起作用的控制。这里的每一个平台默认都是宽松的。

以后还能换厂商吗?

执行 API 已接近商品化,而框架层的集成让换厂商近乎不费力。不能平移的是你建立在厂商专有原语上的东西——快照、恢复语义、边缘部署——外加你的成本模型,它会在计费形态变化时反转。

我一定需要托管沙箱吗?

不一定。对一个单租户的内部智能体来说,自己跑一个配了严格网络策略的容器是正当答案,而且更便宜。你买的是供给速度、快照管理,以及一个比你自己造得出来的更强的隔离边界;如果这三样都不构成约束,自托管完全可以。

GPU 支持会改变隔离上的取舍吗?

会。硬件虚拟化让 GPU 直通变得别扭,这正是这组里 GPU 故事最好的平台,同时也是那个用用户态内核而非微虚拟机的平台的原因。如果你既要最强隔离又要 GPU,预期得在其中一头付出代价。

延伸阅读

本站相关:

项目来源: