状态机
云沙箱并不只有“运行”和“停止”两种状态。它会依次经历四个状态,而状态之间的差别会直接反映在费用上。
应当把沙箱生命周期看作一台状态机。听起来很复杂,其实只需要四个状态、两个计时器和一个活动跟踪器。任何一块缺失或实现错误,往往都会在月底的账单上暴露出来。
学习成果
你将能够说出四个状态,解释两类超时如何推动沙箱在状态之间切换,并判断活动跟踪器应该计入或忽略哪些事件。
四种状态
provisioning -> active -> hibernating -> hibernated
^ |
+-------------+ (restore)| 状态 | 发生的事情 | 成本 |
|---|---|---|
| 配置中 | VM 正在启动并安装依赖 | 已开始计费 |
| 活动 | Agent 正在工作:运行命令、修改文件 | 全额按分钟计费 |
| 正在休眠 | 正在创建快照,沙箱即将结束运行 | 全额按分钟计费 |
| 已休眠 | VM 已停止,快照已保存 | 仅产生存储费用 |
“活动”是成本最高的状态,“已休眠”则最便宜。中间的两个过渡状态(配置中和正在休眠)虽然持续时间不长,却仍按全额计费,因此应尽量缩短它们。
两类超时
每个云沙箱都有两个时钟。它们因不同原因到期,而你只能控制其中一个。
硬到期
服务商会设定最长生命周期,具体可能是一到四小时。时钟归零后,无论 VM 正在做什么都会被终止,而且你无法延长这一期限。你只能在到期前完成任务,或提前创建快照。
无活动窗口
无活动窗口由你设置。连续 N 分钟没有活动后,沙箱会进入休眠。对大多数 Agent 工作负载来说,五分钟是合理默认值;两分钟比较激进,沙箱可能在两个回合之间休眠;二十分钟则较宽松,但你需要为空闲时间付费。
const INACTIVITY_WINDOW = 5 * 60 * 1000;硬到期决定最坏情况,无活动窗口决定日常成本,两者都必须正确处理。
哪些事件算作活动
活动跟踪器是无活动窗口正常工作的关键。实现方法很简单:每个“真实”活动都更新时间戳。难点在于界定哪些事件才算真实活动:
| 事件 | 算作活动? |
|---|---|
| 用户发送聊天消息 | 是 |
| 执行工具调用 | 是 |
| 沙箱事件(文件写入、进程启动) | 是 |
| 状态轮询 | 否 |
| 重连探测 | 否 |
| 健康检查 | 否 |
如果把状态轮询算作活动,沙箱将永远无法休眠,你会一直为空闲时间付费。如果工具调用反而不算活动,沙箱可能在任务执行过程中休眠,导致进行中的工作丢失。这两种失效模式都很常见。
沿时间线分析
0:00 User sends message, sandbox is provisioned
0:02 Sandbox active, agent starts working
0:05 Agent runs npm install (3 minutes)
0:08 Agent finishes, responds to user
0:13 Inactivity window expires (5 min since last activity)
0:13 Sandbox starts hibernating, snapshot in progress
0:14 Snapshot complete, sandbox hibernated
0:20 User sends another message, sandbox restores from snapshot
0:21 Sandbox active again, agent continues where it left off
1:30 Hard expiry hits, VM is killed针对这条时间线,有两个问题值得回答:
- Harness 应该在什么时候提醒用户硬到期即将到来?
- 自动快照应在何时触发,以便用户在过期后继续使用?
答案取决于平台的存储费用,以及强制到期会在多大程度上打断 Agent 任务。这里没有唯一正确答案,但有明显错误的选择(什么都不做),也有较好的选择(在硬到期进度达到 80% 时自动创建快照)。
动手试试
这是一节概念课。请自我检查:
- 凭记忆画出状态机,并标记每个过渡点
- 用一句话解释为什么硬到期不能延长
- 从活动表中选一个事件,解释为什么它算或不算
如果你已经在模块 4 接入生命周期钩子,那么构建真正的云后端时,就有位置挂接状态、lastActivityAt 和 hardExpiryAt。本地后端与 just-bash 后端不会真的触发这些超时,但整体结构已经确定。
提交
本课没有代码提交。本地沙箱暂时没有值得跟踪的真实超时。
完成标准
- [ ] 你可以按顺序说出这四个状态
- [ ] 你可以描述硬到期和无活动窗口之间的区别
- [ ] 你可以区分哪些算作活动,哪些算作噪音
- [ ] 你可以沿着上面的时间线追溯,并解释自动快照何时触发