拓冰建站拓冰建站
首页 / 资讯中心 / 正文

AI Agent 如何拥有“手”?云沙箱与临时 Runtime 实践解析

你有没有想过一个问题现在的 AI Agent 能聊天、能写方案、能生成代码可一旦让它去完成“真实世界里的活儿”——把一堆 CSV 合并、跑一段脚本、修一张图、拉一份网页数据——它立刻变成了只会开口指路的“嘴强王者”。不是 Agent 不够聪明而是它缺了“手”。这半年我一直在折腾 AI Agent 的落地踩了一圈坑之后得到的结论很简单让 Agent 真正干活关键不在于给它更强的模型而在于给它一个云沙箱让它拥有一个临时 Runtime。云沙箱解决了什么一句话Agent 不再只是“输出文本”而是真的能在隔离环境里执行代码、操作文件、安装依赖、观察结果然后根据结果继续调整。这个过程就像你给 Agent 配了一间可以反复使用的临时工坊——用完即毁安全可控成本极低。这篇文章我围绕“云沙箱 Agent 临时 Runtime”这条主线把方案选型、架构设计、从零实现和排查经验一次讲透适合正在做 Agent 开发、工具调用、AI 自动化以及 AI 应用安全测试的朋友。无论你是刚入门还是已经做过几个 Demo应该都能拿到可以直接抄作业的东西。1. 为什么 Agent 不能没有 Runtime1.1 没有执行闭环的 Agent本质上是“纸上谈兵”我把 Agent 的发展分成几个阶段。第一阶段是“会聊天”也就是传统对话机器人只能根据上下文生成回复。第二阶段是“会调用工具”模型能通过函数调用去触达外部 API比如查天气、查订单。第三阶段才是真正有意思的——“会使用环境”Agent 可以在隔离环境中跑代码、改文件、启动服务、观察输出并且根据输出自己做下一轮决策。前两个阶段有一个共同痛点模型只负责“说话”不负责“验证”。它给你一段代码语法对不对、能不能跑、跑出来的结果是否符合预期模型自己不知道全靠人肉复制粘贴去验证。一旦任务复杂起来比如要求“你把这份数据清洗一遍并画几张图”纯对话式 Agent 根本无力完成因为它没有一个可执行、可反馈的运行环境。这就是 Runtime 的价值。Runtime 是程序运行的载体包括解释器、依赖库、环境变量、文件系统、网络接口等等。有了 RuntimeAgent 生成的代码才能被真实执行执行结果才能作为反馈进入模型的下一次推理。没有 Runtime 的 Agent 是“建议者”有了 Runtime 的 Agent 才是“执行者”。1.2 云沙箱、临时 Runtime 和隔离边界到底是什么关系很多人把云沙箱和 Runtime 搞混我拆开说。Runtime 解决的是“能不能跑”的问题。比如 Python 脚本没有 Python 解释器就运行不了WebView2 程序没有对应的 Runtime 就起不来。Agent 需要一个完整的 Runtime 来承载它的执行需求。云沙箱解决的是“在哪跑、怎么跑才安全”的问题。它是一个隔离边界可以是容器、虚拟机也可以是进程级的安全机制。Agent 生成的代码不一定可信尤其当模型被提示词注入攻击或者产生了激烈输出时直接在你本机执行轻则弄乱环境重则泄漏敏感数据。云沙箱就像一个防爆实验室让 Agent 在可控范围内折腾。“临时”则是云沙箱的灵魂。沙箱不是一台你长期维护的服务器而是按需创建、用完即可销毁的临时环境。会话结束就回收下次任务再重新拉一个干净环境。这样既省成本又天然避免环境越用越脏。把三者串起来就是Agent 的每轮任务都会在云端拉起一个带完整 Runtime 的隔离沙箱Agent 在里面执行代码、操作文件、调用工具拿到结果后继续决策任务结束沙箱销毁。这就是标题里说的“从执行代码升级到拥有一个临时 Runtime”的本质。1.3 这个能力到底适合谁如果你属于下面任何一类云沙箱就是你要补的那块拼图正在做 Agent 开发或 Agent 编排的人你给 Agent 接了不少工具但工具大多只停留在 API 调用层一旦需要更复杂的操作沙箱就是质变的起点。做 RPA / AI 自动化的人把“点击按钮”这类固定流程升级为“让模型自己写脚本执行”沙箱能给你一个更普适的执行底座。做 AI 应用安全测试的人你需要安全地让模型去执行不可信代码沙箱的隔离和审计正好是刚需。独立开发者 / 小团队如果你想给聊天机器人加“动手能力”用云沙箱比维护一堆物理机器靠谱得多成本也低得多。2. 云沙箱方案的选型逻辑容器、微虚拟机与进程隔离2.1 为什么首选容器而不是传统虚拟机Agent 调用沙箱有一个硬性指标延迟要低。一次工具调用的响应时间如果超过 5 秒模型的执行链路就会拖得很长体验和成本都会崩掉。传统虚拟机启动要几十秒完全不可接受。而容器技术的最大优势就是轻量秒级拉起、毫秒级执行。我目前的方案以 Docker 容器为主核心原因有三个。第一启动速度快。本地预热好的镜像容器创建加命令执行基本在几十到几百毫秒级别完全能满足 Agent 交互式操作的需要。第二镜像体积可控。一个精简的 Python 镜像不到 200MB磁盘占用和下载时间都还能接受。第三资源隔离能力开箱即用。cgroups 可以对 CPU、内存、PID 数量、磁盘额度进行精细限制namespace 提供文件系统和网络隔离对大多数 Agent 执行场景已经足够了。容器也不是没有缺点。它和宿主机共享内核所以理论上存在逃逸风险更不用说“噪音邻居”问题。如果沙箱里跑的是完全不信任的第三方代码或者你的业务对安全等级要求特别高那就得升级到微虚拟机方案。2.2 微虚拟机、沙箱内核和混合方案怎么选常见的隔离技术有几种我做了个对比表格方便你选型方案启动延迟隔离强度运维复杂度适用场景Docker 容器默认毫秒级中共享内核低可信度中等、要求响应快的任务gVisor用户态内核毫秒到秒级较强系统调用拦截中不可信代码、多租户场景Firecracker 微虚拟机约 200-500ms强硬件虚拟化边界中高多租户强隔离、银行/金融级要求KVM/QEMU 全虚拟机数秒级最强高重型不可信工作负载实际项目里如果追求极致的反馈速度和开发效率先用 Docker。当业务规模变大、开始出现多租户需求或者需要防御恶意 Agent 输出时再考虑引入 gVisor 或 Firecracker。不建议一开始就上微虚拟机因为它的管理成本和可观测性都会成倍增加对早期迭代并不友好。2.3 会话模型决定了你要不要做“临时”在沙箱里Agent 和环境的交互模式通常分成三种一次性执行、长会话 Shell、快照恢复。它们各有各的用处我分别说一下。一次性执行适合验证代码。Agent 生成一段脚本沙箱把脚本跑完返回 stdout、stderr 和退出码沙箱销毁。这种模型实现最简单但对复杂任务不太够用。长会话 Shell 更像一台“远程小电脑”。Agent 可以连续操作先安装依赖再编辑文件然后跑测试最后查看结果。每次操作都在同一个容器里发生状态是连贯的。这也是我日常最常用的模式因为 Agent 执行任务时天然带有试探性需要一轮轮观察和调整。快照恢复解决的是“做到一半环境没了”的问题。比如一个任务耗时很长中间沙箱因为超时被回收了快照机制能保存当前状态下次继续时恢复。Docker 自带 commit 可以做到简易快照但经常用会产生很多中间镜像建议你有空的话用 overlayfs 或者专门的存储方案来做。一句话总结Agent 云沙箱的“临时”不是让你把沙箱做成消耗品而是让你把状态管理做成可回收、可恢复的产品设计。3. 从零搭一套最小“Agent 云沙箱 Runtime”3.1 最小可用环境的镜像设计搭建的第一步是准备一个适合 Agent 工作的基础镜像。我没有用完整版的 python:latest而是选择 python:3.12-slim原因很简单镜像越小拉起越快攻击面也越小。但 Agent 执行任务不能只靠 Python它还需要一些常用工具。下面是我当前的 Dockerfile你可以直接参考。FROM python:3.12-slim # 设置非交互安装 ENV DEBIAN_FRONTENDnoninteractive \ PIP_NO_CACHE_DIR1 \ PYTHONUNBUFFERED1 # 安装基础工具curl 用于请求git 用于拉代码jq 用于解析JSON RUN apt-get update apt-get install -y --no-install-recommends \ curl \ git \ jq \ ca-certificates \ rm -rf /var/lib/apt/lists/* # 创建一个非root用户Agent 默认用它执行命令 RUN useradd -m -s /bin/bash agent # 预装一些常见 Python 库 RUN pip install --no-cache-dir \ requests \ pandas \ pytest \ pyyaml WORKDIR /workspace USER agent这里有三个细节值得说明。一是创建非 root 用户。Agent 生成的代码可能包含危险操作如果默认 root 运行一旦出现恶意 Command危害会被放大。二是把工作目录固定为 /workspace方便后面挂载卷和回收文件。三是只预装通用依赖其他依赖让 Agent 自己在沙箱里按需安装这样镜像不会越来越臃肿。3.2 核心执行接口让 Agent 能执行命令、查看结果镜像准备好以后核心问题就是怎么让 Agent 跟沙箱交互。我的方案是用一个轻量的 FastAPI 服务把它当作 Agent 和沙箱之间的“控制台”。项目里至少要有三个接口创建会话、执行命令、销毁会话。from fastapi import FastAPI, HTTPException from pydantic import BaseModel import docker import uuid app FastAPI() client docker.from_env() class CommandRequest(BaseModel): session_id: str command: str timeout: int 60 class SessionCreate(BaseModel): image: str agent-runtime:latest cpus: float 1.0 memory_mb: int 512 app.post(/sessions) def create_session(req: SessionCreate): 创建一个临时沙箱容器 container client.containers.run( req.image, commandsleep infinity, detachTrue, cpu_quotaint(req.cpus * 100000), mem_limitf{req.memory_mb}m, pids_limit256, network_modebridge, working_dir/workspace, useragent, ) return {session_id: container.id, status: running} app.post(/exec) def exec_command(req: CommandRequest): 在已有沙箱内执行一条命令 try: container client.containers.get(req.session_id) except docker.errors.NotFound: raise HTTPException(status_code404, detailsession not found) res container.exec_run( [/bin/bash, -lc, req.command], stdoutTrue, stderrTrue, ttyFalse, demuxTrue, ) stdout, stderr res.output return { exit_code: res.exit_code, stdout: stdout.decode() if stdout else , stderr: stderr.decode() if stderr else , } app.delete(/sessions/{session_id}) def destroy_session(session_id: str): 销毁沙箱容器 try: container client.containers.get(session_id) container.remove(forceTrue) return {status: destroyed} except docker.errors.NotFound: raise HTTPException(status_code404, detailsession not found)这段代码是骨架里面有三个关键点。第一创建容器时用 sleep infinity 保活。因为 exec_run 要求容器在运行状态如果容器里没有长驻进程创建之后马上就会退出。sleep infinity 就是让容器一直活着等你来执行命令。第二exec_run 里用 demuxTrue 把 stdout 和 stderr 分离。这样 Agent 能明确区分哪些是正常运行输出、哪些是错误信息这对它后续决策非常重要。如果混在一起模型很容易被错误日志误导。第三所有执行都走 /bin/bash -lc意味着命令可以支持管道、变量、多行脚本。Agent 生成的复杂命令也能被正确解析避免因为参数拆分导致失败。3.3 为什么必须限制 CPU、内存和 PID 数量Agent 自动生成的代码有个特点它可能会写出死循环、内存爆炸的递归甚至不小心调用 fork 产生大量子进程。如果不做资源限制一个 session 就能把整台主机拖垮。我常用的限制参数如下资源项推荐值说明CPU1 核cpu_quota100000防止脚本占满所有 CPU内存512MB数据分析和代码执行的主流需求磁盘1GB通过 tmpfs 或 容器可写层限制防止文件写爆磁盘PID 数256防止 fork 炸弹和进程泄漏单次命令超时60s防止长时间卡死在 Docker 里限制资源是通过 cgroups 实现的不需要像虚拟机那样预先分配硬件所以即使在容器上加了 512MB 限制它也只是“最高限额”平时不会白白占用内存。你要知道的是这个限制本身比限制名目更重要因为 Agent 的试错行为会在你意料不到的路径上产生资源消耗。3.4 临时是设计出来的不是口号TTL 与回收机制很多初版云沙箱死在哪不是功能不够是忘了做 TTL。Agent 会话一旦创建如果没有人销毁它它就会一直睡在那里占着内存。虽然 sleep infinity 只占少量资源但架不住任务一多几百个僵尸容器会让 Docker Daemon 越来越慢。我加了一个简单的清理逻辑放到后台定时任务里执行# cleanup.py import docker import time client docker.from_env() TTL_SECONDS 600 # 会话最大存活时间默认10分钟 def cleanup(): for container in client.containers.list(allTrue): labels container.labels if agent-session not in labels: continue created labels.get(created_at, 0) if int(created) TTL_SECONDS time.time(): print(fremoving expired session: {container.id}) container.remove(forceTrue) if __name__ __main__: while True: cleanup() time.sleep(60) # 实际部署建议用systemd timer或者cron注意创建容器时给它打上 agent-session 标签同时把创建时间也写到 labels 里这样回收逻辑才能识别哪些容器是 Agent 沙箱、哪些是普通业务容器。这个设计非常基础但它决定了你的沙箱集群能不能长时间稳定运行。回收机制里还有一条重要原则默认宁可多销毁也不能留垃圾。Agent 任务要支持重试环境丢了重新拉一个就行千万不要心疼。4. 沙箱里的 Agent 能干什么工具、技能与编排4.1 Skill、Agent、Harness 到底分别是什么云沙箱不是孤立存在的它最终要跟 Agent 框架里的技能、编排系统配合。我经常看到有人被 Skill、Tool、Agent、Harness 这几个概念弄糊涂这里用我的理解讲清楚。Skill技能一组可复用的能力包。比如“写正则”是一个 skill“绘制图表”是一个 skill。在沙箱里往往表现为一段脚本模板或一个函数集合。Tool工具更具体的外部接口比如天气 API、支付接口。沙箱本身也可以被注册成一个 Tool暴露执行命令、读文件、装依赖这三个能力。Agent智能体做决策的主体。它观察输入、分解任务、调用工具、分析反馈是大脑。Harness编排/框架壳装着 Agent 运行的外壳程序负责调度、记忆管理、多 Agent 协作、日志记录等。沙箱和 API 服务其实可以理解为 Harness 的一部分或底层设施。四者的关系我用一个类比Harness 是导演Agent 是演员Tool 是舞台上的道具Skill 是演员会用的表演套路而云沙箱是整座摄影棚。没有摄影棚多精彩的戏都拍不出来。4.2 把沙箱注册成 Agent 工具的三个能力在接入 Agent 框架时我建议不要把沙箱暴露成“执行任意命令”的一个大接口这样太宽泛模型容易失控。我习惯拆成三个工具run_command(command)在沙箱里执行单条命令并返回 stdout、stderr 和退出码。write_file(path, content)向沙箱写入文件适合让 Agent 先写好脚本再执行避免命令行转义地狱。read_file(path)读取沙箱内文件内容适合让 Agent 检查运行结果或日志。这样做的好处是模型不需要在一条命令里把“写代码 运行 读取结果 修复”全部塞进去而是像真正的开发者一样分步操作。每一步的反馈都很清晰模型的执行成功率会明显提高。4.3 典型任务代码调试、数据处理、依赖安装拿一个实际场景举例。假设任务需求是“把 data 目录下的 30 个 CSV 文件合并成一个大表并计算每列的平均值”。在没有沙箱之前Agent 只能输出一段 pandas 脚本让你自己跑。有了沙箱之后Agent 的执行链路是这样的调用 read_file 查看 data 目录下的文件名列表。调用 write_file 写一段 pandas 脚本到 /workspace/merge.py。调用 run_command 执行 python3 merge.py。发现报错读取错误日志发现某个文件编码不是 UTF-8。修改脚本增加 encoding 参数重跑。成功后输出结果文件路径并打印前几行数据作为验证。你会发现这不是一次调用完成的而是一轮又一轮的“执行-观察-修正”循环。云沙箱的价值恰恰在于承载这个循环。没有它Agent 永远只能给出一个“理论正确”的答案永远无法应对真实世界的脏数据。依赖安装是另一个高频场景。Agent 经常会用到镜像里没有的库。我的建议是让 Agent 先尝试执行 pip install 某库如果失败就把错误日志给模型让模型判断是不是包名写错了或者版本冲突然后换个版本再来。这个环节特别能体现 Runtime 的意义模型对具体环境的感知是通过真实的错误反馈构建起来的而不是凭空猜。4.4 “建模为工具”和“建模为环境”是完全不同的产品之前做过一个项目一开始我们把沙箱封装成一个工具Agent 每次只能调一次拿到结果就结束。效果非常差因为一次调用根本不可能完成一个复杂任务。后来我们改成让它持有“一个会话”也就是把一个沙箱会话绑定到 Agent 的某次任务生命周期里它可以在里面反复操作效果立刻上了一个台阶。这个体会总结起来就是工具调用解决“点”的问题环境持有解决“面”的问题。前者的沙箱是函数后者的沙箱是“临时电脑”。这也是为什么我在第 2 章特意强调了会话模型。如果你在设计 Agent 时只给了一个“执行命令”的工具没有“保持会话”的概念那你其实还没发挥出云沙箱真正的作用。5. 常见 Runtime 与沙箱故障排查实录5.1 老遇到“缺少 Runtime 组件”之类的报错怎么破用沙箱跑程序时最常见的坑不是代码写错而是环境里缺少某个 Runtime 组件。比如沙箱内跑一个需要 WebView2 的桌面程序报错 could not find the webview2 runtime或者编译一些 Windows 程序时提示缺少 Microsoft Visual C Runtime。还有跑 LabVIEW、NDI、OpenPLC 相关程序时也会报各种 Runtime Error。我以前遇到这类报错第一反应是去网上搜“xxx runtime download”后来发现这是很低效的做法。更靠谱的思路是先搞清楚程序到底依赖什么如果是 Windows 程序用 dumpbin /dependents 或 Process Explorer 查看 DLL 依赖列表如果是 Linux 程序用 ldd 命令查看共享库缺失情况如果程序自带安装器优先把安装器跑一遍让安装器自己处理 Runtime 依赖。这里我想特别强调一点沙箱是一个精简环境它不是完整操作系统很多在物理机上“早就装好了”的运行库沙箱里根本没有。所以给 Agent 设计镜像时要先把可能用到的 Runtime 提前预装好并且记录成文档。等踩多了坑之后你会发现绝大多数的“runtime error 713”“webview2 runtime not found”本质上不是程序坏了而是环境没给够。5.2 “container runtime is not running” 这类容器层故障用 Docker 或 containerd 做底层时最让人头疼的是容器运行时服务本身挂掉。典型报错如 container runtime is not running: output: time...。遇到这种问题我的排查顺序是这样的先看 Docker 服务状态systemctl status docker再查 containerd 是否存活systemctl status containerd看 Docker Daemon 日志journalctl -u docker --since 5 minutes ago检查磁盘空间df -hDocker 在磁盘写满时会拒绝创建新容器这个场景太常见了。最后检查 cgroup 驱动是否异常Docker 和 Kubelet 如果配置的 cgroup driver 不一致就会报告运行时问题。曾经有次凌晨收到告警一堆 Agent 任务全部失败查了半天发现是磁盘被日志撑满了。容器运行时不是说你装了就能一直跑的它也是个需要护理的服务。5.3 Agent 代码把沙箱资源吃光了OOM、pids limit、僵尸进程Agent 自动写代码时最容易碰到的资源问题有三个。一是内存爆掉。沙箱设置了 512MB 内存限制后Agent 跑个大数据集脚本直接 OOM。查这个最直接的方法是 docker stats 看实时占用或者看 docker events 里有没有 OOMKilled 事件。二是 PID 耗尽。如果 Agent 跑出一个 fork 炸弹哪怕代码是误写的也会瞬间把 256 个 PID 上限打满导致后续所有命令都 fork 失败。这种问题用 docker inspect 检查 Pids 字段或者直接看容器状态里是否显示“pids limit reached”。三是僵尸容器残留。如果你没有做 TTL 回收跑完的任务会留下大量 Exited 状态的容器占用磁盘可写层空间。我建议每天定时执行 docker container prune -f强制清理退出容器并且在上层业务逻辑里做好沙箱销毁调用。症状可能原因排查命令解决建议命令执行超时脚本死循环看沙箱内进程树加timeout命令包装重设资源限制沙箱内无法启动进程pids limit 打满cat /sys/fs/cgroup/pids.max调大 pids_limit 或销毁会话容器被重启OOMdocker inspect看 OOMKilled上调内存或优化脚本日志全是 Runtime 组件缺失镜像不完整ldd或dumpbin查依赖预装依赖调整镜像5.4 沙箱内网络和依赖下载问题Agent 在沙箱里执行任务时需要访问外网比如 pip install、git clone、curl 拉数据。我遇到最多的问题是 DNS 解析失败和访问超时。排查 DNS 可以进入容器跑 cat /etc/resolv.conf 和 nslookup 测试访问超时要先确认宿主网络是否正常再试容器内 curl。还有一个值得注意的点沙箱网络策略不要做得太死。如果在创建容器时网络模式设置成 none确实最安全但 Agent 下载依赖也会全挂。我一般用 bridge 模式然后在业务侧做域名白名单。注意白名单是“允许优先级”的设计不是默认全开再拿黑名单拦截否则很容易漏。5.5 安全问题别让 Agent 的“手”变成风险最后必须谈安全。Agent 运行在云沙箱里其实带来了一个幻觉有些人觉得已经沙箱了可以随便让 Agent 执行任何代码。这是不对的。沙箱只隔离执行边界不隔离业务损失。如果 Agent 去调用你的内部数据库接口、把数据传到外部服务那沙箱挡不住。我建议做三层防护。第一层是命令过滤高危命令要拦截比如 rm -rf、mkfs、shutdown、格式化等至少在大模型执行前做一次匹配。第二层是非 root 运行沙箱内默认用户是 agent不是 root即使发生逃逸权限也不会太高。第三层是日志审计所有 Agent 执行的命令和读写文件操作都记录到审计日志一旦出问题能回溯。我见过不少团队在功能上线后才补日志那个过程非常痛苦。第三层在技术上是“先有日志再查问题”在流程上是“先有告警再有响应”。如果连完整的操作日志都没有万一日后需要追责或者排查只能抓瞎。6. 把云沙箱真正接进 Agent 体系的几条经验6.1 从技术 Demo 到产品化要补的东西很多人照着网上的教程把沙箱跑通了但离产品化还差得远。我觉得至少要补五块。身份与配额每个用户或每个 Agent 能创建多少个会话、占多少资源必须有限额机制。任务队列当沙箱数量爆发时要有排队机制不能让高并发直接把底层运行时打挂。审计日志记录每次会话的创建、执行命令、销毁、文件操作这是安全合规的底线。计费或配额不一定是真计费但要让每个任务有配额上限防止个别 Agent 烧掉过多资源。会话回收TTL 心跳检查 强制回收一个都不能少。这五块做完你的沙箱才算从“能玩”升级到“能交付”。6.2 本地 Docker 和云端沙箱集群怎么选我经常被问到一个问题是不是一定要上云端集群本地 Docker 行不行答案取决于你的场景。如果是自己开发调试或者内网私有场景本地 Docker 已经足够成本低、反馈快。但如果你做的是 SaaS 产品要同时服务多个用户那必须用云端沙箱集群。云端的好处是隔离性更强、弹性更大、也更方便统一管理。我见过一些团队把本地 Docker 直接部署到生产后来被用户的恶意代码打穿。他们的想法是“反正有 Docker 隔离”但 Docker 逃逸漏洞不是没出现过。多租户场景一定要慎重评估隔离边界该上微虚拟机的时候就别省。6.3 一些掏心窝的话折腾了这么久我的最终体会是让 Agent 拥有一个临时 Runtime不是锦上添花而是它从“玩具”走向“工具”的分水岭。云沙箱看着就是个跑代码的容器但它把 Agent 的试错能力、反馈能力和自我修正能力全部激活了。你可以把沙箱看作 Agent 的“手”把隔离边界看作“安全套”两者缺一个都会出事。如果这篇文章只能带给你一件事那我希望你记住别急着堆功能先把“执行-反馈-修正”的闭环搭起来哪怕是最简单的 Docker 三个 API 接口。闭环通了后面怎么做都是加法闭环不通你加再多工具Agent 还是那个嘴上王者。最后再分享一个小技巧给 Agent 配置沙箱时把容器的默认退出超时设置得比你想象中短一点。我一开始设了 15 分钟后来生产环境发现大量资源被挂起的会话占着改成 5 分钟后整体吞吐直接翻了一倍。资源这东西宁可让 Agent 重新跑也不要让它占着茅坑不拉屎。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门