对比 E2B、Daytona、Modal、Cloudflare、Vercel 五家平台的冷启动速度、每秒计费折算、文件系统持久化、空闲计费与出口策略,基于 2026 年 8 月 27 日信源验证。
每个编写代码的 AI 智能体都需要一个运行的地方。这个"某处"现在已是一个独立的产品类别,市面上至少有十几家供应商、四种互不兼容的计费模式,以及各家营销页面上在无人公开的条件下测得的冷启动时间。
本篇对比统一了度量标准。覆盖大多数团队会纳入短名单的五个平台——E2B、Daytona、Modal Sandboxes、Cloudflare Sandbox SDK 和 Vercel Sandbox——以及在某些方面会改变结论的 Runloop、Fly.io Sprites 和 Northflank。
这个类别的特性矩阵大多没有参考价值。真正改变架构的只有四个特性,其余都是偏好问题:
并发下的冷启动:每当工具调用时创建一个沙盒的 AI 智能体循环,每天要为此付出数千次的代价。
轮次间的文件系统持久化:第二轮能否看到第一轮的 pip install,还是 AI 智能体需要重建其环境?
出口策略:沙盒能否访问互联网,能否关闭此功能,能否在会话中途改变决定?
空闲计费:AI 智能体大部分时间都在等待模型。这些秒钟的费用由谁承担。
各供应商的声称无法相互比较。Daytona 的定价页面宣传沙盒创建在 90 毫秒以下。E2B 通常被引用于约 150 毫秒。Modal 宣传预缓存容器的亚秒级冷启动。这些数字都没有说明并发数、地区、镜像大小,也没有说明计时是从 API 确认还是首次执行命令开始。
最有用的公开数据集是 ComputeSDK 的沙盒排行榜,它是开源的并按计划运行。它测量的是 Time to Interactive(TTI):从 create() 到沙盒内首次成功命令执行的 elapsed time,每个供应商 100 次迭代,从北弗吉尼亚州的一台 4 vCPU 主机并发单次爆发启动。
2026 年 8 月 21 日运行的结果:
| Provider | Median TTI | P95 | P99 | Success rate |
|---|---|---|---|---|
| Vercel Sandbox | 0.67s | 1.04s | 1.12s | 100% |
| Modal | 0.88s | 1.00s | 1.08s | 100% |
| Runloop | 0.89s | 3.27s | 3.50s | 100% |
| E2B | 1.61s | 1.77s | 1.81s | 100% |
| Cloudflare | 5.06s | 6.04s | 6.48s | 100% |
| Daytona | 0.27s | 0.43s | 0.44s | 37% |
那张表里有三件事比排名更重要。
突发不等于顺序测试:Daytona 最快的公开中位数是真实的,在更早一次供应商页面运行中逐个启动时其中位数达到 0.10 秒。但在 8 月的突发运行中它发布了场上最快的中位数,但只完成了 100 次尝试中的 37 次。只有三分之一调用能达到的中位数不是延迟数字,而是容量数字。在任何一个这些平台上重试逻辑都不是可选项。
尾部延迟才是需要针对设计的数字:Runloop 的中位数和 Modal 的中位数相差 10 毫秒。Runloop 的 P95 是 Modal 的 3.3 倍。如果你的 AI 智能体的用户体验预算是一秒,中位数告诉你的信息微乎其微。
Cloudflare 在衡量一个不同的产品:Sandbox SDK 位于 Cloudflare Containers 之上,后者调度一个容器实例并引导镜像。这在架构上比恢复一个预热的 Firecracker 虚拟机要重得多,5 秒的中位数反映了这一点。Cloudflare 自己的 GA 帖子坦承了问题的形态:引导一个沙盒、克隆一个仓库并运行 npm install 大约需要 30 秒,而从备份恢复相同环境大约需要两秒。
值得衡量的任务是你的 AI 智能体实际运行的任务,而不是 echo hello。一个有用的测试框架应该在每个平台上运行相同的任务:安装 pandas、读取 CSV、绘图并返回一张 PNG。分别对四个检查点计时。
# checkpoints: t_create -> t_ready -> t_deps -> t_result
# run 100 iterations sequential, then 100 concurrent, report median/P95/P99
import time, statistics
def one_run(provider):
t0 = time.perf_counter()
sbx = provider.create() # API acknowledged
t1 = time.perf_counter()
sbx.exec("python -c 'print(1)'") # first command returns: TTI
t2 = time.perf_counter()
sbx.exec("pip install pandas matplotlib")
t3 = time.perf_counter()
sbx.exec("python /work/plot.py") # writes /work/out.png
png = sbx.read_file("/work/out.png")
t4 = time.perf_counter()
sbx.kill()
return dict(create=t1-t0, tti=t2-t0, deps=t3-t2, task=t4-t3, bytes=len(png))
分别报告 TTI 和任务时间。供应商优化第一个,读者关心第二个。固定地区、固定镜像,并发布顺序和并发两套数据,因为它们回答的是不同的问题。
截至 2026 年 8 月 27 日的发布费率,换算成统一单位。Modal 按物理核心计费,它定义的物理核心为 2 vCPU,因此展示的是换算后的 vCPU 等量费率。
| Platform | CPU | Memory | 计费基准 | Plan 门槛 |
|---|---|---|---|---|
| E2B | $0.0504 / vCPU-hr | $0.0162 / GiB-hr | 挂钟时间,按秒计费 | Free Hobby;$150/mo Pro |
| Daytona | $0.0504 / vCPU-hr | $0.0162 / GiB-hr | 挂钟时间,按秒计费 | 无;$200 额度 |
| Modal Sandbox | $0.1419 / core-hr (约 $0.0710 / vCPU-hr) | $0.0240 / GiB-hr | max(request, actual),按秒计费 | Free Starter;$250/mo Team |
| Vercel Sandbox | $0.128 / vCPU-hr 仅 active CPU | $0.0212 / GB-hr 预配 | 分开计:CPU active,内存挂钟 | Hobby 配额;Pro 额度 |
| Cloudflare Sandbox | $0.072 / vCPU-hr 仅 active CPU | $0.009 / GiB-hr 预配 | Active CPU + 预配 memory/disk | $5/mo Workers Paid |
| Fly.io Sprites | $0.07 / CPU-hr | $0.04375 / GB-hr | 仅活跃使用;空闲时休眠 | 订阅层级 |
| Runloop | $0.108 / CPU-hr | $0.0252 / GB-hr | 运行状态;暂停仅收存储费 | Free Basic;$250/mo Pro |
| Northflank | $0.01667 / vCPU-hr | $0.00833 / GiB-hr | 已分配资源,按秒计费 | Free Sandbox tier |
两个常被搞错的脚注。
Modal 的沙盒层级大约是其标准 Function 费率的 3 倍($0.00003942 vs $0.0000131 每核心秒),地区选择还要再加 1.5–1.75 倍。沙盒定价不是 Modal 的标牌计算定价。
Daytona 的 GPU 费率被广泛引用为 H100 $3.95/hr。其实时定价页面列出的按需 H100 为 $2.27/hr,H200 为 $2.61/hr。该类别中的第三方对比表在一个季度内就会过时。
费率不等于成本。下面的模型固定了工作负载,并将其套入每个供应商的费率表。
假设:2 vCPU / 4 GiB 沙盒,1,000 次执行,无 Plan 门槛,不含出口流量,默认地区(Vercel iad1、Cloudflare standard-3 at 2 vCPU / 8 GiB / 16 GB disk,因为实例大小是固定的)。
场景 A:短爆发 — 存活 90s,平均 CPU 50%
| Platform | Cost / 1,000 | 构成 |
|---|---|---|
| Northflank | $1.67 | $0.83 CPU + $0.83 memory |
| Cloudflare | $3.70 | $1.80 CPU + $1.80 memory + $0.10 disk |
| E2B / Daytona | $4.14 | $2.52 CPU + $1.62 memory |
| Vercel | $5.32 | $3.20 active CPU + $2.12 memory |
| Modal | $5.95 | $3.55 CPU + $2.40 memory |
| Fly Sprites | $7.88 | $3.50 CPU + $4.38 memory |
| Runloop | $7.92 | $5.40 CPU + $2.52 memory |
场景 B:空闲为主 — 存活 10 min,平均 CPU 5%
这就是真实的 AI 智能体循环的样子。沙盒开着,模型在思考,什么都没跑。
| Platform | Cost / 1,000 | 相对场景 A 的变化 |
|---|---|---|
| Northflank | $11.11 | 6.7x |
| Cloudflare | $13.87 | 3.7x |
| Vercel | $16.27 | 3.1x |
| E2B / Daytona | $27.60 | 6.7x |
| Modal | $39.66 | 6.7x |
| Fly Sprites(保持唤醒) | $52.50 | 6.7x |
| Runloop(保持运行) | $52.80 | 6.7x |
Vercel 从第 4 便宜变成第 3 便宜,其 CPU 行从 $3.20 降到 $2.13,而其他平台的费用线性增长。Cloudflare 的 active CPU 行跌至 $1.20。这就是 active-CPU 计费的整个论点,在这个工作负载上大约值 2 倍。
场景 B + 暂停
在场景 B 中失利的平台可以通过编排层面在轮次间暂停来扳回来。相同工作负载,每次执行唤醒 30s:
| Platform | Cost / 1,000 | 机制 |
|---|---|---|
| E2B(auto-pause) | 约 $2.16 | 暂停每 GiB RAM 约花 4s,恢复约 1s(文档) |
| Fly Sprites | $2.62 | 空闲监视器在几秒内使 sprite 休眠 |
| Runloop | $2.64 | 暂停停止计算计费;存储继续计费 |
E2B 的数字包含一个 4 GiB 沙盒约 17s 的暂停和恢复开销。这个开销是决定性变量:只有当轮次间的间隙明显长于暂停本身时,暂停才是经济的。
Fly 的空闲检测器对什么算作活动有具体定义:一个进行中的 HTTP 或 API 请求、一个会话的 stdout 输出、一个开放的 TCP 连接,或一个活动任务(sprites.dev)。一个在等待时保持连接开放的 AI 智能体就是一个在计费的 AI 智能体。将输出重定向到文件不计入活动,这是一个真正的杠杆。
这是各平台分歧最大的地方,也是错误的选择会表现为每轮都重新构建 node_modules 的地方。
| Platform | Default | on stop/idle | Memory stateMechanism |
|---|---|---|---|
| E2B | onTimeout defaults to kill | Pause preserves RAM and running processes | pause() / connect(), paused boxes kept indefinitely |
| Daytona | Persistent by default; auto-stop 15 min (containers), auto-pause 60 min (VMs) | VM sandboxes only, via pause/resume | Stop, archive, pause, fork, volumes |
| Modal | Terminated at timeout (default 5 min, max 24h) | Memory snapshots, 7-day expiry | Filesystem snapshots are Images, 30-day default TTL |
| Cloudflare | Sleeps after 10 min; disk resets to image | No | createBackup() / restoreBackup(), R2 mounts, snapshots rolling out |
| Vercel | Persistent sandboxes snapshot the filesystem on stop | No | Snapshots, 30-day default expiry, $0.08/GB-mo |
| Runloop | Suspend preserves state | Yes, via suspend/resume | Suspend/resume and snapshot branching; Pro plan only |
| Fly Sprites | 100 GB root filesystem persists indefinitely | Checkpoint/restore | Object-storage-backed disk, no container image |
三个细节值得深入理解:
E2B 的默认行为会杀掉你的工作:onTimeout 默认是 kill,除非你在创建时设置 lifecycle: { onTimeout: 'pause' }。被杀状态是终态,文档中没有描述终止前的关闭信号。请将未保存的工作视为已丢失。
Cloudflare 的磁盘在休眠后是临时的:容器文档明确指出,休眠实例重启后磁盘会从镜像重新初始化。当下可以通过备份/恢复到 R2 实现持久化;在 GA 时宣布的自动 persistAcrossSessions 磁盘快照在撰写本文时仍在逐步推出。
Daytona 按沙箱类别区分持久化:容器沙箱在 stop/start 之间保留文件系统,但不支持 pause,所以每次内存都会被清除。Linux VM 沙箱两者都支持。GPU 沙箱是临时的,stop 时会被删除;结果必须写入卷。
本对比中的所有平台现在都可以运行无互联网访问的沙箱。差异在于优先级、粒度,以及策略是否可以无需重启即可更改。
| Platform | Default | Block all | Allowlist | Change at runtime |
|---|---|---|---|---|
| E2B | Open egress | allowInternetAccess: false | Domains, IPs, CIDRs; wildcards | Yes, updateNetwork() replaces the whole policy |
| Daytona | Tier-dependent | networkBlockAll | domainAllowList (20 max), networkAllowList (10 CIDRs, IPv4 only) | Yes, Tier 3/4 only |
| Modal | Open egress, no inbound | block_network=True | outbound_cidr_allowlist, outbound_domain_allowlist (beta) | Alpha, and only if allowlists were set at create |
| Cloudflare | Open egress | enableInternet = false | allowedHosts / deniedHosts, glob patterns | Yes, handlers and host rules apply live |
| Vercel | allow-all | deny-all, including DNS | Domains via SNI, plus IP/CIDR fallback | Yes, without restarting |
| Runloop | Network policies per devbox | Yes | Yes | Documented per devbox |
E2B 和 Vercel 以相反的方向处理冲突。在 E2B 中,允许规则优先于拒绝规则:同时出现在两个列表中的 IP 会被允许。在 Vercel Sandbox 中,拒绝范围优先于允许范围。如果不重写,将策略从一个平台移植到另一个平台并不具有相同的含义。
E2B 文档指出,从沙箱内部看,被阻止的 TCP 连接可能看起来是成功的。防火墙在接受连接后才决定目标是否被允许,因此套接字会打开但没有数据包到达。请通过应用级别的响应(HTTP 状态码、TLS 握手)来验证出口,而不是通过成功的 connect() 来验证。任何通过检查连接错误来断言"网络被阻止"的测试套件,都会在未阻止的沙箱上通过。
阻止出口是基础配置。让沙箱发出认证调用而从不持有凭证,这不是基础功能能做到的。
Cloudflare 在 Workers 运行时中运行出口处理器,在沙箱外部,有权访问 Workers bindings。沙箱发出普通请求,处理器附加密钥,ctx.containerId 按实例限定凭证范围(文档)。Vercel 在出口处代理凭证,匹配器按路径、方法、查询字符串或 headers 限定范围,并声明防火墙在 microVM 外部的主机上运行,沙箱代码无法禁用它(Vercel)。E2B 在公共测试版中提供每主机请求转换,在出口代理处注入 headers,包括沙箱永远看不到的 workload-identity tokens。Runloop 提供具有不透明令牌注入的凭证网关。
对于处理不受信任输入的 AI 智能体来说,这个设计比冷启动更重要。通过 GitHub token 发出 prompt 注入的 AI 智能体,与只能通过持有 token 的代理访问 GitHub 的 AI 智能体,是不同级别的事故。
| Platform | Isolation | Max session | Concurrency | GPU in sandbox | Self-host / BYOC |
|---|---|---|---|---|---|
| E2B | Firecracker microVM | 1h Hobby, 24h Pro; resets after pause | 20 Hobby, 100 Pro, up to 1,100 | No | Apache-2.0 infra repo, Terraform + Nomad + Consul |
| Daytona | Containers, plus VM and Windows classes | Configurable, wall-clock TTL optional | Tier-based | Yes (ephemeral) | BYOC, enterprise |
| Modal | gVisor | 5 min default, 24h max | 100 Starter, 5,000 Team | Yes, full rate card | No |
| Cloudflare | Containers on Workers | Sleeps at 10 min idle, keepAlive available | 15,000 lite, 1,000+ standard | -2 | No |
| Vercel | Firecracker microVM | 45 min Hobby, 24h Pro | 10 Hobby, 10,000 Pro | No | AWS BYOC in private beta |
| Runloop | microVM | Suspend/resume | 10,000 demonstrated | No | VPC deployment |
| Fly Sprites | Firecracker microVM | Persistent | Subscription tiers | No | No |
| Northflank | microVM (Kata, Firecracker, gVisor) | Persistent or ephemeral | Platform-level | Yes | Self-serve BYOC |
如果你的 AI 智能体花在等待模型上的时间多于计算时间,且你想要本组中最便宜的突发冷启动,选 Vercel Sandbox。Active-CPU 计费在空闲密集型循环上大约节省 2 倍;带凭证代理的出口防火墙现在每个计划都有;0.67s 中位数配 1.12s P99 是 8 月测试中最紧凑的分布。
如果你需要对抗性代码的每会话内核隔离、跨轮次的内存状态持久化,或自托管路径,选 E2B。第一天就设置 onTimeout: 'pause'。一旦超过 20 个并发沙箱或 1 小时会话,就准备好迎接 $150/月的 Pro 最低消费。
如果持久化就是产品本身,且你能消化容量波动,选 Daytona。stop/archive/pause/fork 生命周期是同类中最成熟的;在内存完整的情况下 fork 活 VM 在其他地方没有可类比的干净方案;计算费率与 E2B 持平,没有订阅最低消费。
如果 AI 智能体的任何部分涉及到 GPU,选 Modal。它是这里唯一在沙箱内有完整 GPU 费率表的平台,从 T4 到 B300。承诺之前先核算 3 倍沙箱乘数和区域乘数。
如果你的应用已经部署在 Workers 上,且出口安全模型比冷启动更重要,选 Cloudflare Sandbox。在沙箱外部运行、可访问 bindings 的可编程出口处理器是真正的差异化特性。五秒突发中位数不是优势,所以每个会话保持沙箱开放,而不是每次工具调用创建一个;并做好休眠时磁盘重置的准备。
如果你是构建编码 AI 智能体,且需要在同一平台上进行 SWE-Bench 风格的评估,选 Runloop。注意,修复其空闲经济的挂起/恢复功能,被锁定在 $250/月的 Pro 计划之后。
如果你想要每个用户一台持久计算机而不是每次调用一台可任意处置的计算机,选 Fly Sprites;如果需要最低公开费率、GPU 支持和一站式 self-serve BYOC,选 Northflank。
实测突发冷启动在提供商之间相差 7 倍:Vercel 0.67s、Modal 0.88s、E2B 1.61s、Cloudflare 5.06s。
厂商的"低于 90ms"和"约 150ms"声明描述的是顺序创建,不是 AI 智能体实际产生的并发突发。
计费模型优于标称费率:最便宜的提供商取决于你的沙箱空闲多长时间。
只有 Vercel 和 Cloudflare 按实际使用量计 CPU;E2B、Daytona、Modal 和 Runloop 在沙箱存活期间按挂钟时间计费。
本文中的每个平台现在都可以默认拒绝出口,但允许/拒绝优先级和 TCP 失败行为存在差异,会以破坏假设的方式出现问题。
来源:E2B pricing, E2B persistence, E2B internet access, Daytona pricing, Daytona persistence, Daytona network limits, Daytona billing, Modal pricing, Modal sandbox networking, Modal sandbox resources, Modal sandbox snapshots, Cloudflare Containers pricing, Cloudflare outbound traffic, Cloudflare Sandboxes GA, Vercel Sandbox pricing, Vercel Sandbox firewall, Runloop pricing, Sprites and Northflank pricing
Michal Sutter 是拥有帕多瓦大学数据科学硕士学位的数据科学专业人士。凭借统计学分析、机器学习和数据工程的坚实基础,Michal 擅长将复杂数据集转化为可操作的洞察。