跳到正文
阿里雲開發者社區 AI·· 3 小時前AI 評分51

AI 任務耗用 160 GB 虛擬記憶體令 Mac 崩潰:Polter 為何加入資源熔斷機制?

一个 AI 发疯吃掉 160G 内存,整台 Mac 瞬间暴毙:为什么我们必须给 AI 戴上“紧箍咒”?

AI 導讀

Polter 在最新版加入按終端程序樹監控及資源熔斷,超限時定向終止失控 AI 的程序樹,同時保留該終端的 Shell。事故中,一個影片處理 AI 使用 multiprocessing.Pool(7) 後,7 個 Python 進程合計佔用 160 GB 虛擬記憶體,令 32 GB Mac 的 macOS 強制退出 Polter。

正文

2026-10-26 5

版权

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介: 一个 AI 实习生脑子一抽,写了个暴力并发,5 分钟吞掉整整 160GB 虚拟内存!macOS 瞬间弹窗拉闸,干活的其他 Agent 一起陪葬。这不是软件 Bug,而是 AI 缺乏物理常识的“骚操作”。本文介绍如何用一套熔断机制,精准拿捏发疯的 AI,保全大局!

先说一件真事:你在电脑前开开心心地指挥着 5 个 AI 智能体干活,一个写前端,一个跑后端测试,一个做视频后期。你以为今晚可以睡个安稳觉了。
结果半夜,其中一个 AI 脑子一抽,写了一段并发代码。5 分钟之内,它疯狂吞掉了整整 160 GB 虚拟内存!
苹果电脑直接崩溃弹窗,一巴掌把你的整个终端强制退出——所有正在干活的 AI、写了一半的代码、会话历史,全部瞬间灰飞烟灭。
这不是愚人节玩笑,而是上周真实发生在我们开发机上的惨剧。


01. 案发现场:100 多 GB 内存凭空蒸发,是谁在捣鬼?

上周某天上午 10 点,这台 32 GB 内存的 Mac 正忙得热火朝天。
屏幕上跑着两组 AI:一组在跑自动化演练,另一组在给录好的演示视频做后期——逐帧认出画面里的文字,把敏感的邮箱和路径打上马赛克。

突然,屏幕一卡,风扇狂转,macOS 弹出了那个所有 Mac 用户都害怕的死亡窗口:
「你的系统已没有可用的应用程序内存。」

系统给出的强制退出列表里,我们的多终端管理软件 Polter 赫然挂着第一名,后面写着一个离谱的数字:100 多 GB。

在这里插入图片描述

我们赶紧关掉了浏览器,但根本无济于事。几秒钟后,系统毫不留情地下了杀手:Polter 被强制关闭。
那一瞬间,里面开着的几个终端窗口、正在跑的几个 AI、还有总管,全都没了。

我们当时第一反应是:完了,这软件有巨大的内存泄漏,要赶紧修 Bug!

可等到下午,翻出系统底层的内存诊断报告(JetsamEvent),真实的数据让我们目瞪口呆:

进程名称 内存读数 真实身份
Polter 软件本体 不到 1 GB(峰值仅 1.25 GB) 规规矩矩的宿主终端
7 个 python3.13 进程 每个占了约 23 GB! 干坏事的“临时工”
合计虚拟内存 整整 160 GB! 远超 32GB 物理内存

软件本体干干净净,一滴内存都没漏。
那这 160 GB 到底从哪来的?
一查代码,所有人都气笑了——元凶正是那个负责做视频后期的 AI!


02. 第一个疑问:AI 写的代码,怎么能狂吃到 160G?

答:因为 AI 绝顶聪明,但它对物理世界一无所知。

那个 AI 接到的任务,是处理一条 3 分钟的长视频,一共大约 5400 帧画面。每帧画面都是一张 4K 高清大图,解压出来足足有 23 MB。

AI 想要“好好表现”,觉得一张一张处理太慢了,于是大腿一拍,在 Python 里写下了一行代码:
multiprocessing.Pool(7)。

大白话解释「进程池(Process Pool)」:
相当于一口气雇了 7 个工人同时干活。一个工人一次搬一块砖没问题,7 个工人同时搬,速度理论上快 7 倍。

可这个 AI 犯了一个人类初级程序员都很难犯的致命错误:它根本不知道电脑的胃口是有限的。

它让这 7 个工人疯狂往内存里搬高清图,每一张图算完了还不及时扔掉,而且没有设置任何批次限制。
结果,7 个工人每人硬生生吞掉了 23 GB 内存!7 个人加起来就是 160 GB。
整台 Mac 的物理内存被榨干,只能拼命往固态硬盘里写交换文件(Swap),最后连硬盘都被挤爆,系统轰然倒塌。

很多人喜欢把锅甩给客户端:“是不是 Claude Code 或 Cursor 内存泄露了?”
必须分清两件事:

  • 客户端写得不好(比如界面卡顿、垃圾回收慢),这叫软件 Bug,官方发个补丁就能修。
  • 但这次事故,是 AI 在干活时的「骚操作」!

哪怕世界上最顶尖的团队写出一个完美无瑕的终端,只要你把终端敲命令的权力交给 AI,它就随时可能在深夜整出以下四种“自杀式骚操作”:

  1. 无脑暴力并发:就像这次,以为并发越高越好,直接起几十个进程,瞬间挤爆内存。
  2. 死循环自嗨:测试通不过或者端口连不上,它自己写个 while True 死循环重试,又不加 sleep 休息,直接把 CPU 几个核心拉到 100% 狂转一整夜,电脑热得能煎鸡蛋。
  3. 报复性狂写磁盘:调试遇到报错,它就在循环里把几百兆的调试日志、中间截图拼命往硬盘里写,一口气把剩余的十几 GB 硬盘全填满。硬盘一旦剩余 0 字节,操作系统甚至连新建文本文件都做不到,彻底假死。
  4. 管杀不管埋的“僵尸进程”:它启动了前端服务或者后台测试,报错后它不知道把上一个关掉,直接又起一个。几个循环下来,后台悄悄潜伏着几十个无头 Chrome 和 Node 进程,偷偷啃光你的资源。

03. 第二个疑问:一个 AI 闯祸,凭什么所有 AI 都要被“连坐”处决?

答:因为现代操作系统的记账逻辑,叫「连坐制」。

读者可能会问:既然是那 7 个 Python 脚本闯的祸,苹果系统为什么不直接把这 7 个 Python 杀了,偏偏要把我们的终端软件 Polter 强退呢?

这里要科普一个 macOS 的底层概念:负责进程(Coalition)。

大白话解释「负责进程」:
就像一个房东(Polter)租了一套大平层,屋里住了几个租客(各个 AI 终端)。
其中一个租客(视频处理 AI)在自己屋里搞化学实验,把整栋楼的水管全炸了。
物业(macOS 系统)赶来时,才不管具体是哪个租客拧开的水龙头,在物业眼里,这套房子的合同是签在房东名下的。物业直接拉断全屋电闸,把房东连同屋里的所有人一起轰出大楼!

在多 Agent 协同的场景下,这简直是一场噩梦:

💥 传统终端下的“连坐暴毙”现场

  • 🤹 终端 1(总管):正通宵梳理 20 个功能的任务链路,刚准备下发……
  • 💻 终端 2(前端):刚刚写完 800 行核心代码,还没来得及按保存……
  • 🧪 终端 3(后端):正在小心翼翼地跑关键数据库迁移测试……
  • 💣 终端 4(惹祸精):大腿一拍,写了个吃光 160G 内存的死循环并发……

🚨 突发结局:macOS 判定宿主内存超标,一枪干掉主程序——4 个终端瞬间全部蒸发,无一幸存!

第二天早上你满怀期待地掀开笔记本,看到的不是做好的项目,而是一个空空如也的桌面。
通宵几个小时的进度、消耗的数百万 Token、未保存的上下文,全给这个惹祸的 AI 陪葬了。

有人会说:“那现成的办法管不住它吗?”
真管不住。目前市面上的现成方案全有硬伤:

  • 设个超时时间(Timeout)? 根本没用!那个 Python 脚本从启动到吃满 100G 只要 60 秒,根本等不到你的 10 分钟超时限制。
  • 关进 Docker 容器? 日常在 Mac/Windows 上写代码,每次跑命令都要套个笨重的 Docker,不仅慢,而且一旦 Docker 内存超标被系统击杀,整个容器立刻蒸发,命令行直接消失,你连事故现场都看不见。
  • 手动写脚本 pkill 强制杀? 一杀一大片,不仅容易误伤无辜,还会把终端打入“植物人”状态——光标消失、按键失灵、满屏乱码。

04. 破局之道:怎样给发疯的 AI 来一场“外科手术”?

被坑了两次之后,我们在开源项目 Polter 里下定决心:必须在终端层建一套“系统级安全气囊”。
目标非常明确:谁犯事,就干掉谁;保全大局,绝不连坐!

这就是我们在最新版中设计并实现的按格进程树监控与外科手术式熔断。

在这里插入图片描述

秘密武器 1:不看表象,看「整棵家族树」

很多监控软件只看某一个进程号(PID)。但 AI 聪敏得很,它会生孩子(子进程)、孩子再生孙子。
Polter 的做法是:以每个终端格子的 Shell 进程为根,顺藤摸瓜,把这一格生出来的所有子进程、孙进程、守护进程捆成一捆,统一记账。

  • 在 Mac 上,我们采集底层的 phys_footprint(物理脚印)。

    大白话:不看虚张声势的“申请了多少”,只量它“真正在物理内存里占了多少地皮”。

  • 每次扫描全机 1000 多个进程,实测只需要 2.5 毫秒(千分之二点五秒),每 2 秒扫一次,轻如鸿毛。

秘密武器 2:总管立家规,但绝不当“碎嘴子”

在 Polter 里,总管 AI 在派发任务时,可以给每个工人设置资源红线:

{
   
  "memory": {
   
    "warn": ["8G", "40%"],
    "kill": "19G"
  }
}

这里有一个极具巧思的设计:预警只提醒人,绝不吵总管!
如果一超过 8G 就发消息给总管,总管的上下文很快就会被无聊的报警刷屏,白白烧掉几万 Token。
所以:小病小痛(预警线),只在屏幕右上角弹通知给人类看;大逆不道(到了 19G 中断线),才由系统直接拔管。

秘密武器 3:外科手术式熔断(杀进程、留 Shell、能接回)

当惹祸的 AI 进程树突破了 19 GB 的死线,真正的魔法发生了:

  1. 精准爆破:Polter 只向这个格子里发疯的 Python 进程树发信号(先礼后兵:先发 SIGTERM 劝退,5 秒不退直接 SIGKILL 强杀)。
  2. 保全现场:这一格终端的 Shell 命令行完好无损地留在原地!
  3. 替它擦屁股:AI 进程被强杀后,往往来不及恢复终端状态,光标经常看不见了。Polter 会在底层自动帮它复位终端,把光标重新擦亮。
  4. 给总管递小抄:Polter 在群里拍了拍总管,留下一行字:“3 号工人因为内存超过 19GB 被击毙,如果你想接着干,输入 claude --resume 可以无缝接回。”

🛡️ Polter 外科手术式熔断时序

  1. 🔴 触碰红线:3 号工人的进程树内存飙到 19.1 GB,触碰总管设定的 19 GB 熔断线。
    ⬇️
  2. ⚡️ 定向清除:Polter 仅向 3 号格子的子进程树发送终止信号,7 个 Python 进程瞬间被杀,160 GB 虚拟内存即刻归还系统。
    ⬇️
  3. 🛡️ 保活现场:3 号终端格子的 Shell 命令行完好存活,底层自动复位 VT 终端模式,光标重新亮起。
    ⬇️
  4. 📢 汇报总管:向总管自动汇报:“3 号因超限被熔断”,并直接附上断点接回指令:claude --resume。
    ⬇️
  5. ☕️ 团队无感:总管、1 号前端、2 号后端毫不知情,端着咖啡继续跑各自的任务。

一粒老鼠屎被瞬间夹走,一锅好汤毫发无损。


05. 最后一个苛刻问题:你怎么保证你的监控自己不泄露?

这是一个非常搞笑但极度普遍的行业现象:很多用来抓内存泄漏的监控工具,自己跑着跑着就泄漏了。

如果 Polter 的监控每采样一次,就往列表里追加一条记录,几天下来,监控自己也会吃掉几个 GB。

为了做到真正的工业级稳定,我们在代码规范里立下了极度苛刻的“死规矩”:

  1. 所有历史记录,全部使用固定大小的环形缓冲(Ring Buffer):

    大白话解释「环形缓冲」:
    就像一个只有 60 个格子的圆形钟表,分针走完一圈,新数据就直接覆盖掉最旧的数据,池子永远只有这么大。
    每个进程只分给约 28 KB 空间,整套监控最多跟踪 64 个进程。
    算下来,整个监控系统的常驻内存被焊死在 ~1.85 MB!不管是跑 1 小时还是跑 1 年,它占的内存绝不增加 1 个字节!

  2. 自带「10 万次无泄漏」测试:
    在自动化测试里,我们让模拟器连续高频采样 10 万次(相当于一个人不间断跑了 55 个小时),断言监控本身占用的内存增量必须严格为零。

06. 写在最后:当 AI 成为员工,终端就是它的工位

我们正在经历一个转折点:
过去,终端是人类敲命令的工具;现在,终端成了 AI 智能体的工位。

当 AI 拥有了写代码、编译、装依赖、跑多进程的所有能力,我们不能再把终端当成一个只会吐字符的黑框框。

物理世界的硬件不是无限的。32G 就是 32G,硬盘满了系统就会死锁。
如果没有操作系统级的物理资源守卫,所谓的多智能体自主协作,不过是一场不知道什么时候就会崩溃的空中楼阁。

让能干的 AI 放手去干,让发疯的 AI 瞬间被降服。
这就是我们给出的答案。


來源:阿里雲開發者社區 AI · developer.aliyun.com