Ошибка при загрузке данных превышен максимальный расход памяти сервера за один вызов

Обновлено: 05.07.2024

Как я уже писал предыдущей статье Настройка кластера 1С 8.3 (ч. 1) , в кластере 1С Предприятие 8.3 значительно расширились настройки для оптимизации производительности.

При этом, важно отметить, что за счет большого количества параметров, которые за частую в 95% ситуаций не используются, настройка стала и сложнее.

Основные настройки сервера в кластере 1С 8.3

Диапазоны ip-портов:

Диапазон портов рабочих процессов. Можно расширить, если сеансов очень много (несколько тысяч) и портов на все соединения не хватает, то целесообразно расширить этот диапазон.

Настройка сервера в кластере 1С 8.3. Диапазоны портов Настройка сервера в кластере 1С 8.3. Диапазоны портов
Так же такая ситуация может возникнуть при нагрузочном тестировании, например на 5000 онлайн пользователей и более.

Параметры рабочих процессов и количество соединений на процесс:

Рекомендуется оставлять по умолчанию. Изменять есть смысл только тогда, когда много слабо нагруженных баз, можно увеличить их количество на 1 процесс, чтобы не плодить rphost-ы.

Настройка сервера 1С 8.3. параметры рабочих процессов Настройка сервера 1С 8.3. параметры рабочих процессов

Так же целесообразно изменять настройку в случае, если есть одна очень нагруженная база, и лучше под нее выделить отдельный процесс, указав на одном из серверов 1 базу на 1 процесс.

Безопасный расход памяти за 1 вызов:

Данная настройка используется очень редко и рекомендуется оставлять значения по умолчанию.

"Срабатывание" настройки делится на несколько этапов:

  1. Критический объем памяти процессов;
  2. Безопасный расход памяти за один вызов;
  3. Временно допустимый объем памяти процессов;
  4. Интервал превышения допустимого объема памяти процессов.
Если превышает указанное значение, то пользователь получит ошибку «Недостаточно памяти для выполнения операции».

Центральный сервер (ЦС):

Определяет, является ли сервер центральным, т.е.:

  1. через который можно подключиться к кластеру.
  2. на котором работает главный менеджер кластера.
Именно ЦС указывается при подключении к базе данных (к кластеру).

Второй центральный сервер 1С 8.3

Если мы указываем два ЦС в рамках одного кластера, то получаем две точки входа в кластер. Если 1 ЦС умрет, то будет работать второй ЦС. Для обеспечения такой функциональности, все данные кластера резервируются, таким образом, как следствие, повышается нагрузка на оборудование.

В отличие от уровня отказоустойчивости, в данном случае, даже при падении одного ЦС, кластер будет жить, а пользователи могут даже не заметить проблем.

Требования и назначения функциональности

Имеет смысл только если в кластере более 1 сервера. Дает возможность назначить конкретный сервис на конкретный сервер. После установки 1С , рекомендуется удалить локальный кластер (через панель администрирования), потому что он не используется.

Ниже рассмотрю ключевые сервисы, которые рекомендуется выделять.

Сервис лицензирования:

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

Так же не будет проблем с дублями используемых лицензий в случае "Уровня Отказоустойчивости" > 0.

Сервис заданий:

Дает возможность указать отдельный сервер для выполнения фоновых заданий. Таким образом снизить нагрузку на оперативную деятельность, а все расчеты вынести на фоновые задания на отдельную машину или виртуалку. Так же можно вынести выполнение фоновых заданий, например, на OS MS Windows, если требуется использование COM-объектов, таких как S Office или внешних компонент. При это большая часть кластера будет работать под Linux.

Сервис сеансовых данных / Сервис журналов регистрации / Сервис полнотекстового поиска:

Мы с Вами уже знаем, что самое важное для нас - это жесткий диск, потому что именно он зачастую является "бутылочным горлышком". Если перенести перечисленные сервисы на отдельный сервер с очень быстрым диском, то это значительно ускорит работу загруженного кластера.

Платформа 8.3.11.2924.
Клиент-сервер x64.
СУБД MSSQL.
ЗУП 3.1.4.161.
БП 3.0.57.17.
ОЗУ 16 ГБ.

Конфигурации типовые. При попытке синхронизации выскакивает следующее:
<code>
Возникла ошибка во второй информационной базе: : Ошибка при вызове метода контекста (ВосстановитьПравилаИзВнутреннегоФормата)
ОбработкаОбменаДаннымиВнешнееСоединение.ВосстановитьПравилаИзВнутреннегоФормата();
по причине:
Произошла исключительная ситуация (1C:Enterprise 8.3.11.2924): Превышен максимальный расход памяти сервера за один вызов
</code>
Чистил кэш, пробовал выставить "Безопасный расход памяти за один вызов" = -1. Безрезультатно.

На сервере сколько памяти? Этот показатель от объема оперативки рассчитывается.

16 гб на сервер с MS SQL и сервером приложений на x64 платформе ? На ультрабуки уже больше ставят.

(3) (4) Что, 8 гигов (если учесть, что половину сжирает SQL и всё остальное) недостаточно, чтобы выполнить синхронизацию? Раньше всё чудесно синхронизировалось.

(0) посмотрите файл обмена - может кто-то перепровел кучу документов и размер файла обмена резко вырос. Тогда могу предложить лишь вручную почистить регистрацию (сохранив список) и регистрировать вручную по нескольку документов, чтоб файл не был гигантский.
Еще можно посмотреть процедуру ВосстановитьПравилаИзВнутреннегоФормата() - что там используется для чтения? Например вместо методов читающих весь файл сразу - использовать читающие построчно.

(8) На системном диске ограничен - 800 МБ. На другом логическом диске не ограничен.

(9) К сожалению, не обладаю навыками программирования 1С. Да и конфигурации типовые - неохота снимать с поддержки.
А создаётся файл обмена? Я думал, данные перегружаются напрямую. Не подскажете, где его искать?

Попробуй выставить "Безопасный расход памяти за один вызов" = 16-20 гигабайтам. "-1" как то странно работает местами. Мне во всяком случае не помогало, пока рукам правильную цифру не поставил.

Наведи порядок в своей работе используя конфигурацию 1C "Управление IT-отделом 8"

С чего все началось. После перехода на версию платформы 8.3.18.1208 х64 и релиз ЗУП 3.1.17.135 перестали отправляться расчетные листки сотрудникам одним скопом (получателей 250+). А именно, начали ловить ошибку "Превышен максимальный расход памяти сервера за один вызов" (когда сеанс "отъедает" всю доступную серверу 1С оперативную память). В нашем случае, при отправке расчеток, формировалось фоновое задание, которое и расходовало всю доступную оперативную память. Обновление версии ЗУП до 3.1.17.138 и "танцы" с настройками сервера 1С не дали результата, отправился искать отладчиком "узкое" место встроенного языка, где происходит увеличение памяти.


На скрине представлен фрагмент типового кода конфигурации ЗУП 3.1.17.138 , логика приведенного цикла в формировании и сохранении результата отчета "Анализ начислений и удержаний" (расчетный листок) для каждого сотрудника.

Судить о том, что данный фрагмент является "узким" местом встроенного языка не берусь, но именно в этом месте, на каждой итерации цикла наблюдалось увеличение потребляемой оперативной памяти. И как следствие - появление ошибки указанной выше.

Решение. При рассылке отчетов типовым алгоритмом предусмотрено: формирование одного фонового задания, которое обеспечивает формирование и отправку результатов отчетов всем получателям. Так как памяти не хватает обрабатывать всех получателей за одно фоновое задание. Появилась идея формировать для каждого получателя отдельное фоновое задание (контролируя статус завершения фонового задания) и при этом минимально изменяя типовой алгоритм, в надежде, что когда нибудь это исправят. Результатом идеи и успешного решения поставленной задачи стало написанное расширение конфигурации. Логику и фрагменты которого распишу ниже.

Логика:

1. В имеющемся общем модуле перехватим типовую процедуру по формированию фонового задания для всего массива получателей и передадим в параметр создания фонового задания первый элемент массива получателей, затем сохраним исходный массив получателей и УИД задания во временном хранилище и хранилище общих настроек соответственно.

2. Далее подключим обработчик ожидания, который будет повторять создание фонового задания, пока массив получателей не будет пустым.

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

В данном фрагменте типового общего модуля "РассылкаОтчетовКлиент" перехватим процедуру "ВыбратьПолучателяЗавершение". В которой "ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат)" дает условный старт формирования фонового задания, посему перед этой строкой мы сохраняем наш массив получателей во временное хранилище, а так же необходимые дополнительные параметры. (помещаем во временное хранилище обязательно с параметром "Новый УникальныйИдентификатор", чтобы наш массив получателей жил на протяжении всего сеанса пользователя).

Т.к. подключить обработчик ожидания мы не можем в текущем общем модуле, создадим и перейдем для этого в глобальный модуль "ОжиданиеОбработчика()". (подробнее в "Пример кода и описание пункта 2." ниже)

После выполнения "ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат)" и еще ряда процедур, исполнение кода переходит в процедуру "ВыполнитьСейчасВФоне", которую мы так же перехватим в расширении:

В данном фрагменте проверяем, что текущая рассылка у нас по расчетным листкам, затем после формирования фонового задания сохраняем его УИД в хранилище общих настроек.

Описанный выше код прописываем в заимствованном в расширении типовом общем модуле "РассылкаОтчетовКлиент".

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

Значительное потребление памяти процессами кластера на сервере приложений

У кластера серверов 1С Предприятия есть несколько настроек перезапуска процессов по превышению порога памяти. Их можно найти в параметрах кластера в консоли администрирования(рис. 1).


Рис. 1. Параметры кластера.

Подробная информация по настройкам указана на странице ITS.

Рекомендуется всегда настраивать параметры

  • Допустимый объем памяти
  • Интервал превышения допустимого объема памяти
  • Выключенные процессы останавливать через

"Допустимый объем памяти" стоит устанавливать из расчета, того, что в случае срабатывания условия превышения показателя будет запущен ещё один процесс rphost того же объема, как при нормальной работе кластера серверов в этой информационной системе.

Например, на рабочем сервере имеем 12 Гб ОЗУ. Допустим для конкретной информационной системы характерен размер rphost около 3 Гб. В этом случае порог превышения памяти следует рассчитывать следующим образом:

"Допустимый объем памяти" = 12 ГБ - 2 Гб (объем, занимаемый процессами системы) - 3 Гб * 1 rphost (объем всех процессов rphost) = 7 Гб. Т.е. процесс rphost в худшем сценарии может вырасти до 7 Гб.

Для случая, когда у нас при штатной работе используются два процесса rphost.

"Допустимый объем памяти" = 12 ГБ - 2 Гб (объем, занимаемый процессами системы) - 3 Гб * 2 rphost (объем всех процессов rphost) = 4 Гб. Т.е. процесс rphost в худшем сценарии может вырасти до 4 Гб.

Такая рекомендация исходит из особенностей поведения в момент перезапуска процессов кластера. Как это происходит:

  • процесс rphost превышает "Допустимый объем памяти" в течение "Интервал превышения допустимого объема памяти" секунд, срабатывает условие перезапуска процессов кластера.
  • запускается "новый" процесс rphost
  • "старый" процесс rphost выключается, но не завершается
  • соединения назначаются на "новый" процесс rphost, который сразу полноценно включается в работу
  • "старый" процесс будет исполнять вызовы (которые ещё существуют) максимум в течение ещё "Выключенные процессы останавливать через" секунд, но не более того.
  • через время "Выключенные процессы останавливать через" "старый" процесс rphost завершается.
  • новый процесс полноценно работает

Т.е. в течение периода, указанного в "Выключенные процессы останавливать через" будет одновременно работать как минимум два процесса rphost: "старый" и "новый".

Не следует указывать "Допустимый объем памяти" меньше нормального рабочего объема памяти процесса rphost для вашей системы, т.к. противном случае у вас постоянно будут перезапускаться процессы кластера серверов.

  • Интервал превышения допустимого объема памяти
  • Выключенные процессы останавливать через

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

Чем больше значения указанных параметров, тем менее эффективен может оказаться механизм перезапуска процессов, но зато позволит "успешно выполнить" большее число вызовов.

Величина памяти конкретного сервера 1С, позволяющего работать в оптимальном режиме, зависит от многих факторов, в том числе:

  • кода конфигурации;
  • объема данных в таблицах;
  • количества и активности пользователей в системе.

В связи с этим размер необходимой оперативной памяти можно рассчитать только приблизительно: при наличии 10 работающих пользователей оптимальным будет 8 ГБ, но если их количество превышает 50, следует приобретать от 32 Гб.

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

Причины возникновения ошибки

В процессе работы с 1С 8.3 проблема «недостаточно свободной памяти на сервере» является одной из наиболее распространенных, что может быть вызвано рядом причин. Первая из них напрямую вытекает из вышесказанного ‒ отсутствие достаточной мощности.

Недостаточно свободной памяти на сервере 1С предприятия
Недостаточно свободной памяти на сервере 1С предприятия

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

Почему памяти может еще не хватать?

Нехватка памяти для осуществления всех процессов

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

Ошибки кодирования

При выполнении поставленных задач технические специалисты, обслуживающие сервер 1С, могут вносить изменения в программу. Зачастую такое кодирование не преследует цель упрощения, а только нагромождает сервер и замедляет его работу.

Ошибки программы

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

Как решить проблему «недостаточно свободной памяти на сервере 1С:Предприятия

Недостаточно свободной памяти на сервере 1С предприятия

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

Другие варианты решения проблемы

  • При работе используйте СУБД MS SQL, а не файлы dt.
  • Перенесите службы сервера 1С на другой компьютер или сервер.
  • Обновите платформу (конфигурацию). Обратите внимание: база перед этим должна быть выгружена!
  • Возможно, ваша версия FrameWork устарела, или попытка ее обновления была неудачной. В данном случае откатите сервер 1С и FrameWork к предыдущей версии, после чего повторите установку.
  • Сервер может выполнять слишком много заданий: проверьте это с помощью КонсольЗаданий.epf и отключите в случае необходимости.
  • Проведите тестирование базы данных в режиме Конфигуратора, а также ее физической целостности. Для осуществления последнего запустите файл ChDBFl.ехе из каталога установки программы.
  • Выполните оптимизацию кода и запросов (упростите их). Выше объяснялось, что загруженность программы напрямую влияет на объемы используемой ей памяти.

Бонус: «обманите программу»

Запустите командную строку Windows и нажмите Enter.

Перед вами откроется черное поле для ввода. Введите в нем команду, которая позволит увеличить ограничитель используемой памяти до 3,5 ГБ: «bcdedit/set increaseuserva 3500». Данный показатель может быть и другим, но увеличивайте его в пределах разумного

Недостаточно свободной памяти на сервере 1С предприятия

Перезагрузите компьютер. После этого проверьте сервер 1С на предмет повторного возникновения ошибки. Заданная величина ограничителя оказалась недостаточной? Вернитесь в пункт 2.

После устранения ошибки и выполнения необходимых действий в программе восстановите ограничитель. Для этого введите в командной строке команду «bcdedit/deletevalue increaseuserva». Не пренебрегайте этим пунктом!

Вышеуказанные пути решения не помогли? Обратитесь за квалифицированной помощью к специалистам.

Читайте также: