OpenShell Sandbox Supervisor 资源限制全景解析:安全边界模型、逐项限额与源码印证
【免费下载链接】OpenShellOpenShell is the safe, private runtime for autonomous AI agents.项目地址https://gitcode.com/gh_mirrors/op/OpenShell点击查看免费下载OpenShell 的 sandbox supervisor 在同一进程内承载来自不受信 Agent 的流量因此必须用明确的资源限制保护该进程免受无界内存、工作队列、解析开销与等待时间的冲击。本文以仓库文档 architecture/sandbox-limits.md 为骨架逐项展开 supervisor 与 egress 侧的持久化限制先讲清三种限制类型的模型再分别给出 Middleware、Egress 帧解析、网络与上游代理、Sandbox 本地接口的完整限额清单并结合crates/下源码常量与测试验证让读者既知道限制是多少也明白为什么这样设计、在哪里落地、饱和时如何终止。读完本文你将掌握 OpenShell 沙箱资源边界的完整心智模型以及为新增解析器、缓存或共享队列设计限额时的可复用规则。Limit Model三种限制类型与所有权原则OpenShell 将 sandbox 限制划分为三类各自目的与配置方式不同KindPurposeConfigurationPlatform ceiling平台上限即使 policy 或外部服务恶意或出错也要保护 supervisor代码中默认固定Operator ceiling运维上限在平台最大值之下约束运维方运行的集成可在平台校验边界内配置Policy inspection bound策略检查边界说明某个策略需要 supervisor 缓冲并检查多少应用数据应用协议需要时配置尽量低于平台上限限制的所有权遵循一条核心原则最先分配、排队或等待资源的组件拥有该限制。具体到模块网络帧与消息组装属于 network supervisormiddleware RPC 与信封限制属于 middleware runner应用检查限制属于对应的 L7 解析器。新增限制时必须遵守的规则文档明确列出可作为设计清单尽可能在分配或准入之前就强制执行边界在缓冲之前获取共享容量并贯穿整个缓冲操作持有它对支持部分进度的协议同时给出空闲边界与绝对边界只给其一仍可能造成资源钉死允许运维或策略配置收窄平台上限但绝不静默放宽定义终止行为拒绝reject、关闭close、截断truncate、丢弃shed或背压backpressure不允许fail_open绕过平台安全或协议完整性边界饱和或超限遥测不得携带请求体、凭据、查询参数或外部自由格式诊断信息用模拟时间测试时间边界用饱和状态测试共享预算。Gateway Sandbox 资源的准入限制Gateway 拥有的 sandbox 资源在产生 supervisor 工作之前也带有准入限制可复用工作负载模板每 workspace 上限 1000 个模板 payload 复用 sandbox spec 校验包括环境变量条目数与大小、镜像与资源字段大小、driver-config 序列化大小、GPU 数量模板命名遵循与其他命名 gateway 资源相同的 DNS 风格资源名规则。这意味着模板不是绕过限制的通道——其内部载荷走的是与真实 sandbox 相同的 spec 校验逻辑相关实现可参考 crates/openshell-server/src/config_file.rs 等 gateway 侧配置解析路径。Middleware 限制进程级并发与信封校验Middleware 限制是按 sandbox 进程级生效的。关键设计是registry 替换策略热更新保留共享 work、waiter 与持久会话的准入状态因此旧代次保留的活动仍然占用同样的进程生命周期预算新活动不会因 reload 而洗白占用。Middleware 资源限额总表ResourceCurrent boundScope and behavior并发缓冲工作Concurrent buffered work32HTTP 请求、WebSocket 消息与 WebSocket preflight 共享一个 permit 对应一个完整工作单元准入等待者Admission waiters64活跃预算与等待预算都满时丢弃额外工作HTTP 在缓冲 body 之前收到完整的 503 响应持久 Middleware 会话32流式 middleware 协议共享的进程级会话预算WebSocket preflight 在打开流之前做即时准入任一阶段活跃期间保留一个 permitHTTP body / WebSocket 文本消息4 MiB输入与替换 payload 的平台最大值service、operator 与 stage 限制可进一步收窄Middleware 配置与阶段10策略中至多 10 个配置、单链至多 10 个选中阶段选择器模式32每个 middleware 配置的 include exclude 模式总数单阶段 RPC默认 500 ms范围 10 ms–30 s运维超时对绑定超时设上限完整消息链30 s从工作准入后开始计时准入背压不计入链预算WebSocket preflight最大 1 s独立于消息 RPC 超时限制握手延迟远端服务连接5 s建立 middleware gRPC channel 期间适用以上常量可在源码中逐一找到定义。例如 crates/openshell-core/src/middleware.rs 定义了DEFAULT_MIDDLEWARE_TIMEOUT 500ms、MIN_MIDDLEWARE_TIMEOUT 10ms、MAX_MIDDLEWARE_TIMEOUT 30s、MAX_MIDDLEWARE_CHAIN_TIMEOUT 30s、MAX_MIDDLEWARE_PREFLIGHT_TIMEOUT 1sMAX_CONCURRENT_MIDDLEWARE_WORK 32进程级缓冲工作安全阀与MAX_CONCURRENT_MIDDLEWARE_SESSIONS 32流式会话安全阀注释明确说明一个会话无论协议或阶段扇出如何只消耗一个 permitMAX_MIDDLEWARE_CONFIGS 10、MAX_MIDDLEWARE_CHAIN_STAGES 10、MAX_MIDDLEWARE_SELECTOR_PATTERNS 32、MAX_MIDDLEWARE_FINDINGS_PER_STAGE 32。而在 crates/openshell-supervisor-middleware/src/lib.rs 中可以看到信封与 payload 的字节级常量MAX_MIDDLEWARE_PAYLOAD_BYTES 4 MiBMAX_MIDDLEWARE_CONFIG_BYTES 64 KiB、MAX_MIDDLEWARE_CONTEXT_BYTES 4 KiB、MAX_MIDDLEWARE_TARGET_BYTES 32 KiBMAX_MIDDLEWARE_HEADERS 128、MAX_MIDDLEWARE_HEADER_BYTES 64 KiBMAX_MIDDLEWARE_REASON_BYTES 4 KiB、MAX_MIDDLEWARE_REASON_CODE_BYTES 64、MAX_MIDDLEWARE_FINDING_BYTES 4 KiBMAX_MIDDLEWARE_METADATA_ENTRIES 64、MAX_MIDDLEWARE_METADATA_BYTES 32 KiBMAX_MIDDLEWARE_HEADER_MUTATION_WIRE_BYTES 64 KiB即 64 条 header 变更的线缆预算。这些常量对应文档所述的Middleware 还会校验每个非 body 信封组件64 KiB service config、4 KiB request context、32 KiB target data、128 个请求头共 64 KiB、64 条 header 变更、每阶段 32 条 findings、64 条 metadata 条目。更完整的外部契约见 docs/extensibility/supervisor-middleware.mdx。两个信号量work 与 sessionMAX_CONCURRENT_MIDDLEWARE_WORK对应 work 信号量源码中为Semaphore::new(MAX_CONCURRENT_MIDDLEWARE_WORK)见 crates/openshell-supervisor-middleware/src/lib.rs。它把聚合的 middleware 输入缓冲限制在约32 × 4 MiB外加有界的信封与解析器开销。文档强调这是一个并发安全阀而不是限速器也不承诺 32 个最大尺寸消息同时存在是廉价的。MAX_CONCURRENT_MIDDLEWARE_SESSIONS对应 session 信号量与 work 信号量相互独立。要点一个 WebSocket middleware 会话无论 active-stage 扇出多少都只消耗一个 permit而阶段扇出单独上限为 10全跳过的 preflight 会立即释放 permit保留的会话在连接结束或最后一个 active 阶段被禁用时释放 permit会话准入不等待容量耗尽时在打开任何流之前按每个选中配置的on_error行为处理fail_closed/fail_open解析见 crates/openshell-supervisor-middleware/src/lib.rs协议无关的 registry 所有权允许未来流式 HTTP middleware 复用同一进程级预算。Egress 帧解析与检查限制普通被允许的流量是流式转发的不会累积成连接级缓冲只有解析或变换特性才引入缓冲且该缓冲必须拥有显式边界。下面是 egress 路径的完整限额清单PathCurrent boundTerminal behavior初始 CONNECT 请求头8 KiB拒绝代理请求被检查的 HTTP/1 请求头16 KiB拒绝请求流式 HTTP/1 chunk 帧每行 chunk-size 16 KiB完整 trailer 块 16 KiB 与 128 字段结束 relaychunk payload 经过固定 8 KiB 缓冲区不累积到声明尺寸凭据改写 HTTP body256 KiB改写需要更大缓冲 body 时拒绝SigV4 body 签名10 MiB签名需要更大缓冲 body 时拒绝GraphQL 请求体默认 64 KiB策略可设正的graphql_max_body_bytes尚无共享平台上限MCP / JSON-RPC 请求体默认 64 KiB策略可设正的max_body_bytes尚无共享平台上限解析后的 WebSocket 客户端文本消息4 MiB完整或解压后消息更大时以1009关闭并发解析的 WebSocket 文本组装32 活跃 64 等待者跨所有解析 relay 共享的进程级预算两边界都满时在 payload 分配或读取前以1013关闭每条消息的 WebSocket 分片数4,096以1002关闭WebSocket 文本组装输入空闲 30 s总时长 2 min以1002关闭总时长含初始与后续 payload、continuation 头、穿插的控制帧。文档明确这些刻意宽松的初始边界可在生产行为明晰后收紧或改为运维可调WebSocket 文本转发总时长 2 min结束 relay 并释放组装容量超时不会给半写的数据帧追加 close 帧原始 WebSocket 二进制帧16 MiB以1002关闭二进制消息被 relay 而非检查等待 EOF 的 HTTP relay输入空闲 5 s以超时结束 relayTLS 证书缓存256 个 host插入新 host 前清空缓存源码印证WebSocket 文本组装WebSocket 解析实现 中MAX_TEXT_MESSAGE_BYTES MAX_MIDDLEWARE_PAYLOAD_BYTES即 4 MiB见 L27MAX_CONCURRENT_WEBSOCKET_ASSEMBLIES 32MAX_QUEUED_WEBSOCKET_ASSEMBLIES 64L28-L29TEXT_MESSAGE_ASSEMBLY_IDLE_TIMEOUT 30s、TEXT_MESSAGE_ASSEMBLY_TOTAL_TIMEOUT 2minL32-L33终止行为映射CapacityExhausted → 1013、ProtocolError → 1002、MessageTooBig → 1009L117-L121组装与校验函数在文本分片累积时逐段检查MAX_TEXT_MESSAGE_BYTES如 L696-L699、L764-L770、L1097-L1121测试用tokio::time::advance模拟推进空闲超时L3168 起验证 idle 与 total 两种时限的终止行为——这正好呼应文档用模拟时间测试时间边界的设计规则。缓冲所有权与配额贯穿文档强调每个被解析的 WebSocket 文本消息在 payload 分配或读取之前都要获取 network 拥有的组装容量包括仅用于 native policy、凭据改写、压缩或已禁用 fail-open middleware 会话的 relay。该进程生命周期预算在策略 reload 后仍保留组装在解压、policy/middleware 评估、凭据改写与上游转发全程持有 permit活跃的 middleware 会话还会额外获取共享 middleware work。输入进度只重置空闲期限转发在完整帧头、payload 与 flush 上共用一个总期限。每个超时与终止性解析错误都通过普通所有权释放两个 permit队列耗尽时发出无 payload 的网络拒绝事件。此外运维 middleware 的max_payload_bytes上限适用于通过 HTTP-body 与 WebSocket 文本消息绑定暴露的 payload。它不替代原始二进制帧的 16 MiB 安全边界因为二进制消息永远不会投递给 V1 middleware。通过的一个二进制逻辑消息仍会推进活跃 middleware 会话序列并发出覆盖遥测因此后续文本 RPC 可能包含合法的序列空洞——这是阅读 middleware 覆盖日志时需要注意的行为。源码印证凭据改写与 SigV4rest.rs 定义了MAX_REWRITE_BODY_BYTES 256 KiB与MAX_SIGV4_BODY_BYTES 10 MiB并在签名路径 L1022-L1024 处拒绝超出MAX_SIGV4_BODY_BYTES的缓冲 body与文档表格完全一致。网络与上游代理限制PathCurrent boundTerminal behavior可执行身份钉扎supervisor 生命周期内 4096 个唯一路径新路径会超限时在插入前拒绝整个身份链已有钉扎保持可用且从不驱逐暂存 TCP 上报资源耗尽企业代理 CONNECT 响应头8 KiB隧道失败企业代理 CONNECT 握手总时长 30 s隧道失败已验证地址的尝试共享聚合预算Token 授予 HTTP 请求请求与连接各 30 s凭据解析失败响应衍生 token 缓存 TTL默认 5 min响应上限 1 h过期余量 30 s正的 profilecache_ttl_seconds覆盖会替换响应衍生的计算结果源码佐证企业代理 CONNECT 响应头的 8 KiB 边界即 upstream_proxy.rs 的MAX_CONNECT_RESPONSE_BYTES 8 * 1024超出时直接判定隧道失败L1074-L1079。Sandbox 本地接口限制SurfaceCurrent boundScope and behaviorpolicy.local请求体64 KiB 且读取时限 15 s拒绝超大或停滞的本地请求策略提案长轮询默认 60 s范围 1–300 s钳制请求的保持时长客户端可再发起一轮轮询policy.local拒绝记录读取100 条记录每行 4 KiB限制响应与日志解析工作量日志推送重连缓冲200 条记录断连期间超过本地批量上限的新记录被丢弃日志推送重连退避最大 30 s限制两次重连尝试间的延迟策略状态 outbox无固定容量不阻塞策略对账地保持 FIFO 修订状态策略状态重试退避最大 32 s保留可重试更新并独立于强制实施重试文档点出这两个方向的权衡有界日志批次优先保护 supervisor 健康不保留无界诊断积压策略状态 outbox则相反——修订排序与投递在长时间 gateway 故障中仍能存活代价是队列可能增长。源码佐证policy.local相关边界定义在 policy_local.rsMAX_POLICY_LOCAL_BODY_BYTES 64 KiB与POLICY_LOCAL_BODY_READ_TIMEOUT 15sL63-L68PROPOSAL_WAIT_DEFAULT_SECS 60、PROPOSAL_WAIT_MIN_SECS 1、PROPOSAL_WAIT_MAX_SECS 300L52-L54MAX_DENIALS_LIMIT 100、MAX_DENIAL_LINE_BYTES 4096L70、L84。已知缺口与复查触发条件文档坦承当前限制随功能逐个生长尚不是完整的资源模型。已知缺口包括GraphQL、MCP、JSON-RPC 的策略 body 限制只有默认值没有公共平台最大值正的 token 缓存 TTL 覆盖替换而非收窄响应衍生的 1 小时上限socket 读取期限没有在所有解析器上统一表达为空闲 总时长双预算supervisor 中没有文档化的聚合连接预算或按目标公平性策略策略状态 outbox 有意无界若 gateway 端点持续不可用且策略修订持续进行队列可能增长限流遥测尚未足够统一无法在所有路径上推导饱和趋势。文档给出了明确的复查触发条件在新增解析器、body 变换、持久流、共享队列、缓存或外部调用时重新审视本文档并应陈述以下 6 点哪个不受信资源可能增长或等待哪个组件拥有该边界作用域是按消息、连接、目标还是 sandbox配置能否收窄该限制饱和或超时如何终止哪些遥测与确定性测试能证明该行为。这正是把安全边界从直觉变成可审计工程产物的最小自查框架也是后续阅读 crates/openshell-supervisor-network 与 crates/openshell-supervisor-middleware 源码时判断边界设计是否合格的标准。结语OpenShell sandbox supervisor 的限制体系可以概括为三句话平台上限在代码中固定运维与策略只能收窄不能放宽最先分配资源的组件拥有限制缓冲之前先获取共享容量每个饱和路径都有明确的终止行为与遥测。借助本文的清单与源码映射读者可以快速定位任一限额在仓库中的常量定义与终止实现也可以在扩展新协议特性时按照6 问自查为 OpenShell 贡献同样严谨的资源边界。赞分享【免费下载链接】OpenShellOpenShell is the safe, private runtime for autonomous AI agents.项目地址https://gitcode.com/gh_mirrors/op/OpenShell点击查看免费下载相关推荐SDWebImage 图片加载与缓存5 分钟跑通 iOS 异步图片下载SDWebImage 图片加载与缓存5 分钟跑通 iOS 异步图片下载 做社交类 App 的 Feed 列表时滚动到第 20 屏就开始闪占位图、快速滑动还经AI Agent浏览器控制GUI 自动化后端前端Gnomock完全指南如何快速搭建多类型模拟数据库环境Gnomock完全指南如何快速搭建多类型模拟数据库环境 Gnomock是一个功能强大的Go语言库专为快速创建和管理模拟数据库环境而设计。它支持多种数据库类型Puma工作进程隔离资源限制与安全边界Puma工作进程隔离资源限制与安全边界 什么是Puma的工作进程隔离 Puma作为一款基于Ruby/Rack的Web服务器其核心设计理念之一就是通过进程隔离后端网络创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考