Как узнать, из-за чего rphost и SQL Server потребляют всю оперативную память, и как устранить утечки?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Каждый системный администратор и разработчик 1С рано или поздно сталкивается с ситуацией, когда серверное оборудование начинает работать на пределе своих возможностей из-за лавинообразного потребления оперативной памяти. Основными «виновниками» этого процесса традиционно выступают рабочий процесс сервера 1С (rphost) и процесс СУБД (например, sqlservr.exe).

В этой статье мы подробно и по шагам разберем, как локализовать утечку памяти, настроить кластер 1С для автоматического предотвращения подобных проблем, правильно сконфигурировать MS SQL Server и выявить проблемный программный код, который заставляет систему «съедать» все доступные ресурсы.

Шаг 1. Оперативная диагностика активных сессий через консоль кластера

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

  1. Определяем PID проблемного процесса. Откроем Диспетчер задач Windows (или утилиту htop в Linux) и перейдем на вкладку подробностей. Найдем процесс rphost, который потребляет аномальный объем памяти, и зафиксируем его идентификатор процесса (PID).
  2. Сопоставляем PID с рабочим процессом в 1С. Откроем консоль администрирования кластера 1С, перейдем в ветку «Рабочие процессы» и найдем там строку, у которой в колонке «Порт» или свойствах указан зафиксированный нами PID.
  3. Анализируем сеансы. Перейдем в ветку «Соединения» или «Сеансы». Отфильтруем список по рабочему процессу. Здесь мы сможем увидеть детальную аналитику по каждому пользователю: объем захваченной памяти, время последнего вызова и количество переданных данных.
  4. Увеличиваем интервал сбора статистики. По умолчанию счетчик потребления ресурсов в консоли 1С может показывать усредненные или мгновенные данные (в рамках текущего серверного вызова). Чтобы увидеть реальную картину накопления ресурсов, в свойствах счетчика администрирования рекомендуется изменить длительность сбора данных. Попробуем установить длительность, например, в 7200000 миллисекунд (это ровно 2 часа). Это позволит наглядно идентифицировать «коварного» пользователя или «зависшее» фоновое задание, которое постепенно накапливает память.

Очень часто на практике встречается ситуация, когда пользователь запускает тяжелый отчет, понимает, что система зависла, и закрывает программу через Диспетчер задач на своем ПК. При этом на сервере 1С сессия остается активной, и запрос продолжает выполняться, продолжая неконтролируемо поглощать ОЗУ. Выявление таких «брошенных» сеансов — первоочередная задача администратора.

Шаг 2. Изоляция баз данных по отдельным рабочим процессам

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

Мы настоятельно рекомендуем настроить изоляцию информационных баз. Для этого выполним следующие действия в консоли кластера 1С:

  1. Откроем свойства локального кластера.
  2. В параметрах найдем настройки распределения рабочих процессов.
  3. Включим опцию создания отдельного процесса rphost под каждую информационную базу (задается через требования назначения функциональности или свойства рабочих серверов в зависимости от версии платформы).

Даже с учетом небольшого перерасхода памяти на запуск дополнительных процессов, мы получим колоссальное преимущество: каждая база будет работать в своем изолированном адресном пространстве. Если одна из баз начнет «течь», мы сможем безболезненно завершить конкретный процесс rphost, не затрагивая пользователей других баз данных.

Шаг 3. Настройка автоматического перезапуска рабочих процессов

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

Давайте настроим автоматическую утилизацию процессов в свойствах нашего кластера:

  1. Интервал перезапуска. Установим значение в 86400 секунд (ровно одни сутки). Это заставит сервер 1С раз в день мягко обновлять рабочие процессы.
  2. Как это работает на практике? Сервер 1С не убивает процесс мгновенно. Он запускает новый «чистый» rphost, перенаправляет новые сеансы на него, а старый процесс переводит в режим выключения. Как только все активные вызовы в старом процессе завершатся, он закроется автоматически.
  3. Допустимый объем памяти. В свойствах кластера можно указать лимит памяти для одного процесса (например, 4-8 ГБ).
  4. Интервал превышения допустимого объема памяти. Зададим интервал, например, в 60 секунд. Если процесс превышает лимит дольше этого времени, кластер инициирует его мягкий перезапуск.

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

Шаг 4. Глубокий анализ утечек с помощью Технологического журнала

Если административные меры не помогают полностью решить проблему и память продолжает уходить слишком быстро, необходимо локализовать конкретную программную причину. Обычный Журнал регистрации 1С здесь не поможет — он фиксирует только бизнес-события. Нам понадобится Технологический журнал (ТЖ).

Давайте настроим файл конфигурации ТЖ logcfg.xml для сбора информации об утечках памяти. Нам потребуются события LEAKS, MEM и CALL.

Рассмотрим пример настройки файла конфигурации:


<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\v8\logs" history="24">
        <event>
            <eq property="Name" value="LEAKS"/>
        </event>
        <event>
            <eq property="Name" value="MEM"/>
        </event>
        <event>
            <eq property="Name" value="CALL"/>
            <gt property="Memory" value="104857600"/>
        </event>
        <property name="all"/>
    </log>
    <leaks collect="1"/>
</config>

Давайте разберем, за что отвечают эти параметры:

Шаг 5. Анализ типичных программных причин утечек памяти

Чаще всего в прикладных решениях 1С память «течет» из-за нескольких классических ошибок разработчиков. Давайте проанализируем их:

  1. Циклические ссылки в коде. Сборщик мусора 1С автоматически удаляет объекты, на которые больше никто не ссылается. Однако если Объект_А ссылается на Объект_Б, а Объект_Б одновременно ссылается на Объект_А, возникает циклическая ссылка. Такие объекты навсегда остаются в памяти процесса rphost до его перезапуска. Избегайте перекрестных ссылок при проектировании сложных алгоритмов.
  2. Незакрытые временные таблицы. При активной работе с объектом МенеджерВременныхТаблиц внутри циклов или сложных процедур разработчики часто забывают очищать ресурсы. Временные таблицы хранятся в оперативной памяти сессии. Посмотрим на правильный пример работы:

МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

// ... Выполнение запросов, создание временных таблиц ...

// Обязательное закрытие менеджера для освобождения оперативной памяти!
МенеджерВТ.Закрыть();
  1. Зависание Полнотекстового поиска (ПТП). В моменты слияния индексов полнотекстового поиска процесс rphost может лавинообразно увеличивать потребление ОЗУ. Если функционал ПТП не критичен для пользователей, его рекомендуется отключить в настройках базы либо перенести регламентное задание по обновлению индекса на глубокую ночь.
  2. Внешние компоненты и COM-соединения. Работа с файлами Excel, библиотеками криптографии или торговым оборудованием через COM-объекты часто оставляет «хвосты» в памяти. Всегда явно уничтожайте ссылки на внешние объекты, присваивая им значение Неопределено сразу после завершения работы с ними.

Шаг 6. Настройка лимитов оперативной памяти для MS SQL Server

Поведение СУБД MS SQL Server по умолчанию спроектировано так, чтобы задействовать максимум доступных аппаратных ресурсов сервера. Если не ограничить аппетиты SQL Server, он постепенно заберет всю свободную память под свой буферный пул (кэш данных), лишив рабочий процесс 1С необходимого пространства для маневра. Это неизбежно приведет к си сильному замедлению работы всей системы и регулярному аварийному завершению процессов rphost.

Давайте выполним базовую настройку лимитов СУБД:

  1. Откроем SQL Server Management Studio (SSMS) и подключимся к нашему серверу СУБД.
  2. Нажмем правой кнопкой мыши на корень сервера и выберем пункт «Свойства» (Properties).
  3. Перейдем на страницу «Память» (Memory).
  4. Найдем параметр «Максимальный размер памяти сервера» (Maximum server memory). По умолчанию там установлена астрономическая цифра.
  5. Рассчитаем лимит по следующей формуле: [Общий объем ОЗУ на сервере] минус [Резерв под ОС (минимум 4 ГБ)] минус [Средний пиковый объем, требуемый процессам 1С (rphost + rmngr)].
  6. Укажем полученное значение в мегабайтах и сохраним настройки. Изменения вступят в силу немедленно, перезапуск службы SQL Server не требуется.
  7. Также рекомендуется настроить групповую политику ОС Windows Lock Pages in Memory (Закрепление страниц в памяти) для учетной записи, под которой запущена служба SQL Server. Это предотвратит сброс кэша SQL в медленный файл подкачки на диске в моменты резких скачков потребления памяти со стороны платформы 1С.

Применяя данные рекомендации в комплексе — изолируя базы данных, настраивая мягкий перезапуск рабочих процессов, ограничивая аппетиты СУБД и анализируя утечки через Технологический журнал — мы сможем обеспечить стабильную, быструю и бесперебойную работу всей системы 1С:Предприятие.

← На главную