Зависание сервера 1С, или постоянное "Превышен максимальный расход памяти сервера за один вызов"

Часто наши клиенты задают вопросы по поводу стабильности работы сервера 1С:Предприятие и ошибки "Превышен максимальный расход памяти сервера за один вызов", которая появляется не периодически, а от случая к случаю, без явной закономерности. Что в этом случае делать и как эту проблему решить?

Первое, на что надо обратить внимание на объем общей оперативной памяти сервера, где установлен сервер 1С. Если ее и так мало, а нагрузка на этот сервер достаточно высокая (что бывает очень часто), то поздравляем, возможно вы нашли решение, которое описано в этой статье.

В 1С начиная с версии 8.3.10 (если не ошибаюсь) в настройках сервера 1С появилось несколько параметров, которые предназначены для повышение стабильности всей работы в целом. До этой версии 8.3.10 возможен был такой сценарий работы: все работают нормально, потом один из пользователей запускает "тяжелый" отчет или запрос и при этом нормально перестает работать как пользователь, который этот отчет запустил, так и все остальные. Ресурсы сервера используются по полной, а все остальные страдают. Разработчики платформы 1С в версии 8.3.10 пошли на закономерный шаг. Зачем терпеть одного пользователя, который вешает сервер? И это логично. Происходит завершение работы такого сеанса и пользователю показывается ошибка "Превышен максимальный расход памяти сервера за один вызов".

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

Давайте подумаем, а как же сервер определяет, что виновника надо "завершить"? Правильно, появились настройки для этого дела.



Максимальный объем памяти рабочих процессов – это объем совокупной памяти, которую могут занимать рабочие процессы (rphost) на текущем кластере. Если параметр установлен в 0 (ноль), то занимает 80% оперативной памяти сервера. Если задано конкретное число, то столько, сколько будет указано в байтах, а -1 (минус один) - эта настройка применяться не будет, т.е. не ограничивать максимальный объем. Если будет превышение, то будет задействован своп ОС и т,д., работа будет замедлена, но не остановлена.

Безопасный расход памяти за один вызов. В общем случае, отдельные вызовы не должны занимать всю оперативную память, выделенную рабочему процессу, как в примере. Если параметр установлен в 0 (ноль), то объем безопасного расхода будет равен 5% от «Максимального объема памяти рабочих процессов». Если задано конкретное число, то столько, сколько будет указано в этом числе байтами, а -1 (минус один) - без ограничения, что в общем случае, не рекомендуется.

При установке по умолчанию эти настройки равны нулю. Там есть еще настройки, но именно эти настройки завершают проблемные сеансы.
Это была теория. Теперь практика. Пусть у нас как и в большинстве случаев эти настройки установлены в 0 (ноль).

Как мы выяснили из примера выше, наш сервер имеет мало оперативной памяти, на нем работает много пользователей в 1С, возможно в кучу установлен и MS SQL, и Apache и это все на одной машине. Эта ситуация из-за экономии средств встречается очень часто. Денег потратили на оборудование мало, а от сервера хотим много. Предположим на сервере 16 Гб ОЗУ и 3 рабочих базы, в которых в общем случае работает 30 пользователей.
Общая память нарезается "колбаской" на все программы работающие на сервере. Все выкладки ниже и это чистой воды  приближенные цифры - не судите строго...
ОС вместе с Apache - пусть будет 1 Гб.
MS SQL - пусть будет выделено постоянно 5 Гб.
Итого остается 10 Гб на 1С.
Повторюсь порядок цифр оооочень приближенный. В реальности все может быть совершенно по другому, тут важен итог и выводы, которые мы сделаем на основании этих приближенных данных.
Продолжим, итого остается 10 Гб на 1С и процессы rphost.
10 Гб делим на 30 пользователей в онлайне и получаем ~300 Мб на каждый сеанс.
А как же фоновые задачи? А как же такая ситуация, когда пользователи могут запускать несколько сеансов? Потенциально это тоже "кушает" память и влияет на расчетную величину. Я к тому, что эта цифра может быть еще меньше в разное время и зависит от пиков работы и прочих факторов. Так же возникают вопросы, что будет если фоновое задание превысит эти 300 Мб?

Может ли по памяти сеанс одного из пользователей временами быть больше чем расчетные 300 Мб? Вообще легко! Память процессы rphost очень любят. Везде стоят по умолчанию в настройках "0" (ноль) и это означает, что сервер 1С будет завершать сеансы при нехватке памяти. Т.е., казалось бы, 1С сделала благое дело пытаясь помочь убрать из базы лишнюю нагрузку, которая блокирует работу остальных, но при таком раскладе как в примере, все это приводит к тому, что при слабых серверах страдают бессистемно вообще все. А самое забавное, что до версии 8.3.12 они ведь как-то работали?

Теперь далее, как эту ситуацию победить? Самое простое - это в настройках для этих опций установить -1 (минус один). Я осознаю, что это очень вредный совет. Во всех рекомендациях специалисты 1С крайне не советуют этого делать, но если все и так плохо, то почему бы не попробовать отключить эти настройки? Если поработав так пару дней, все будет более или менее, то почему нет?

 16.05.2019 
 Автор:
 зависание сервера, завершение работы, сеанс


Системные решения для 1С
Зависание сервера 1С, или постоянное "Превышен максимальный расход памяти сервера за один вызов"
SoftOnIT.RU
Часто наши клиенты задают вопросы по поводу стабильности работы сервера 1С:Предприятие и ошибки Завершение ... 2019-05-16T11:48:09+03:00
Зависание сервера 1С, или постоянное "Превышен максимальный расход памяти сервера за один вызов"
Зависание сервера 1С, или постоянное "Превышен максимальный расход памяти сервера за один вызов"
https://softonit.ru

Возврат к списку