Каждый администратор и разработчик 1С рано или поздно сталкивается с ситуацией, когда стабильно работающий сервер начинает давать сбои. Сценарий обычно выглядит одинаково: внезапно замедляется или прерывается обмен данными, разработанный с помощью конфигурации «Конвертация данных», перестают отправляться электронные счета-фактуры (ЭСФ), а пользователи начинают жаловаться на регулярные вылеты программы. При этом перезапуск службы сервера 1С временно решает проблему, но через некоторое время всё повторяется.
В этой статье мы подробно проанализируем причины возникновения подобных сбоев, разберем взаимосвязь между процессами платформы 1С и СУБД, а также предоставим пошаговое руководство по оптимизации системы для предотвращения утечек оперативной памяти.
Рассмотрим классическую ситуацию. Сервер укомплектован достаточным объемом оперативной памяти (ОЗУ загружена примерно на 80%), твердотельные накопители (SSD) заполнены наполовину, однако при выполнении регламентных операций возникают ошибки. Основными триггерами сбоев выступают два процесса:
HRESULT=80004005 или «Соединение с сервером баз данных разорвано администратором»).Попытки решить проблему «в лоб» — например, через тестирование и исправление (ТиИ) базы данных, сжатие таблиц в MS SQL Server или увеличение количества рабочих процессов 1С — зачастую либо не дают результата, либо усугубляют ситуацию. Давайте выясним истинные причины такого поведения системы.
Проанализируем специфику лицензирования платформы «1С:Предприятие 8.3». Использование лицензии уровня ПРОФ (в терминах пользователей — «не КОРП») накладывает серьезные технологические ограничения на администрирование кластера 1С:
0 или -1). Настройки вроде «Максимальный объем памяти рабочих процессов» или «Безопасный расход памяти за один вызов» игнорируются или приводят к аварийной остановке процессов при попытке их ручного изменения.rphost.exe. Однако в более ранних версиях платформы процесс падал целиком, увлекая за собой сеансы десятков других пользователей.Часто в попытках стабилизировать отправку ЭСФ или ускорить работу системы администраторы увеличивают количество рабочих процессов в свойствах кластера 1С. Разберем по шагам, почему этот шаг может оказаться фатальным для производительности:
rphost снижает нагрузку на каждый отдельный процесс. Если один из них падает из-за нехватки памяти, пользователи, работающие на других процессах, продолжают сеанс без потери данных.rphost требует для своего старта от 200 до 500 МБ оперативной памяти только под системные нужды и дублирование кэша метаданных. Если физическая память сервера уже загружена на 80%, создание дополнительных процессов провоцирует нехватку ОЗУ. Операционная система Windows Server начинает активно сбрасывать данные из оперативной памяти в файл подкачки (swapping) на диск. Даже быстрые SSD-накопители не способны компенсировать скорость ОЗУ, из-за чего вся система начинает критически тормозить, а процессы 1С аварийно завершаются по таймауту.Ошибки вида HRESULT=80004005 напрямую указывают на разрыв физического или логического соединения между сервером приложений 1С и СУБД. Выясним, почему это происходит:
По умолчанию СУБД MS SQL Server настроена так, чтобы захватывать всю доступную оперативную память на сервере под свой буферный пул (Buffer Pool). Если сервер 1С и SQL-сервер установлены на одной физической или виртуальной машине (что является частой практикой), то со временем SQL Server вытеснит процессы 1С.
Когда рабочий процесс rphost пытается выполнить ресурсоемкую операцию (например, прочитать в память XML-файл размером в несколько гигабайт), он запрашивает у операционной системы свободные блоки ОЗУ. Не найдя свободной памяти, операционная система или сам SQL Server аварийно прерывают транзакцию, что приводит к разрыву соединения и падению сеанса 1С.
Решение: Обязательно установите жесткий лимит на максимальный объем памяти для SQL Server (параметр Max Server Memory в SQL Server Management Studio). Оставьте операционной системе и процессам 1С минимум 4–8 ГБ свободной физической памяти (в зависимости от количества активных пользователей и регламентных заданий).
Электронные счета-фактуры представляют собой одну из наиболее «прожорливых» подсистем в современных конфигурациях 1С. Это обусловлено следующими факторами:
rphost. После завершения сеанса отправки память не возвращается операционной системе в полном объеме. Именно поэтому перезапуск службы 1C:Enterprise 8.3 Server Agent временно устраняет проблему.Если сбои при загрузке данных начались непосредственно после изменения правил обмена, проблема кроется в коде обработчиков событий КД. Проанализируем типичные ошибки разработчиков:
Отсутствие транзакционности: По умолчанию универсальная обработка загрузки данных может пытаться записать огромный массив информации одной транзакцией. Это приводит к колоссальной нагрузке на кэш СУБД и оперативную память сервера приложений.
Для исправления этой ситуации при запуске загрузки обязательно используйте транзакции. Настройте обработку загрузки, установив флаг «Использовать транзакции» и задав оптимальное количество объектов в одной транзакции (рекомендуемое значение — от 100 до 500 объектов).
Ошибки в обработчиках событий КД: Проверьте код в обработчиках «Перед загрузкой», «При загрузке» и «После загрузки» правил обмена. Избегайте написания запросов внутри циклов обхода загружаемых объектов. Например, следующий код является крайне неоптимальным:
// НЕПРАВИЛЬНО: Запрос выполняется для каждого загружаемого объекта
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код = &Код";
Запрос.УстановитьПараметр("Код", СтрокаТЧ.Артикул);
// Выполнение запроса в цикле приводит к утечке памяти и росту времени загрузки
КонецЦикла;
Вместо этого используйте кэширование данных во временные таблицы или осуществляйте поиск объектов стандартными механизмами платформы 1С.
Циклические ссылки: Убедитесь, что логика поиска и сопоставления объектов не создает бесконечных рекурсивных вызовов (когда объект «А» при загрузке инициирует поиск объекта «Б», который, в свою очередь, ссылается на «А»). Это гарантированно приводит к переполнению стека и падению процесса rphost.
Для устранения проблем с памятью на сервере выполните следующие действия:
rphost, ориентируйтесь на формулу: 1 рабочий процесс на каждые 30–50 пользователей).