воскресенье, 15 декабря 2019 г.

Расследование ошибки нехватки памяти на сервере 1С - случай №1


Расследование возникшей ошибки нехватки памяти на сервере 1С
Поступило обращение со следующей ошибкой:
"Неспецифицированная ошибка работы с ресурсом
Ошибка при выполнении запроса POST к ресурсу /e1cib/login:
Недостаточно свободной памяти для выполнения операции
Выполняется ожидание возможности запуска.
При появлении возможности, запуск будет выполнен автоматически.
Нажмите "Выполнить запуск" для немедленной попытки запуска.
Нажмите "Отмена" для отказа от запуска."



Смотрим журнал регистрации:


Настроив ТЖ с событием EXCP, EXCPCNTX обнаруживаем запись:
«Ошибка СУБД out of memory for query result»

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

{ОбщийМодуль.ДокументооборотСКОВызовСервера.Модуль(22)}: Ошибка при вызове метода контекста (Получить)
по причине:

по причине:
Недостаточно памяти для получения результата запроса к базе данных

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

Строка, на которой произошла ошибка:
ВнешниеОбъектыХранилище = Константы.ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль;
ДвоичныеДанныеОбработки = ВнешниеОбъектыХранилище.Получить().Получить();

Смотрим тип объекта (константы), к которой идет обращение:

Итак, в конфигурации есть константа «ДокументооборотСКонтролирующимиОрганами_ВнешнийМодуль», которая хранит в базе что-то неструктурированое (двоичные данные), и это неструктурированное может занимать значительный объем памяти.
Проверяем, какой объем данных фактически занимает константа.
Узнаем имя таблицы хранения в базе PostgreSQL — таблица «_Const10013», индекс «_Const10013_ByKey».

Узнаем размер таблиц «Const10013», «_Const10013_ByKey» на диске:

На диске таблица занимает всего 4688 Кб = 4,6 Мб. Размер является незначительным, причина не в константе.

Обнаруживаем, что кластер 1С является 32-разрядным:



32-разрядный кластер 1С имеет ограничение, примерно, 3.8 Гб, по достижении которого происходит падение процесса, службы.
В режиме отсутствия нагрузки rphost занял 3,2 Гб, что близко к порогу падения.
Подобные падения будут происходить в любой момент времени.

Внесены изменения:
- в кластере серверов 1С «Интервал превышения допустимого объема памяти процессов» = 300. Настройка не избавляет от ошибки, но необходима для снижения частоты возникновения ошибки.
- в планировщике Windows настроен перезапуск службы 1С; такими образом освобождается виртуальное адресное пространство в памяти, создается новый рабочий процесс. Настройка тоже не гарантирует исключение ошибки, но снижает вероятность ее возникновения.


Для предотвращения повторной ошибки лучше:
- сменить 32-разрядный кластер серверов 1С на 64-разрядный;
- осуществить переход на платформенные лицензии КОРП для снятия ограничений по настройкам, возможности гибкой настройки распределения памяти сервера.
Так как на сервере используется 14 ядер процессора, то необходим переход на платформенные лицензии КОРП.

1 комментарий: