FEATURED · 精选文章

OpenSandbox沙箱资源池(Pool)详解:预热沙箱让创建时间缩短90%

发布时间 / 2026/9/1 14:17:10
来源 / 创域科博编辑部
栏目 / 资讯中心
OpenSandbox沙箱资源池(Pool)详解:预热沙箱让创建时间缩短90% OpenSandbox沙箱资源池Pool详解预热沙箱让创建时间缩短90%【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandboxOpenSandbox 是面向 AI Agent 的开源安全沙箱运行时而它的**沙箱资源池Pool**正是解决创建慢的核心机制通过提前预热一批就绪沙箱pre-warmed sandboxes把冷启动成本从请求热路径上移走让acquire()从等待数秒的完整创建流程变成毫秒级的即取即用。本文将完整讲解 OpenSandbox 的两层资源池体系——服务端 Pool 与 SDK 客户端池帮助你快速上手配置。为什么沙箱需要资源池AI Agent 场景下沙箱是用完即弃的一次性环境。每次请求都要从零创建意味着用户要等待容器/虚机调度与启动依赖服务execd、Jupyter 等就绪健康检查通过对代码解释器、浏览器自动化这类秒级交互场景动辄数秒的冷启动会直接拖垮体验。OpenSandbox 的思路很直接把创建动作提前做把取用动作变轻——就像餐厅先炒好菜客人来了直接上桌。预热后沙箱获取时间通常可从 10s 级降到 1s 内缩短 90% 以上。OpenSandbox 的两层 Pool 架构OpenSandbox 提供两个层次、可独立使用的资源池层次位置形态适用场景服务端 PoolOpenSandbox Server KubernetesPool CRD 资源控制器自动维持预热 PodK8s 集群部署多客户端共享预热容量客户端池 SandboxPool各语言 SDKPython / Kotlin / GoSDK 内嵌的预热管理器 状态存储单机或多进程部署业务侧自主控制池大小两者都只存沙箱 ID 过期时间不保存业务状态因此可以安全地分布到多进程、多 Pod 中共享。服务端 PoolK8s 下的预热 Pod 池一键创建服务端资源池服务端 Pool 通过 REST API 管理仅在 runtime 配置为kubernetes时可用。核心接口包括POST /pools创建资源池指定 Pod 模板与容量参数GET /pools列出所有资源池PUT /pools/{name}调整容量bufferMin/bufferMax、poolMin/poolMaxDELETE /pools/{name}删除资源池并回收预热 Pod实现位于 server/opensandbox_server/api/pool.py底层由 server/opensandbox_server/services/k8s/pool_service.py 生成 Pool CRDKubernetes 侧的 kubernetes/internal/controller/pool_controller.go 负责按容量规格持续补齐预热 Pod沙箱分配逻辑见 kubernetes/internal/controller/poolassign/assign.go。通过 poolRef 使用预热沙箱创建沙箱时只需在extensions中加一个poolRef服务端就会从池中分配预热 Pod而不是现场创建sandbox await Sandbox.create( image, connection_configconfig, extensions{poolRef: pool-sample}, )官方示例可参考 examples/code-interpreter/main_use_pool.py。⚠️使用限制详见 server/opensandbox_server/services/k8s/kubernetes_service.pyPool 模式暂不支持volumes挂载与networkPolicy暂不支持与自定义platform组合使用SDK 客户端池SandboxPool 预热与获取Python、Kotlin/Java、Go SDK 内置了实验性的客户端池SandboxPool设计细节见 docs/guides/client-pool.md 与提案 oseps/0005-client-side-sandbox-pool.md。两条并发流程预热与获取Warmup仅 Leader 节点后台调和循环持锁运行持有主锁的节点计算空闲缺口并补池预热成功的沙箱以idle_timeout为 TTL 发布到空闲缓冲区Acquire任意节点acquire()从存储中弹出一个空闲沙箱 ID连接客户端、做健康检查并按需续期后立即交给调用方值得注意的设计没有release()。沙箱是临时性的acquire()之后沙箱就归你所有用完直接destroy()/kill()max_idle限制的是预热缓冲区大小而非业务借走沙箱的上限。空池时的降级策略 AcquirePolicy策略空闲缓冲区为空时的行为FAIL_FAST直接抛出 PoolEmptyException适合严格 SLA 场景DIRECT_CREATE默认回退到生命周期 API 现场创建一个新沙箱最小使用示例Python 同步版pool SandboxPoolSync( pool_namedemo-pool, owner_idworker-1, max_idle2, state_storeInMemoryPoolStateStore(), connection_configConnectionConfigSync(domainapi.opensandbox.io), creation_specPoolCreationSpec(imageubuntu:22.04), ) pool.start() sandbox pool.acquire(sandbox_timeouttimedelta(minutes30))各语言 SDK 的完整 Builder 用法见 sdks/python/、sdks/kotlin/、sdks/go/。关键配置参数速查参数默认值含义max_idle必填空闲缓冲区目标大小与上限state_store必填内存存储单进程或 Redis 存储多进程/多 Pod 必选reconcile_interval30sPython/Go 调和间隔Kotlin 固定 1swarmup_concurrencymax(1, ceil(max_idle*0.2))每轮预热并发上限acquire_ready_timeout30s获取时等待沙箱就绪的最长时间idle_timeout24h池创建沙箱的服务端 TTLdegraded_threshold3连续失败进入 DEGRADED 的次数阈值选型建议单进程/测试环境用InMemoryPoolStateStoregunicorn、Celery、K8s 多副本等场景必须用 Redis 存储且所有节点共享同一pool_name、每个进程使用唯一owner_id。最佳实践与常见坑模板变更要换新pool_name创建规格变更后不要试图复用旧池名刷新release_all_idle()无法阻止旧 Leader 继续发布旧模板沙箱——正确做法是滚动到新的pool_name并废弃旧命名空间运行时弹性伸缩流量高峰前调用resize(max_idle)放大缓冲区空闲期缩小以节省成本可观测性通过snapshot()查看池阶段、健康度、空闲量与连续失败数Kotlin SDK 还能对每次预热输出 OpenTelemetry 链路便于定位哪个阶段慢池不是免费午餐预热沙箱占用真实资源容量硬限制仍以 runtime 为准max_idle只是尽力收敛目标总结OpenSandbox 的沙箱资源池用空间换时间的方式把 AI Agent 场景最敏感的沙箱创建延迟压到了极致服务端 PoolK8s CRD 控制器自动补池poolRef一行接入多客户端共享容量SDK 客户端池SandboxPool预热 原子获取内存/Redis 双模式策略化降级配合 tests/go/pool_e2e_test.go 中的端到端测试你可以放心地把资源池应用到生产。下一步建议先用InMemoryPoolStateStore在单机跑通acquire()再切换到 Redis 做多节点共享最后通过snapshot()观察预热水位完成调参。【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻