Рабочий процесс съедает память. Как найти и что выставить в кластере

19.08.26

База данных - HighLoad оптимизация

Сводная таблица показывала загрузку диска 97-99 % каждый день, и вывод напрашивался сам: диск упирается в потолок, надо расширять. Среднее по тому же ряду оказалось 4,24 %, а выше 80 % диск был в семи пятиминутных интервалах из 2016 - по одному на каждую ночь недели, это окно резервного копирования. В потолок диск не упирается. Потом тот же метод соврал в обратную сторону: на прореженном до пяти минут ряде исчезли пятнадцатисекундные провалы свободного места до 27 мегабайт. Одна ошибка чтения графиков дала два противоположных ложных вывода из одних данных. Настоящее узкое место сидело в памяти, и находок там две: растущий рабочий процесс сервера приложений и мёртвые сеансы терминального сервера. Разбираю, какие свойства кластера это ограничивают, какие три таймаута проверить, и показываю место, где мой собственный расчёт не сошёлся на три с половиной гигабайта.

Один рабочий процесс сервера приложений вырос с 7,22 до 12,72 гигабайта за одиннадцать суток. Ровно полгигабайта в сутки, темп держится линейно. Сбрасывается только перезагрузкой, потому что лимиты памяти в кластере не выставлены вообще.

Это первая из двух находок разбора, и обе оказались про память. Искали при этом процессор.

Вторая находка дешевле и обиднее: шесть мёртвых сеансов терминального сервера держат около десяти гигабайт круглосуточно, а лечится это одной настройкой политики, без единой строчки кода.

Но самое полезное здесь то, как мы чуть не ушли не туда: график честно показывал другое узкое место, и мы почти поверили.

 

Машина, на которой это происходит

Одна виртуальная машина: четыре ядра, 32 гигабайта памяти. На ней одновременно живут сервер терминалов, сервер приложений 1С 8.3.27, локальная СУБД PostgreSQL 18, толстые и тонкие клиенты, браузеры пользователей.

Совмещение спорное, но так сложилось. Важно следствие: при такой конфигурации процессор физически не может стать узким местом раньше памяти. Каждый пользовательский сеанс здесь стоит гигабайты и десятки мегагерц. Память кончится первой всегда.

Наблюдение - две недели, шаг метрик - пятнадцать секунд.

 

Гипотеза, которую пришлось отбросить

Начинали мы совсем с другого вывода, и он был красивый.

Первым делом посмотрели сводную таблицу суточных максимумов. Дисковая подсистема - 97-99 % каждый день, без исключений. Читается однозначно: диск постоянно упирается в потолок, не справляется, надо расширять. На этом месте обычно и заканчивают: вывод удобный, объясняет всё разом и упирается в бюджет.

Потом посчитали среднее. 4,24 %.

Разрыв в двадцать три раза - сам по себе диагноз: ресурс свободен, просто у него есть короткий пик, и именно пик попадает в максимум.

Дальше посчитали долю времени выше порога. За неделю наблюдений диск был выше 80 % в семи пятиминутных интервалах из 2016. Треть процента времени.

2016 - это неделя, нарезанная по пять минут. Семь интервалов на семь суток - ровно по одному на ночь: ночное окно резервного копирования, около шести минут по журналу.

Ни в какой потолок диск не упирается. Есть бэкап, который делает свою работу и в эти минуты занимает диск целиком, как и положено.

Практический вывод, и он стоит всей статьи. Суточный максимум - худшая из доступных метрик, чтобы судить о перегрузке. Он сообщает, что ресурс *однажды* был занят, и молчит о том, сколько времени. Правильный порядок чтения: сначала среднее, потом доля времени выше порога, и только потом максимум, уточнением к первым двум. Сам по себе он не значит почти ничего.

 

Та же ошибка в другую сторону

Метод врёт и в другую сторону.

Чтобы графики строились быстрее, ряд прореживали до пятиминутного шага: одно значение на интервал. На таком ряде свободное место на диске выглядело спокойно.

На сыром пятнадцатисекундном разрешении видно, что почти каждый день свободное место проваливается до 27-450 мегабайт. Это минимум по дням, и брать из такого диапазона надо нижнюю границу. 27 мегабайт свободного места - состояние, из которого база уже не пишется.

Механика простая: пятнадцатисекундное событие попадает в пятиминутную выборку примерно один раз из двадцати. Минимум по прореженному ряду минимумом только называется - по факту это случайное значение из интервала.

И вот главное. Одна и та же ошибка метода дала два противоположных ложных вывода из одних и тех же данных: «диск загружен постоянно» там, где он свободен, и «со свободным местом всё хорошо» там, где оно кончалось. Прежде чем спорить о выводах, спросите, на каком разрешении построен график и какая величина по нему считалась. Половина споров про производительность после этого вопроса просто заканчивается.

 

Находка первая: рабочий процесс растёт и не отдаёт

Рабочий процесс сервера приложений - один экземпляр. За одиннадцать суток его потребление выросло с 7,22 до 12,72 гигабайта, ровно полгигабайта в сутки.

Рост линейный, без ступеней и без плато, сброс только перезагрузкой сервиса.

Лимиты памяти рабочих процессов в кластере не выставлены ни одного. Встроенный механизм, который должен был это ограничить, просто выключен - свойства придётся заполнять с нуля.

Скажу сразу: полгигабайта в сутки - это симптом. Что именно не освобождается, мы не нашли. Лимиты и перезапуск - обвязка вокруг проблемы: она не даёт росту уронить сервер и ничего не лечит.

 

Что выставить в кластере

Механизм живёт в свойствах рабочего сервера в консоли администрирования кластера. Соседний случай, когда процесс вместо роста внезапно падает, лечится совсем другим: там нужны дампы и обращение в поддержку, разбор лежит отдельно. Рабочему процессу задаётся порог потребления и интервал превышения: когда процесс держится выше порога дольше интервала, кластер перестаёт отдавать ему новые соединения, дожидается завершения текущих и поднимает рядом новый процесс. Пользователь при удачном раскладе этого не замечает.

Смотреть надо на четыре свойства - отрабатывают они в разных ситуациях.

«Объём памяти рабочих процессов, до превышения которого сервер считается производительным» - мягкий порог, с которого начинается вежливый перезапуск. Считается от объёма машины: суммарный потолок процессов должен оставлять запас системе, СУБД и клиентам, если они на той же машине. При 32 гигабайтах и одном процессе порог заметно ниже двенадцати - там, где рост ещё не мешает соседям.

«Интервал превышения допустимого объёма памяти» - сколько секунд превышение терпится. Он нужен, чтобы не перезапускать процесс на разовом всплеске: тяжёлый отчёт имеет право съесть память на минуту и вернуть её. Отталкиваться стоит от темпа роста: при полугигабайте в сутки счёт идёт на часы, минутные интервалы тут ни к чему.

«Максимальный объём памяти рабочих процессов» - жёсткий потолок, аварийный стоп. В норме он срабатывать не должен, поэтому вплотную к мягкому порогу его не ставят: нужен зазор, в котором мягкий механизм успеет отработать.

«Безопасный расход памяти за один вызов» - лимит на один серверный вызов. Ловит запрос, который решил поднять в память полбазы; до постепенного роста ему дела нет. Выставить его всё равно стоит: без него один неудачный отчёт кладёт процесс вместе со всеми, кто в нём сидел.

Отдельно - число рабочих процессов. Один процесс на установку означает, что его перезапуск виден всем сразу; два и больше дают кластеру переселять соединения. Прямой настройки «сделать три» нет: новый процесс поднимается сам, когда упирается в «Количество информационных баз на процесс» или «Количество соединений на процесс». Каждый процесс сам стоит памяти, так что за плавность перезапусков платим гигабайтами.

 

Как поймать такой рост у себя

Отдельный инструмент не нужен: снимайте потребление процессов сервера раз в минуту чем угодно и храните месяц. Смотрите на наклон линии, текущее значение само по себе не говорит ничего. Выросла за неделю и ни разу не спустилась к исходной точке - та же история. Ступеньки вниз - память возвращается, это нормальная работа под нагрузкой.

Один нюанс. После перезагрузки сервиса ряд начинается с чистого места, и на графике за месяц с перезагрузками каждую неделю рост выглядит как безобидная пила. Наклон считайте внутри отрезка между перезагрузками. По всему окну он смажется до нуля.

 

Находка вторая: десять гигабайт за одну настройку

Отключённые сеансы терминального сервера не завершались никогда. Все три таймаута политики выставлены в ноль, а ноль здесь означает «бесконечно». Ошибка ровно на этом и держится: администратор видит нули и читает их как «ограничений нет».

Итог: шесть мёртвых сеансов держали 9-11,6 гигабайта круглосуточно. Полтора-два гигабайта на сеанс с толстым клиентом и открытым браузером - нормальная цена.

Это самое дешёвое исправление всего разбора: одна настройка политики возвращает треть памяти машины, в прикладном коде не меняется ничего.

Проверьте свои три таймаута - групповая политика, ограничения сеансов узла удалённых рабочих столов:

  • ограничение по времени для отключённых сеансов - это про пользователя, который закрыл окно крестиком и ушёл;
  • ограничение по времени для активных, но бездействующих сеансов - про открытую сессию, в которой никто ничего не делает;
  • ограничение по времени для активных сеансов - самое агрессивное, его как раз стоит трогать осторожно.

Первые два - это память, лежащая мёртвой круглые сутки. Рядом отдельный параметр: завершать сеанс при достижении лимита или только отключать. «Отключать» вернёт сеанс в первую категорию, так что настраивать их надо парой.

 

Честная поправка к собственному объяснению

Теперь то, что обычно вырезают из таких статей.

В середине наблюдения был день с провалом производительности. Объяснение напрашивалось само: рабочий процесс держит 12,7 гигабайта, мёртвые сеансы держат ещё десять, вместе 22,7 из 32, свободного почти нет, отсюда и провал.

Объяснение красивое и арифметически неверное. Пик 12,72 гигабайта - это одиннадцатые сутки, а провал случился на пятые. На дату провала рост давал 7,22 плюс четыре дня по полгигабайта, то есть около 9,2 гигабайта. Вместе с сеансами получается 19,2 вместо 22,7 - на три с половиной гигабайта меньше.

И вот что из этого следует. Свободного по такому расчёту оставалось около 12,8 гигабайта, а фактически доступно было 3,15. Значит на дату провала ещё примерно девять с половиной гигабайт съело что-то третье - клиенты, браузеры или локальная СУБД, и в разборе это не закрыто.

Механизм в исходном объяснении был верный. Числа к нему взяли с конца периода и приложили к событию из середины. Ошибка типичная и незаметная: когда объяснение уже сложилось и всем понравилось, проверять его арифметику никто не идёт. Заметил я это только потому, что полез считать остаток свободной памяти для другой цели.

Косвенное подтверждение, что памяти действительно не хватало: выделено 33,49 гигабайта при 32 физических. При таком превышении подкачка обязана включиться, и в отчёте она зафиксирована. Чинить надо не её.

 

Что мешало разбору и стоит проверить заранее

Три вещи, каждая стоила времени.

Служба сбора метрик не поднимается после перезагрузки и умирает молча. Отложенный автозапуск не укладывается в тридцатисекундный тайм-аут менеджера служб, действия восстановления не заданы. Результат: дыры в рядах ровно там, где интереснее всего - сразу после перезагрузок.

Служба администрирования кластера не зарегистрирована, консольная утилита не отвечает, настройки приходится читать из файла кластера. Плюс ловушка в именах: одноимённые системные службы Windows к 1С отношения не имеют, а в списке служб выглядят так, будто всё на месте.

Мониторинга сеансов прикладной системы нет, правил оповещения ноль. Плюс исходящий трафик к сервису уведомлений с этой машины не проходит: даже настроенное правило ничего бы не доставило. Канал доставки проверяйте в тот же день, когда завели первое правило.

 

Чего в этом разборе нет

Причина роста памяти не найдена. Есть темп и линейность, нет ответа, что именно не освобождается. Лимиты только страхуют.

Нет измеренного «после» ни по одной из двух находок. Таймауты и лимиты - предложения на момент разбора, обещать результат в гигабайтах не могу.

Доля времени выше порога посчитана по неделе, а наблюдение шло две. На полном окне она вдвое меньше, то есть вывод «диск свободен» только крепнет, но само число к другому окну не применяйте.

 

Другие наши инструменты диагностики 1С:

  • Чек-ап СУБД под 1С - на такой же совмещённой машине СУБД стоит рядом с сервером приложений и ест ту же память: 40 с лишним проверок с вердиктом, что настроено не так.
  • Карта объёмов базы 1С - если следом за памятью кончается диск, начинать надо с того, из чего база вообще состоит.

Вопрос в зал. Полгигабайта в сутки на рабочий процесс - многие живут с таким и перезапускают по расписанию. Кто-нибудь докапывался до настоящей причины? Интересно, чем она обычно оказывается.

Вступайте в нашу телеграмм-группу Инфостарт

утечка памяти 1С рабочий процесс rphost лимиты памяти кластера перезапуск рабочего процесса таймауты RDP-сеансов терминальный сервер 1С суточный максимум средняя утилизация разрешение метрик узкое место производительность 1С PostgreSQL на одной машине

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Сервера Системный администратор Программист 1С 8.3 Абонемент ($m)

Два калькулятора расчета железа (процессоры, память, диск) в зависимости от количества пользователей и размера базы для разделенных и совмещенных серверов 1С и СУБД, а также расчета терминального сервера. Описаны формулы расчета и обоснования выбора.

1 стартмани

16.02.2026    8536    115    sapervodichka    31    

93

HighLoad оптимизация Программист 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    13878    ivanov660    48    

56

Администрирование веб-серверов Сервера Нейросети Программист Платные (руб)

Сервер поиска по метаданным и поиска по коду, Сервер экспорта и поиска по документации, Сервер синтаксической проверки кода

17.06.2025    17039    0    Infostart    20    

113

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    14931    ivanov660    39    

62

Сервера Системный администратор Бесплатно (free)

На первый взгляд, добавление второго сервера в кластер 1С не должно вызывать проблем – все просто должно работать. Но на практике дело обстоит иначе. Несмотря на то, что все действительно работает, многие при этом сталкиваются с трудностями. Расскажем, когда нужно задуматься о втором сервере 1С в кластере, какие особенности работы второго сервиса с файлами и сервисами, и какие настройки ТНФ можно сделать для лицензий ПРОФ и КОРП.

31.10.2024    35383    a.doroshkevich    23    

89

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    17454    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    23532    Evg-Lylyk    73    

46
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1850 19.08.26 14:33 Сейчас в теме
Вопрос в зал. Полгигабайта в сутки на рабочий процесс - многие живут с таким и перезапускают по расписанию. Кто-нибудь докапывался до настоящей причины?

встречал подобное после обновления платформы 1с+после обновления модулей Контура. до причины не "докапывался"
2. nedomolkov.ivan 164 21.08.26 07:57 Сейчас в теме
(1) Про Контур это как раз то, чего мне не хватало, спасибо. Внешние компоненты сюда очень
подходят: они живут в адресном пространстве rphost, платформа их память в свой лимит считает,
а освободить не может. Отсюда и картина, когда после обновления модулей рост начинается,
а виноватого внутри 1С не видно.

Развести подозреваемых можно дёшево, не докапываясь до причины. Ставим количество
информационных баз на процесс = 1, базу с Контуром отправляем в свой rphost и смотрим неделю:
растёт он один или все. Если один, дальше отключаем компоненту на день и сравниваем наклон.

У себя точную причину я тоже не назвал, поэтому и живу с перезапуском. Разница только в том,
по чему он срабатывает: порог с интервалом превышения делает перезапуск управляемым, процесс
не падает в разгар дня, а тихо доживает свои соединения и уходит.

А вы перезапускаете по расписанию или по порогу?
3. RustIG 1850 21.08.26 09:52 Сейчас в теме
(2)
А вы перезапускаете по расписанию или по порогу?

раз в неделю смотрю диспетчер задач и перезапускаю... кто-то ИИ запускает, а кто-то ручками сервер перезапускает, уведомив всех пользователей выйти из всех 1с...
все хвалят ядро и независимость контуровских обработок, а сами они отладить через отладчик не могут - запаролено у них часть модулей.... ну и я не могу... да там, бесполезно, много фоновых процессов запускаются.... не факт, что они корректно освобождают память
4. RustIG 1850 21.08.26 09:56 Сейчас в теме
(2)
Если один, дальше отключаем компоненту на день и сравниваем наклон.

никто не даст отключить компоненты даже на час в рабочее время - да и потом, что мы потом с результатом делать будем? - ничего не предъявим контуру.
Тут на ИС есть разработчики Контура, вроде как откликаются на все запросы пользователей и реагируют на замечания ...Но я понимаю, как устроена разработка и сопровождение, поэтому не лезу в спор - нужно предъявить железобетонные аргументы
5. RustIG 1850 21.08.26 10:13 Сейчас в теме
(2)
Про Контур это как раз то, чего мне не хватало, спасибо.

https://infostart.ru/profile/458069/
https://infostart.ru/profile/546252/
Для отправки сообщения требуется регистрация/авторизация