Ваши агенты оставляют после себя процессы.
AgentsRoom их находит.
ИИ-агент запускает настоящий системный процесс на каждый вызов инструмента. Большинство завершаются за секунды. Некоторые не завершаются никогда, и достаточно горстки таких, работающих одновременно, чтобы забить память машины.
Страж процессов обходит дочерние процессы ваших агентов, отмечает те, что съедают вашу память, поодиночке или всей толпой, называет ответственного агента и даёт вам его прервать. Ничего не завершается за вашей спиной.
На что страж смотрит на самом деле: процессы, которые запустил один агент, и какие из них перестали работать.
ИИ-агент не сводится к одному процессу. Каждый вызов инструмента запускает на вашей машине настоящий процесс: поиск, сборку, проверку типов, прогон тестов, скрипт. Умножьте это на несколько агентов, работающих параллельно, на целый день, и вы получите сотни процессов, рождённых и похороненных так, что вы не увидели ни одного.
Почти все они завершаются. Проблема в тех, что не завершаются. Поиск, чей шаблон взрывает движок регулярных выражений, не падает и не тормозит: он выделяет память, уходит в сжатую память, а потом всю жизнь проводит на страничных ошибках, пока ядро свопит ради него гигабайты. Он не закончит никогда. Его никто никогда не убьёт. А если агент, который его запустил, закрыт, процесс становится сиротой, за которого на машине больше никто не отвечает.
Вот почему торможение подкрадывается незаметно. Нет одного громкого события, есть медленное накопление за рабочий день, и это ровно та форма, из-за которой винят не то: перегрев, слишком много агентов, утечку памяти в приложении. В сессии, которую мы измерили, само приложение занимало 2,8 ГБ на 91 процесс, а восемь CLI агентов вместе 1,6 ГБ. Ни то, ни другое не было проблемой.
Страж процессов и есть та самая страховочная сетка. Он следит за тем, что агенты оставляют после себя, говорит, какой процесс завис и кто его запустил, и даёт вам его завершить. Первопричины будут меняться и дальше: другой инструмент, другой шаблон, другой провайдер. Сетке меняться не нужно.
Почему машина, на которой работают ИИ-агенты, замедляется
Цифры ниже взяты из одной измеренной сессии на ноутбуке с 16 ГБ и восемью работающими агентами. Здесь нет ни одной оценки на глаз.
Машина работала пять с половиной часов. Никаких проблем с температурой: троттлинг не зафиксирован, батарея 30,6 °C. Средняя загрузка держалась между 17 и 21 на 8 ядрах, а процессор проводил 56% времени в ядре при 1,5% простоя. Именно это соотношение всё и выдаёт. Машина, которая действительно работает, проводит время в пользовательском коде; если же 56% времени уходит в систему, значит ядро только и делает, что сжимает, разжимает и свопит память.
Семь зависших процессов поиска занимали от 3,9 до 8,0 ГБ каждый, то есть 41,8 ГБ на машине с 16 ГБ RAM. Своп был заполнен на 22,3 ГБ из 23,5, а с момента загрузки в него было записано около 993 ГБ. Завершение этих семи процессов мгновенно вернуло 15,5 ГБ, без перезапуска хотя бы одного агента и без перезапуска приложения.
Руками этого никто не ловит потому, что привычные инструменты об этом врут. На macOS зависший процесс может показывать 20 МБ резидентной памяти, занимая при этом 8 ГБ, потому что всё, к чему он прикасался, прошло через компрессор памяти. Один такой мы измерили вживую: 4,7 ГБ резидентной памяти при реальном объёме 14 ГБ. Виртуальный размер тоже не помогает: на этой платформе даже launchd показывает около 440 ГБ виртуального размера, так что фильтр по нему отметит машину целиком.
Та же сессия, час за часом: пласты памяти, которыми уже никто не пользуется, и что происходит, когда их освобождают.
И у этих процессов есть четыре свойства, которые гарантируют, что завтра они всё ещё будут здесь.
Они никогда не заканчивают
Их собственная память лежит в свопе, поэтому вместо вычислений они проводят время на страничных ошибках. При этом они вовсе не простаивают: каждый из измеренных нами беглых процессов сжигал от 10 до 19% процессорного ядра, и чем больше их накапливается, тем меньше достаётся каждому. Выхода из этой спирали нет, и сколько ни жди, легче не станет.
Они никогда не умирают
У вызова инструмента нет таймаута. Ничему на машине нет дела до процесса, который простаивает пятьдесят минут. Он будет сидеть там, пока кто-нибудь его не убьёт или машина не перезагрузится.
Они переживают своего агента
Закройте вкладку агента, и процесс может выжить. Связь рвётся в каждой системе по-своему: классический Unix переподчиняет его процессу init, Linux на десктопе отдаёт его вашему пользовательскому менеджеру systemd, а Windows не переподчиняет вообще ничего и оставляет ссылку на родителя, которого больше нет. Поэтому страж никогда не смотрит на родителей. Он запоминает, что усыновил, пока связь ещё была, и считает сиротой всё, чего нет в живом дереве процессов, одинаково на всех трёх системах. Двое из семи измеренных нами уже были в таком состоянии.
Они накапливаются
По одному на каждый проход проверки, по одному на каждый неудачный поиск и ещё один каждый раз, когда агент принимает медленную команду за зависшую и запускает её заново. Мы измерили двенадцать проверок типов, работавших одновременно, запущенных шестью агентами, у двух из которых их было по три сразу. Вот почему торможение за день только нарастает и почему перезагрузка выглядит как решение. Она ничего не решает, она просто обнуляет счётчик.
Что делает страж процессов
Он следит за процессами, которые порождают ваши агенты, и намеренно очень узок в том, чего вообще касается.
Измеряет реальную память
Не резидентный размер, который занижает зависший процесс на гигабайты. Страж читает реальный объём занятой памяти, включая сжатые страницы и страницы, ушедшие в своп, поэтому процесс, который показывает 20 МБ, а занимает 8 ГБ, виден таким, какой он есть.
Измеряет процессор, но не верит ему
Загрузка процессора считывается как скорость между двумя сканами, а не как среднее за всю жизнь процесса, которое показывает системный инструмент, поэтому процесс, который сначала пахал, а потом заклинил, всё равно попадается. Даёт она только более высокий порог для того, что ещё работает, и никогда не даёт пропуск: беглый процесс, сжигающий пятую часть ядра, это ровно то, что первая версия этого стража упускала.
Ловит осиротевшие процессы
Процесс, переживший запустившего его агента, отмечается сам по себе, потому что его память никто другой уже не вернёт. Принадлежность запоминается, пока процесс ещё привязан: это единственный момент, когда её вообще можно установить.
Один клик, чтобы его завершить
Индикатор в строке состояния перечисляет каждый зависший процесс с агентом, который его породил, его памятью, возрастом и загрузкой CPU. Завершение убирает и его, и всё, что он породил сам. Память возвращается сразу, а ваши агенты продолжают работать.
macOS, Windows и Linux
Каждой системе нужно своё измерение, чтобы сказать о памяти правду: сжатые страницы на macOS, резидентная плюс ушедшая в своп на Linux, приватная выделенная память на Windows. Все три реализованы, а не запланированы.
Стоит почти ничего
Один снимок процессов в минуту, замеренный примерно в 40 мс на машине с 824 процессами. Дорогой замер памяти запускается, только когда что-то уже выглядит зависшим, а пока ни один агент не активен, скан не запускается вообще.
Видит толпу, а не одиночку
Двенадцать проверок типов по 1,4 ГБ каждая составляют 16,8 ГБ на машине с 16 ГБ, и при этом каждая из них укладывается в разумный порог. Когда процессы, запущенные вашими агентами, вместе занимают половину физической памяти машины, размер перестаёт оцениваться по одному.
Называет ответственного агента
Две и больше отмеченных команд от одного агента группируются под его аватаром: сколько они держат вместе и предупреждение, объясняющее петлю, в которую они попали. Одна команда это случайность, несколько сразу это уже поведение.
Прерывает агента, а не только процесс
Если завершить процесс, пока его агент в середине своего хода, агент получит ошибку и отреагирует на неё, часто запустив ту же команду заново. Одна кнопка вместо этого посылает Ctrl+C в терминал агента: его ход завершается, ничего не перезапускается, а сам агент остаётся открытым.
Правила, которые не дают ему кричать «волки»
Стража, который отмечает ваши сборки, вы отключите за неделю, поэтому планка намеренно высока. У каждого дочернего процесса агента, который прожил дольше вашего порога, измеряется реальная занятая память, и о нём сообщается, как только он держит больше, чем вы разрешили. Процесс, который всё ещё использует процессор, должен держать вдвое больше, и именно это оставляет в покое долгую, законную сборку.
Загрузка процессора задаёт эту планку, но не служит пропускным фильтром. Первая версия этого стража требовала, чтобы процесс простаивал, прежде чем она вообще посмотрит на его память, и это было ошибкой. Поиск, чей шаблон взрывает движок регулярных выражений, вовсе не простаивает: он сжигает пятую часть процессорного ядра, пока ядро системы свопит ради него гигабайты. Хуже того, чем больше их накапливается, тем меньше процессора достаётся каждому, так что слепая зона была шире всего в самом начале, когда завершить такой процесс было дешевле всего.
Второе правило существует потому, что планка на каждый процесс не видит толпы. Двенадцать проверок типов, каждая из которых держит 1,4 ГБ, по отдельности разумны и вместе смертельны на машине с 16 ГБ. Поэтому, когда всё запущенное агентами в сумме занимает половину физической памяти машины, сообщается обо всём этом, сколько бы ни весил каждый кусок сам по себе. Ничто из этой группы никогда не завершается автоматически: оно ниже заданного вами предела и отмечено только из-за соседей.
Как это работает
Четыре шага, раз в минуту, и дорогой из них почти никогда не выполняется.
Один дешёвый снимок машины
Каждую минуту страж делает один снимок всех запущенных процессов и обходит дерево под каждым терминалом агента. Замеренная стоимость на машине с 824 процессами: около 40 мс. Пока ни один агент не запущен, этого не происходит вообще.
Отобрать подозреваемых
Из этого снимка он оставляет каждый дочерний процесс агента, который живёт дольше вашего порога. Это весь фильтр, и ничто не исключается за то, что всё ещё использует процессор: именно так предыдущая версия этого стража упускала беглые процессы. При обычной работе список пуст, потому что вызовы инструментов агента завершаются за секунды.
Измерить тех, кто выглядит зависшим
Только для этого короткого списка страж платит за настоящий замер памяти, со сжатыми и ушедшими в своп страницами. Процесс, который он не смог измерить, не отмечается никогда: неизвестность не приговор.
Сообщить и дать вам решить
В строке состояния появляется индикатор, и одно-единственное уведомление сообщает вам об этом. Вы открываете список, видите, что это за процесс, сколько он занимает, как давно он завис и какой агент его запустил, и завершаете его, если хотите.
К чему он не притронется никогда
Инструмент, способный завершать процессы, обязан узко понимать, что его касается. Эти границы структурные, а не опции, которые нужно не забыть включить.
- К самому CLI агента. Какого бы провайдера вы ни запустили, страж защищает бинарник, которым приложение запустило этот терминал. Это имя он читает из самого запуска, а не из зашитого списка, поэтому дочерний процесс того же CLI защищён тоже, на любой глубине.
- К вашим терминалам dev-команд. Простаивающий dev-сервер подходит под все признаки беглого процесса: толстый, старый, процессор не грузит. И это же единственный процесс, который вы действительно хотите видеть работающим. Следят только за терминалами агентов, поэтому ваш dev-сервер в кадр не попадает никогда.
- К оболочке и внутренней механике приложения. Терминальный помощник и оболочка, в которой работает агент, исключены по построению. Кандидатами становятся только процессы инструментов ниже CLI агента.
- Ко всему, что он не усыновил. Единственный путь, способный завершить процесс, отказывает любому процессу, который страж не подобрал в дереве самого агента. Он не может превратиться в способ завершить что-то ещё на вашей машине.
И ничего не завершается автоматически, пока вы этого не попросите. По умолчанию страж сообщает, что нашёл, а решаете вы, потому что именно вы знаете, был ли большой и тихий процесс ожидаемым. Даже включённое автоматическое завершение не трогает ничего, что всё ещё использует процессор, и ничего, что отмечено только из-за того, сколько держат соседи.
Когда он оправдывает своё место
Каждая из этих ситуаций реальна, ни одна не гипотетическая.
Машина медленнее в 18:00, чем в 9:00
Нет момента, когда что-то сломалось, есть ровное сползание за день. Такая форма почти всегда означает накопившиеся зависшие процессы, и её труднее всего продиагностировать руками, потому что в любой отдельно взятый момент ничего не выглядит неправильно.
Несколько агентов работают параллельно
Чем больше агентов вы запускаете, тем больше вызовов инструментов, и тем больше шансов, что один из них заклинит. Доля отказов на вызов крошечная; умноженная на день параллельной работы, она перестаёт быть крошечной.
Поиск, который так и не вернулся
Шаблон, который взрывает движок регулярных выражений, выделяет гигабайты на файле в несколько сотен килобайт. Агент ждёт его, вы ждёте агента, а платит за обоих машина.
Вы закрыли агента, а процесс остался
Закрытие вкладки освобождает не всегда и не всё. Уже отвязанный процесс сохраняет свою память и теряет последнюю связь с чем-либо, что видно в приложении.
Ноутбук с 16 ГБ
На машине с большим запасом RAM несколько зависших процессов прячутся подолгу. На ноутбуке с 16 ГБ они быстро упираются в своп, и как только система начинает сжимать память, все ваши агенты замедляются одновременно.
Прежде чем винить приложение
Когда машина еле ползёт при открытом AgentsRoom, очевидный подозреваемый: само приложение. Реальные цифры по каждому процессу, с агентом, который его запустил, превращают подозрение в то, что действительно можно проверить.
Границы задаёте вы
Значения по умолчанию намеренно осторожны. Всё, что ниже, живёт в настройках, на вкладке «Терминал», и каждое из них агент тоже может прочитать и изменить через MCP-инструменты AgentsRoom.
- Следить за дочерними процессами агентов
- Включено по умолчанию. Выключите его, и ни один скан больше не запустится, никогда.
- Сообщать выше порога памяти
- Два гигабайта по умолчанию. Ниже этого зависший процесс не стоит того, чтобы вас отвлекать. Поднимите порог на рабочей станции с большим запасом RAM, опустите его на ноутбуке, где память на счету.
- После минимального времени жизни
- Пять минут по умолчанию. Ниже этого вообще ничего не измеряется, и именно это полностью убирает из кадра обычные вызовы инструментов агента, те, что завершаются за секунды.
- Завершать зависшие процессы автоматически
- Выключено по умолчанию, и это осознанное продуктовое решение, а не осторожность. Страж выносит суждение, а был ли большой и тихий процесс ожидаемым, знаете только вы. Включите его, и он будет действовать сам, присылая уведомление постфактум.
Порог по процессору наружу не выведен, как и точка, начиная с которой машина считается насыщенной. Оба значения однажды были неверными и были исправлены измерением реальных инцидентов, а не на вкус, так что ползунок для любого из них был бы в основном способом вернуть слепую зону на место.
Частые вопросы
Значит ли это, что AgentsRoom замедляет мой компьютер?
Нет, и именно поэтому эта функция существует. В сессии, которую мы измерили, приложение занимало 2,8 ГБ на 91 процесс, а восемь CLI агентов вместе 1,6 ГБ. Эти 41,8 ГБ держали процессы инструментов, которые заклинили. AgentsRoom просто оказывается единственным местом, откуда видны все агенты и все процессы, которые они породили, а значит и единственным местом, откуда можно рассудить.
Он убьёт мою сборку или прогон тестов?
Он никогда не завершит её, не спросив. Сообщить о ней он может: сборка должна держать вдвое больше вашего порога, четыре гигабайта по умолчанию, либо входить в группу процессов агентов, которая занимает половину памяти машины. Но автоматическое завершение никогда не трогает процесс, который всё ещё использует процессор, и процесс, отмеченный только из-за того, сколько держат соседи. В обоих случаях вы получаете строку, реальные цифры и кнопку, и ничего не происходит, пока вы её не нажмёте.
Он следит за моим dev-сервером?
Нет, и не будет никогда. Простаивающий dev-сервер подходит под все признаки беглого процесса: он занимает много памяти, работает уже часами и не использует процессор между запросами. Следят только за дочерними процессами терминалов агентов, поэтому ваши dev-команды по построению вне периметра.
Может ли он завершить самого агента?
Нет. CLI агента защищён при любом провайдере, и защита опирается на бинарник, которым приложение запустило этот терминал, а не на список известных имён. Оболочка и терминальный помощник самого приложения исключены тоже.
Что такое процесс-сирота и почему к нему особое отношение?
Процесс, чей родитель завершился, теряет связь с агентом, который его запустил, и подчищать его будет некому. Как именно рвётся эта связь, зависит от системы: классический Unix переподчиняет его процессу init, Linux на десктопе отдаёт его вашему пользовательскому менеджеру systemd, а Windows не переподчиняет ничего и оставляет после себя мёртвый идентификатор родителя. Поэтому AgentsRoom никогда не проверяет родителей. Он записывает принадлежность, пока процесс ещё привязан: это единственный момент, когда её можно установить, и считает сиротой всё, чего нет в живом дереве процессов, одинаково на всех трёх системах.
Сколько стоит сама эта слежка?
Один снимок процессов в минуту, замеренный примерно в 40 мс на машине с 824 процессами. Более дорогой замер памяти применяется только к процессам, которые уже выглядят зависшими, а при обычной работе это значит, что он не применяется. И пока ни один агент не активен, скана не существует вовсе.
Почему не посмотреть просто на колонку памяти в «Мониторинге системы»?
Потому что на macOS она занижает проблему на порядок. Процесс, вытесненный в сжатую память, может показывать 20 МБ резидентной, занимая при этом 8 ГБ. Один такой мы измерили вживую: 4,7 ГБ резидентной при реальном объёме 14 ГБ. Виртуальный размер не лучше: даже системные процессы показывают его сотнями гигабайт.
Работает ли это с Claude Code, Codex и остальными?
Да. Страж ничего не знает ни об одном конкретном инструменте или провайдере. Он следит за дочерними процессами того терминала агента, который вы запустили, а защищаемый CLI читается из самого запуска. Добавление провайдера здесь ничего не меняет.
Работает ли это на Windows и Linux?
Да. Каждой платформе нужно своё измерение, чтобы память не врала: сжатые страницы на macOS, резидентная плюс ушедшая в своп на Linux, приватная выделенная память на Windows. Все три реализованы.
Будет ли он завершать процессы, не спросив меня?
Только если вы это включите. По умолчанию он сообщает, что нашёл, с агентом, памятью, возрастом и загрузкой процессора, а решаете вы. Автоматическое завершение остаётся настройкой, выключенной из коробки.
Что происходит с агентом, когда я завершаю один из его процессов?
Агент продолжает работать. Его вызов инструмента получает ошибку вместо того, чтобы висеть вечно, и это именно тот исход, который вам нужен: этот процесс всё равно никогда бы не завершился. Ничего не перезапускается, и никакой контекст не теряется.
Устраняет ли это первопричину?
Нет, и он даже не пытается. Причины меняются: сегодня один инструмент, завтра другой шаблон, через месяц другой провайдер. Это страховочная сетка, и она рассчитана на то, чтобы продолжать работать, когда причина окажется такой, какой ещё никто не видел.
Двенадцать процессов, и ни один не превышает мой порог. Он вообще что-нибудь скажет?
Да, и именно из-за этого случая правило изменилось. Замерено на машине с 16 ГБ: двенадцать проверок типов, запущенных шестью агентами, от 0,84 до 1,72 ГБ каждая, все с запасом ниже порога в 2 ГБ, 15,4 ГБ вместе, своп забит, машина непригодна для работы. Если судить по одному, с каждой было всё в порядке. Как только сумма переходит половину вашей физической памяти, сообщается обо всех, сгруппированных под агентом, который их запустил.
Что на самом деле делает «Прервать агента»?
Она посылает Ctrl+C в терминал этого агента, то же самое нажатие, которое вы сделали бы сами. Текущий ход агента завершается, и он ждёт вас: он не закрыт, его сессия цела, и больше ничего на вашей машине не затронуто. Кнопка существует потому, что завершение процесса, пока агент над ним ещё работает, лечит только симптом: агент получает ошибку и часто просто запускает команду заново.
Вам может понравиться
Канарейка контекста
Другое раннее предупреждение: оно следит за контекстом самого агента, а не за машиной, и говорит вам, что агент дрейфует, до того как он начнёт выдумывать файлы и API.
Dev-терминалы
Запускайте свои dev-серверы и долгие команды прямо в AgentsRoom, с уведомлением, когда долгая команда закончилась. Это ровно те терминалы, которых страж процессов по замыслу не касается никогда.
Отслеживание статуса агентов
Одним взглядом видно, какие агенты работают, какие ждут вас, а какие простаивают, и ни одного терминала читать не нужно.
Расход токенов
Другой ресурс, за которым стоит следить. Потребление токенов и квота по каждому агенту, чтобы вы знали, куда уходит ваш лимит.
Сплит-вид
Несколько агентов бок о бок в одном окне, у каждого своя панель, свой цвет и свой статус вживую.
CLI Doctor
Когда агент не может стартовать, он говорит вам, почему и что с этим делать, вместо того чтобы оставить вас перед пустым терминалом.
Хватит платить за процессы, которыми никто не пользуется
AgentsRoom бесплатен для скачивания, а страж процессов работает с первого запуска.
Приложение-компаньон: следите за агентами на ходу
Используйте Claude, Codex, Antigravity CLI или другого поставщика AI.
Отправляйте баги и запросы прямо в ваш публичный бэклог.