Agent 评测沙箱:AgentENV 如何用 Firecracker + overlaybd + ublk 把环境启动压到 50ms
大规模跑 agent 评测和 RL 训练时沙箱是最先卡住的基础设施容器隔离不够agent 代码带 root 权限跑内核共享面太大KVM 整机启动秒级太慢镜像全量预推到几百台机器上直接打爆带宽和磁盘。MoonshotAI 在 2026-07 开源的 AgentENVkvcache-ai/AgentENVRust Go三周 3.2K star给的答案是把三件事拧在一起Firecracker microVM 做隔离、overlaybd 做镜像/快照懒加载、快照 fork 做环境复用。它是 Kimi K3 agentic RL 训练背后的环境平台生产环境跑过 150 万镜像单机内存超卖 9.6x。这篇文章从源码拆它的控制面、存储子系统和快照流水线再落到部署配置和测试团队的接入建议。控制面axum OpenAPI 生成路由外加一个手写反向代理单节点上 AgentENV 是三层HTTP APIaxum→ orchestrator生命周期管理→ Firecracker VM。API 路由大部分由 OpenAPI 生成agentenv_http_servercrate手写部分只有/proxy/*反向代理——沙箱内 agent 起的 HTTP 服务通过它暴露给外部代理按 sandbox_id 分类路由。Prometheus 指标挂在/metrics。多节点控制面在services/里是独立的 Go 模块两个组件GatewayHTTP 反向代理按 sandbox ID 路由到对应节点SchedulergRPC 服务负责节点选择、沙箱与节点的绑定、心跳、P2P 对端发现Scheduler 支持 static配置里的节点列表和 kuberneteswatch headless Service 的 EndpointSlices两种发现模式。K8s 部署模型值得抄gateway 是 Deployment ClusterIPscheduler 单副本agentenv-node是带/dev/kvm的 privileged DaemonSet——每个宿主机一个节点实例hostPath 挂本地缓存。生命周期LaunchPlan 三态 不透明的后端状态orchestrator 用LaunchPlan表达沙箱的创建来源pub enum CreateLaunchSource { Snapshot { snapshot: BoxRunnableSnapshot }, // 从已提交快照冷启 Fresh { build_spec: BoxFreshSandboxBuildSpec }, // 从模板现构建 } pub enum LaunchPlan { Create(BoxCreateLaunchPlan), // 过渡态 Creating Resume(BoxResumeLaunchPlan), // 过渡态 Resuming从 PausedSandboxState 恢复 }orchestrator 对沙箱后端只认SandboxBackendtraitPausedSandboxState对它是完全不透明的pause 时序列化成 JSON 存进 metadataresume 时原样交回后端orchestrator 不解释里面的任何字段。换后端envd/Firecracker、process、mock不需要动 orchestrator 一行代码——这是它能同时服务评测、RL 训练和本地开发三种场景的结构性原因。fork 也是 trait 上的一个操作SandboxForkSpec只带新的 sandbox_id 和访问令牌一个 running 环境可以 fork 成多个独立沙箱跑并行 agent 工作流。对评测来说这意味着同一环境状态可以低成本复制出 N 份并行度不再受环境启动成本限制。模板流水线aenv pull 到底做了什么aenv pull ubuntu:22.04 --name ubuntu不是简单拉镜像。它走 template builderbuild_spec描述 FROM 哪个 OCI 镜像 要执行的自定义步骤step_executor在沙箱里逐步执行构建装依赖、写配置产物 seal 成不可变的只读层集合注册成模板。之后每次aenv start从模板冷启或从某个已提交快照秒级恢复。模板是环境定义快照是环境状态两者分离是这套系统能复用的关键。存储子系统LSMT 分层镜像 ublk 用户态块设备真正硬核的部分在storage/四件事overlaybd 镜像格式是 LSMTLog-Structured Merge Tree分层的。每层文件头有 magicLSMT\0\1\2索引是一组 16 字节位压缩的DiskSegmentMapping50-bit 数据偏移、14-bit 长度、55-bit 物理偏移外加 zeroed 标记和层标签。底层是只读压缩层顶层一个可写 upper layer。读路径自顶向下查 segment index第一个命中的层出数据写全部 append 到 uppersync 时刷索引。压缩用 zstd level 3 随机访问跳表 CRC32C 校验。ublk 把镜像变成块设备。用户态进程通过 io_uring 的UringCmd向/dev/ublk-control发 ADD内核分配设备 ID 并创建/dev/ublkcN控制和/dev/ublkbN块设备块 I/O 通过 mmap 的ublksrv_io_desc数组派发给用户态 worker 处理。VM 里看到的是正经块设备但数据实际来自 overlaybd 懒加载层——没读到的块根本不会下载本地磁盘只是一个有界缓存。内存快照走同一条路。VM 内存被做成一个 ublk 只读块设备同一个快照 fork 出来的沙箱共享同一份内存镜像靠 refcount 管理生命周期。这是 9.6x 内存超卖的物理基础环境跑得越久越分化可回收的 guest 内存越多。ublk-daemon 独立进程。所有 ublk 设备由一个常驻 daemon 统一管理Unix socket RPC带 warm-pool 预分配设备创建开销不落在关键路径上。快照流水线seal 上层 → 变新底层 → 开新上层pause/快照的核心就一句话create_snapshot_and_restack()。把活的 upper layer seal 掉变成最新的只读层原地开一个新的可写 upper——整个增量快照 100ms。快照产物vm_state Firecracker manifest发布到 repositoryPosixFS共享目录/mnt/aenv-snapshots节点本地image-cache/commits/可随时回收已提交快照不 pin 本地层OSSS3 兼容对象存储提交后快照工件走 P2P 分发推到集群。P2P 层基于 iroh iroh-blobs对外是Arcdyn P2pTransporttraitlookup/fetch/publish/unpublish支持 byte-range fetch对端发现由 scheduler 的ListP2pPeers提供scheduler 不存工件、不转发数据。单节点部署直接 disabled 模式零开销。操作延迟说明boot / resume50ms快照冷启或从暂停恢复pause100ms释放 CPU/内存回主机增量快照100ms重磁盘修改下也成立评测接入模式fork 并行 快照复现对测试团队这套平台最值钱的用法是环境状态可版本化。评测回归可以固定在一个已提交快照上跑用例前 fork 出 N 个沙箱并行执行用例结束后整体丢弃下一轮回归还是从同一个快照出发——环境漂移被彻底排除比在 CI 里反复 docker build 可复现得多from e2b import Sandbox BASE eval-snapshot-v42 # 已提交的评测基准快照 results [] for i in range(16): # 16 路并行 sb Sandbox.create(BASE) # fork 自同一快照 r sb.commands.run(fpytest case_{i}.py -q) results.append((i, r.exit_code, r.stdout[-500:])) sb.kill() # 用完即弃不留状态配套的还有两个基础设施细节沙箱内服务通过/proxy/*反向代理暴露外部测试编排可以直接访问 agent 起的 HTTP 端口做黑盒断言每个节点的 Prometheus/metrics暴露环境启停、快照、P2P 传输指标——环境平台的健康度本身可观测。选型对比为什么不直接用 Docker 或 KVM维度Docker传统 KVMAgentENV隔离级别共享内核cgroup/namespace完整虚拟化Firecracker microVM启动延迟百 ms 级秒级50ms快照镜像分发全量拉取/预推全量overlaybd 懒加载内存密度高但隔离弱低快照共享 ballooning 9.6x状态复用无原生快照有但重增量快照 forkDocker 输在隔离agent 评测要防恶意代码共享内核面太大KVM 输在启动速度和镜像分发AgentENV 用 microVM 懒加载 快照把三个短板同时补上。实践部署配置和 E2B 兼容单机部署要求内核 6.8、/dev/kvminstall.sh 或 Docker--privileged -v /dev:/dev都行。共享存储配置懒加载的关键[snapshot] repository_backend posix_fs [backend.posix_fs] snapshot_store /mnt/aenv-snapshots [image.cache.remote_blocks] max_size_gb 100 # 本地磁盘是有界缓存热数据留存、冷数据驱逐OSS 后端把repository_backend换成oss并配 endpoint/bucket 即可。存储网络至少 1Gbps10Gbps 起步。E2B 兼容是最大的迁移红利API 层兼容 E2B现有 E2B 代码零改动切换export E2B_API_URLhttp://127.0.0.1:8000 export E2B_SANDBOX_URL${E2B_API_URL} export E2B_API_KEYe2b_000000from e2b import Sandbox, SandboxQuery, SandboxState sandbox Sandbox.create(template-id) # 从模板起沙箱 result sandbox.commands.run(pytest -q) # 沙箱内跑测试 sandbox.beta_pause() # 暂停释放资源 sandbox.kill()aenv CLI 同样够用aenv pull ubuntu:22.04 --name ubuntu、aenv start ubuntu、aenv pause/fork/timeout sandbox-id。踩坑清单目前无鉴权README 明确警告别暴露公网放可信内网或加授权代理无 KVM 的环境走 PVM 部署有专门 guide性能打折但能跑空闲环境 TTL 默认短长任务记得aenv timeout续期快照存 OSS 时注意跨 region 拉取延迟P2P 分发能缓解但别裸奔公网 OSS收尾AgentENV 值得抄的不是又一个沙箱平台而是三个工程决策镜像和内存统一走 overlaybd 懒加载 有界本地缓存让集群总镜像量超过单机磁盘几个数量级快照和 fork 作为一等公民把起环境从秒级操作变成 50ms 的廉价操作API 兼容 E2B迁移成本趋近于零。对测试团队来说这意味着评测环境可以做到从同一快照 fork 出 N 个并行沙箱跑同一组用例可复现性有保障空闲即 pause 释放资源成本可控agent 评测和 RL 训练共用一套环境平台基础设施复用。进阶方向agentic RL 训练的 on-policy 数据生产、评测用例在沙箱内的编排、把快照流水线接进 CI 做回归环境的版本化。

相关新闻

OpenMMLab生态版本兼容指南:MMCV、MMDetection与MMDetection3D的依赖关系解析

OpenMMLab生态版本兼容指南:MMCV、MMDetection与MMDetection3D的依赖关系解析

1. 项目概述:为什么版本对应关系如此重要? 在计算机视觉,特别是基于深度学习的研究与工程实践中,MMCV、MMDetection(MMDet)和MMDetection3D(MMDet3D)这三个开源库构成了一个强大且紧…

2026/10/6 7:17:07 阅读更多 →
在线HTTP接口测试工具ApiPost实战:从核心功能到高频错误排查

在线HTTP接口测试工具ApiPost实战:从核心功能到高频错误排查

1. 项目缘起:为什么我们需要一个“好用”的在线HTTP测试工具?做后端开发、前端联调,或者搞点小爬虫、对接第三方API,谁还没跟HTTP请求打过交道呢?我干了这么多年,从最早用浏览器地址栏敲?keyvalue&#xf…

2026/10/2 17:44:20 阅读更多 →
AI技能库设计:从技术债陷阱到高质量工程实践

AI技能库设计:从技术债陷阱到高质量工程实践

1. 项目概述:当AI技能库成为“技术债”的温床“写进skills了,重建还是踩坑?”——这个标题精准地戳中了当下AI应用开发,尤其是智能体(Agent)构建中的一个核心痛点。我们常常兴奋地将一个刚调教好的AI能力固…

2026/9/26 20:14:45 阅读更多 →

最新新闻

ERNIE情感分析实战:从句子级到属性级微调全流程

ERNIE情感分析实战:从句子级到属性级微调全流程

简介:基于Python与预训练大模型ERNIE的情感分析项目源码及配套数据集,完整覆盖句子级与属性级两类情感分析任务,面向自然语言处理学习者、算法工程师以及有实际情感分析需求的开发者。项目从数据预处理、加载ERNIE模型、特征提取,…

2026/10/7 13:27:25 阅读更多 →
知识库向量数据库怎么选?我折腾了一圈,答案就三个字

知识库向量数据库怎么选?我折腾了一圈,答案就三个字

事情是这样的。上一篇文章聊完三层检索策略之后,我盯着终端里的 docker ps 出神——里面躺着一个 Qdrant 容器,跑了快一个月,CPU 占用稳如老狗,但我一次查询都没往它那边发。因为我发现我的 Chroma 跑得好好的。240 篇文章&#x…

2026/10/7 13:27:25 阅读更多 →
网络搭建及应用赛项备赛指南:视频讲解与答案的实战用法

网络搭建及应用赛项备赛指南:视频讲解与答案的实战用法

简介:面向全国职业院校技能大赛《网络搭建及应用》赛项的备赛者与指导教师,这份资料完整整理了2021年赛题的视频讲解、操作录屏与参考答案。压缩包共60个文件,以38个txt配置记录、11个docx报告与分解笔记、8个Python脚本、2个PDF说明及1个mp4…

2026/10/7 13:27:25 阅读更多 →
AI应用层全面爆发:从AI Agent到行业落地的开源项目实战解析

AI应用层全面爆发:从AI Agent到行业落地的开源项目实战解析

从9月22日到28日这周的榜单,我几乎是每天刷好几遍,越到周末越发现一个明显的变化:真正的应用型AI项目开始大面积占据头部位置,那种“包装一个API就跑分”的仓库热度明显降了,取而代之的是能解决具体行业问题、能部署到…

2026/10/7 13:27:25 阅读更多 →
基于Java的汽车销售管理系统课程设计:从数据库设计到答辩避坑指南

基于Java的汽车销售管理系统课程设计:从数据库设计到答辩避坑指南

简介:这是一份面向汽车销售企业的Java后台管理方案,聚焦车辆管理员与销售人员的协同流程,不面向购车端。系统覆盖车辆属性管理、合同签订、订单记录、保险与上牌办理、费用结算(全款/分期)、定金与交付期限等业务规则&…

2026/10/7 13:27:25 阅读更多 →
UFS3.1协议详解:传输层UPIU报文格式与调试实战

UFS3.1协议详解:传输层UPIU报文格式与调试实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:26:24 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →