
回收沙箱,需要先弄清楚它有多久没有被使用。
Flashduty AI SRE 是一个专注 SRE 领域、帮助团队做故障根因分析和日常运维的 AI Agent 产品。这是《Flashduty AI SRE 技术揭秘》第 17 篇,分享我们在 Agent 工程中的设计、踩坑和取舍。
上一篇讲了如何清理没有会话认领的孤儿沙箱。这次面对的是另一类沙箱:它有主人,会话也可能再用到它,但空闲时仍在消耗资源。我们该等多久再回收?
暂停和销毁的代价不同。暂停后还可以恢复;销毁后,沙箱磁盘里的工作现场就没了。如果回收过早,Agent 下一次调用工具时可能拿到一个新建的空沙箱,之前留在本地的文件和状态都找不到了。因此,阈值既要控制成本,也要给正常工作留下足够的时间。
为什么不在一轮任务结束时直接销毁
看起来最省事的办法,是等一轮分析结束,收到完成事件后立即销毁沙箱。但一轮任务结束,不代表用户不会继续追问;完成状态的上报也可能延迟或漏掉。如果把资源回收绑死在这个状态上,回收时机就会依赖一条并不总能及时到达的业务消息。
我们的做法是单独维护最近活跃时间:工具使用沙箱时刷新时间,回收器根据闲置时长判断是否达到销毁阈值。turn 的完成和沙箱销毁在代码中解耦,不走“任务结束就销毁”的路径。这样,是否回收由资源自己的使用时间决定,不依赖完成事件有没有送达。
这个时间仍然只是对使用情况的记录,不是对未来的预言。用户可能在阈值之后回来,Agent 也可能在两次工具调用之间长时间等待。接下来要解决的,就是这些空档该留多长。
看的是两次调用的间隔,不是任务总时长
假设一个自动化任务运行了 20 分钟,期间每隔几十秒调用一次工具。最近活跃时间不断刷新,沙箱并没有连续闲置 20 分钟,也就不会仅因为任务总时长超过阈值而被销毁。
更值得关注的是两次调用之间的空档。例如模型长时间思考、供应商故障切换,或者 turn 正在压缩上下文时,沙箱可能暂时收不到工具调用。如果空档超过阈值,回收器就可能销毁一个之后还要使用的环境。下一次工具调用可能在新沙箱中继续,任务不一定报错,但旧沙箱上的工作现场已经消失。
我们查看了 7 天内 1862 次 automation 运行的相邻事件最大间隔:93.7% 在两分钟以内,2.6% 在五到十分钟之间,超过十分钟的有 4 次,占 0.2%。据此,我们把自动化会话的销毁阈值设为 600 秒。这里的统计是相邻事件间隔,用来评估工具调用空档的风险,并不意味着所有调用间隔都有完整的安全余量。

600 秒之外仍有少量长尾,不能把阈值理解为零风险。
这 4 次长间隔中,有 2 次甚至超过了此前的 33 分钟预算。把阈值调短之前,需要重新测量这种尾部情况。原稿也记录了一项后续改进方向:让整个调用期间的活跃记录覆盖更完整,减少长时间无工具往返时的误判;单靠提高阈值只能改变风险和成本之间的取舍。
自动化和交互式会话,等待时间为什么不同
是否值得保留现场,也取决于谁会回来使用它。我们又看了 14 天的生产统计:
- automation 负载占 idle 销毁总量的 78%,是主要的回收对象。
- 沙箱寿命中,59% 是运行结束后的空转时间。
- 4832 个 automation 会话中,只有 3 个收到过真人追问,约占 0.06%。
这组数字支持对自动化会话采用较短的 600 秒阈值:大量沙箱在任务结束后继续空转,实际收到追问的比例很低。交互式会话则不同,用户可能过一阵子回来接着问,因此使用长得多的通用档,时间尺度是天。系统按会话类型选择档位;类型未知时,落入较长的通用档。
短阈值仍然意味着有人追问时沙箱可能已经不在了。此时系统走重建路径,创建新沙箱,前端显示“正在重建会话”。运行产出的文件存放在对象存储中,不依赖旧沙箱磁盘;但沙箱内未持久化的工作现场仍可能丢失。重建降低了追问的代价,并不等于完整恢复旧环境。
长命令运行时,时钟也要继续刷新
活跃时间的实现有一个容易漏掉的细节:工具调用开始时刷新一次还不够。比如一条 git clone 合法运行了 30 分钟,而暂停阈值只有两分钟。如果命令运行期间没有心跳,回收器看到的会是一个“很久没动”的沙箱,可能在命令执行到一半时将它暂停。这个问题在生产中发生过。
因此,单次工具调用运行期间要持续心跳,刷新活跃时间;即使数据库记录恰好处于 paused 状态,也照样刷新,避免正在使用的沙箱被销毁扫描选中。这与前面说的调用间空档是两个不同问题:心跳保护正在执行的长命令,模型思考或故障切换期间没有工具调用,则仍需要面对长尾风险。
阈值和关闭开关都要能验证
不同会话类型的阈值放在配置文件中,便于运维查看和调整;销毁流程也有总开关。我们曾经遇到一个“看起来关闭了”的开关:读取函数把所有非正值都默默换成默认值,结果运维设置了关闭,automation 档仍然照常回收。后来需要的不只是一个配置项,还要验证配置实际产生了预期行为。
沙箱回收没有一个适用于所有负载的万能数字。600 秒来自当时的生产分布和自动化会话的追问比例,旁边也必须放着那 4 次长间隔的事实。负载发生变化或需要进一步缩短阈值时,应该重新测量,并同时检查活跃时间是否覆盖了真实工作过程。
下一篇讲 LLM 故障切换后的计费:后台换了供应商,客户的单价该不该跟着变化。