你的代理會留下程序。
AgentsRoom 把它們找出來。
AI 程式設計代理每呼叫一個工具,就會在系統裡啟動一個真實程序。絕大多數幾秒就結束了。有些永遠不會結束,它們一點 CPU 都不用,卻把好幾個 GB 的記憶體扣著不還。
程序守衛掃描代理的子程序,標出不再有進展的那些,指出該由哪個代理負責,讓你一鍵結束。不會有任何東西在你不知情的時候被終止。
程序守衛真正在看的東西:一個代理啟動了哪些程序,其中哪些已經不幹活了。
AI 程式設計代理不是一個程序。它每呼叫一次工具,就在你的機器上啟動一個真實程序:一次搜尋、一次建置、一次型別檢查、一輪測試、一個腳本。把這個數字乘上幾個並行工作的代理,再乘上一整天,你會得到幾百個從生到死你一眼都沒看見的程序。
它們幾乎都會結束。麻煩的是不會結束的那些。一次搜尋的匹配模式把正則引擎撐爆了,它既不崩潰也不變慢:它先申請記憶體,被擠進壓縮記憶體,然後餘生就在 4% 的 CPU 上不停地缺頁。它永遠不會結束。也永遠不會有人殺掉它。而如果啟動它的代理被關掉,它就會被過繼給系統的 init 程序,變成一個整台機器上再沒人負責的孤兒程序。
所以變慢是悄悄爬上來的。沒有哪一刻突然崩掉,只有一整天緩慢的累積,而恰恰是這個形狀讓人怪錯了物件:以為是過熱,是代理開太多,是應用記憶體洩漏。在我們實測的那次會話裡,應用自己是 91 個程序佔 2.8 GB,八個代理 CLI 加起來 1.6 GB。兩個都不是問題所在。
程序守衛是那張安全網。它盯著代理留下的東西,告訴你哪個卡住了、是誰啟動的,然後讓你把它結束掉。根本原因會一直變:換個工具,換個匹配模式,換個供應商。而這張網不需要跟著變。
跑 AI 代理的機器為什麼會變慢
下面的數字來自一台 16 GB 筆記本上跑著八個代理的實測會話。這裡沒有一個是估算值。
機器已經開了五個半小時。完全沒有散熱問題:沒有記錄到任何降頻,電池 30.6 攝氏度。8 核上的平均負載在 17 到 21 之間,CPU 有 56% 的時間待在核心態,空閒只剩 1.5%。這個比例才是破綻。真正在幹活的機器,時間花在使用者態程式碼上;系統時間佔 56% 的機器,是一個除了壓縮、解壓和換出記憶體之外什麼都沒幹的核心。
七個卡住的搜尋程序每個佔著 3.9 到 8.0 GB,在一台只有 16 GB RAM 的機器上一共佔了 41.8 GB。交換空間用掉 23.5 GB 中的 22.3 GB,開機以來往交換空間寫了大約 993 GB。結束這七個程序,15.5 GB 立刻回來了,沒有重啟任何一個代理,也沒有重啟應用。
沒人能靠手工抓住這件事,是因為常用工具在這上面撒謊。在 macOS 上,一個卡住的程序實際佔著 8 GB,卻可能只顯示 20 MB 的常駐記憶體,因為它碰過的一切都進了記憶體壓縮器。我們實測過一個還活著的程序:常駐記憶體 4.7 GB,真實佔用 14 GB。虛擬記憶體大小也幫不上忙:在這個平台上連 launchd 都報告約 440 GB 的虛擬大小,拿它來篩等於把整台機器都標出來。
同一次會話,逐小時看:那些再也沒人用的大塊記憶體,以及釋放之後發生了什麼。
而且這些程序有四個特性,保證它們明天還在。
它們永遠不會結束
它們自己的記憶體在交換空間裡,於是時間全花在缺頁上而不是計算上。一次健康的搜尋會跑滿一個核;這些只有 4%。這個迴圈沒有出口,再等下去也不會變。
它們也永遠不會死
工具呼叫沒有超時。對於一個已經閒了五十分鐘的程序,機器上沒有任何東西持有意見。它會一直待在那裡,直到有人殺掉它,或者機器重啟。
它們比自己的代理活得久
關掉代理分頁,程序可能活下來,被過繼給 init 程序。到那一步,它和任何東西都不再有關聯:它是孤兒程序,再沒人會來回收。我們實測的七個裡,有兩個已經是這個狀態。
它們會越堆越多
每跑一輪校驗多一個,每碰上一次倒黴的搜尋多一個。所以變慢在一天之內只增不減,所以重啟看起來像是解決了問題。它什麼都沒解決,只是把計數清零了。
程序守衛做什麼
它盯著你的代理派生出來的程序,而且對自己願意碰哪些,管得刻意地窄。
測的是真實記憶體
不是常駐記憶體,那個值會把一個卡住的程序少算好幾個 GB。程序守衛讀的是真實佔用,把壓縮頁和換出頁都算進去,所以一個顯示 20 MB、實際抱著 8 GB 的程序會露出本來面目。
不只看 RAM,也看 CPU
光看記憶體的話,你機器上每一次建置都會被標出來。程序守衛把處理器佔用測成兩次掃描之間的速率,所以一個先猛幹一陣、然後卡死的程序照樣會被抓到,而真正在幹活的建置會被放過。
抓得住孤兒程序
一個活得比啟動它的代理還久的程序,憑這一點本身就會被報出來,因為再沒有別人會來回收它。歸屬關係是在程序還掛在樹上的時候記下來的,那是唯一能確認它的時刻。
一鍵結束
狀態列裡的提示條會列出每個卡住的程序,連同派生它的代理、記憶體、存活時間和 CPU。結束其中一個,會連它自己派生的東西一起終止。記憶體立刻回來,你的代理照常執行。
macOS、Windows 和 Linux
要把記憶體說清楚,每個系統都需要不同的測法:macOS 看壓縮頁,Linux 看常駐加換出,Windows 看私有提交。三個都已經實現,不是計劃中。
幾乎不花什麼代價
每分鐘一次程序快照,在一台跑著 824 個程序的機器上實測約 40 毫秒。昂貴的記憶體探測只在已經有東西看起來卡住時才跑,而只要沒有代理在活動,掃描根本不會發生。
讓它不至於狼來了的那條規則
一個會標記你建置的守衛,是你一週之內就關掉的守衛。所以一個程序絕不會僅憑記憶體被報出來。它必須夠大,必須已經活了一陣子,而且必須已經不再使用處理器。三條同時成立。
幹活的是第三條。型別檢查或者打包器同樣會抱著好幾個 GB 好幾分鐘,但它們在這期間跑滿一個核。一個陷在交換空間裡的程序只有 4% 上下,因為它的一生都花在等缺頁而不是計算上。這個差距把一台在幹活的機器和一台在下沉的機器分開,也是唯一能可靠區分兩者的訊號。
處理器佔用同樣是測出來的,不是讀出來的。系統工具給的那個常見數字是整個程序生命週期的平均值,所以一個幹了二十分鐘然後卡死的程序看上去依然很忙。程序守衛比較的是兩次掃描之間消耗的處理器時間,所以它看到的是最近一分鐘,不是最近一小時。
它怎麼工作
四步,每分鐘一次,而且最貴的那步幾乎從不執行。
給機器拍一張便宜的快照
每分鐘,程序守衛給所有執行中的程序拍一張快照,然後沿著每個代理終端往下走整棵程序樹。在一台跑著 824 個程序的機器上實測成本約 40 毫秒。只要沒有代理在執行,這一步根本不發生。
圈出嫌疑物件
從那張快照裡,它只留下代理的子程序中活得比你設的閾值更久、而且已經不再使用處理器的那些。正常使用下這份名單是空的,一切到此為止。
只測看起來卡住的那幾個
只有對這份短名單,程序守衛才會付出真實記憶體測量的代價,把壓縮頁和換出頁算進去。測不出來的程序絕不會被標記:不知道不等於判決。
報告,然後讓你決定
狀態列出現一個提示條,一條通知只提醒你一次。你開啟列表,看到這個程序是什麼、佔了多少、卡了多久、由哪個代理啟動,然後你想結束就結束。
它永遠不會碰的東西
一個能結束程序的工具,必須把什麼算自己的事定得很窄。下面這些限制是結構性的,不是需要你記得去開啟的選項。
- 代理 CLI 本身。 無論你用哪個供應商,程序守衛都會保護應用啟動那個終端時用的可執行檔案。這個名字是從啟動動作本身讀出來的,不是來自一份寫死的清單,所以同一個 CLI 的子程序同樣受保護,無論巢狀多深。
- 你的開發命令終端。 一個閒著的開發伺服器滿足失控程序的每一條判據:佔記憶體、活得久、不用處理器。它同時也是你真正希望它一直跑著的那個程序。只有代理終端會被監視,所以你的開發伺服器從來不在畫面裡。
- Shell 和應用自己的管道。 終端輔助程序,以及代理所在的 shell,在設計上就被排除。只有位於代理 CLI 之下的工具程序才有可能成為候選。
- 任何不是它認領的東西。 唯一能結束程序的那條路徑,會拒絕一切不是程序守衛從某個代理自己的程序樹裡撿到的程序。它沒法變成一個終止你機器上別的東西的手段。
而且除非你主動要求,否則沒有任何東西會被自動結束。預設情況下程序守衛只報告它發現了什麼,由你來決定,因為只有你知道一個又大又安靜的程序是不是本該如此。
它什麼時候值回票價
下面每一條都是真實發生過的情況,沒有一條是假設。
下午六點比早上九點更卡的機器
沒有哪一刻突然壞掉,只有一整天穩定的下滑。這個形狀幾乎總是卡住的程序堆積出來的,也是最難靠手工診斷的一種,因為隨便挑哪個瞬間看都不像有問題。
幾個代理同時在幹活
你跑的代理越多,工具呼叫就越多,其中某一次卡死的機會也越多。單次呼叫的失敗率很小;乘上一整天的並行工作,它就不小了。
一次再也沒回來的搜尋
一個撐爆正則引擎的匹配模式,會為一個幾百 KB 的檔案申請好幾個 GB。代理在等它,你在等代理,而機器替這兩頭付帳。
你關了代理,程序還在
關掉一個分頁不一定釋放任何東西。一個早已脫離的程序會帶著它的記憶體留下來,同時失去和應用裡任何可見事物的最後一點聯絡。
一台 16 GB 的筆記本
在 RAM 充裕的機器上,幾個卡住的程序能藏很久。在 16 GB 的筆記本上它們很快就把交換空間頂滿,而一旦系統開始壓縮記憶體,你的每一個代理都會同時變慢。
在怪罪應用之前
機器爬得動不了,而 AgentsRoom 正開著,應用就是最顯眼的嫌疑物件。手裡有逐個程序的真實數字,還有每個程序是由哪個代理啟動的,猜測就變成了可以真正核實的東西。
界限由你來定
預設值刻意保守。下面這些都在設定的終端一欄裡,而且每一項都可以由代理透過 AgentsRoom 的 MCP 工具讀取和修改。
- 監視代理的子程序
- 預設開啟。關掉它,掃描就一次都不會跑,永遠不會。
- 超過記憶體閾值才報告
- 預設兩個 GB。低於這個數,一個卡住的程序不值得打斷你。RAM 充裕的工作站可以調高,記憶體緊張的筆記本可以調低。
- 存活時間達到下限之後
- 預設五分鐘。正是它保證了一個慢但正當的任務永遠不會被標記,因為你真正想要的東西里,幾乎沒有哪個會一邊完全不用處理器一邊跑上五分鐘。
- 自動結束卡住的程序
- 預設關閉,這是一個明確的產品決定,不只是謹慎。程序守衛下的是一個判斷,而只有你知道一個又大又安靜的程序是不是本該如此。開啟它,它就自己動手,事後給你一條通知。
處理器閾值沒有開放出來,這是故意的。正是這項測量把一個在幹活的建置和一個卡住的程序分開,它不是口味問題。
常見問題
這是不是說 AgentsRoom 會拖慢我的電腦?
不是,而這恰恰是這個功能存在的原因。在我們實測的那次會話裡,應用是 91 個程序佔 2.8 GB,八個代理 CLI 加起來 1.6 GB。那 41.8 GB 是被卡死的工具程序佔著的。AgentsRoom 剛好是唯一能同時看到每個代理和它派生的每個程序的地方,所以也是唯一能做出判定的地方。
它會不會把我的建置或者測試殺掉?
不會。一個程序只有在夠大、並且夠久、並且已經不再使用處理器的時候才會被標記。真正在幹活的建置會跑滿一個核,所以過不了第三條,永遠不會成為候選。這個條件的存在就是為了做出這個區分。
它會監視我的開發伺服器嗎?
不會,以後也不會。一個閒著的開發伺服器滿足失控程序的每一條判據:佔著很多記憶體、已經跑了好幾個小時、兩次請求之間不用處理器。只有代理終端的子程序會被監視,所以你的開發命令在設計上就在範圍之外。
它會不會把代理本身給終止了?
不會。無論你用哪個供應商,代理 CLI 都受保護,而這個保護依據的是應用啟動那個終端時用的可執行檔案,不是一份已知名字的清單。Shell 和應用自己的終端輔助程序同樣被排除在外。
什麼是孤兒程序,為什麼要特別對待它?
父程序已經退出的程序,會被過繼給系統的 init 程序。從那一刻起,它和啟動它的代理之間再沒有任何關聯,於是沒人會來清理它。AgentsRoom 會在程序還掛在樹上的時候記住歸屬關係,那是唯一能確認它的時刻,所以之後它依然能報出這個程序。
監視本身要花多少代價?
每分鐘一次程序快照,在一台跑著 824 個程序的機器上實測約 40 毫秒。更貴的那次記憶體測量只對已經看起來卡住的程序執行,也就是說正常使用下它不會執行。而且只要沒有代理在活動,這個掃描根本不存在。
為什麼不直接看活動監視器裡的記憶體那一列?
因為在 macOS 上,那一列把問題少算了一個數量級。一個被擠進壓縮記憶體的程序,可能抱著 8 GB 卻只顯示 20 MB 常駐記憶體。我們實測過一個還活著的程序:常駐 4.7 GB,真實佔用 14 GB。虛擬記憶體大小也好不到哪去:連繫統程序都會報出好幾百 GB。
它對 Claude Code、Codex 這些都管用嗎?
管用。程序守衛對任何具體的工具或供應商一無所知。它盯的是你啟動的那個代理終端的子程序,而它要保護的 CLI 是從啟動動作本身讀出來的。多接一個供應商,這裡什麼都不用改。
在 Windows 和 Linux 上也能用嗎?
能用。要讓記憶體說實話,每個平台都需要不同的測法:macOS 看壓縮頁,Linux 看常駐加換出,Windows 看私有提交。三個都已經實現。
它會不問我就結束程序嗎?
除非你把那個開關開啟,否則不會。預設情況下它把發現的東西報告給你,連同代理、記憶體、存活時間和處理器佔用,由你決定。自動終止是一個設定項,出廠就是關著的。
我結束了某個程序,那個代理會怎麼樣?
代理照常執行。它那次工具呼叫會收到一個錯誤,而不是永遠掛在那裡,這正是你想要的結果:反正那個程序本來也不會結束。什麼都不會被重啟,上下文也不會丟。
它能解決根本原因嗎?
不能,它也不打算解決。原因是會變的:今天是某個工具,明天是另一個匹配模式,下個月是另一個供應商。這是一張安全網,它被設計成在遇到誰都沒見過的原因時依然管用。
你可能還喜歡
別再為沒人用的程序買單
AgentsRoom 免費下載,程序守衛從第一次啟動就是開著的。
配套應用:隨時隨地監控你的 Agent
使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。
把 Bug 和需求直接傳送到您的公開待辦清單。
AgentsRoom 實際執行一瞥。