Расследование ошибки нехватки памяти на сервере 1С
Автор рассказывает, почему возникают ошибки системы «1С: Предприятие 8.3» из-за нехватки памяти, и рассматривает пример диагностики эпизода.
23К открытий27К показов
Александр Рудницкий
Программист 1С компании CorpSoft24
Ошибка системы «1С: Предприятие 8.3» из-за нехватки памяти — постоянный спутник администратора 1С. Разбираемся, из-за чего они возникают, и рассматриваем пример диагностики одного подобного эпизода из практики администрирования сервера 1С.
Природа проблемы
Сообщение «Недостаточно памяти» — одна из самых часто встречающихся ошибок при работе с 1С: Предприятие версии 8.3 и выше. Она происходит по самым разным причинам — от обработки системой нескольких массивных файлов и загрузки больших объёмов данных, до обновления ПО и перегрузки ресурсов при формирования сложных отчётов.
Она не так критична при возникновении на клиентском компьютере, а вот если сообщение об ошибке выдает сервер 1С, нужно отнестись к этому максимально внимательно. Это тот самый случай, когда очень важно установить правильный «диагноз» — то есть решения не будет, пока ответственный администратор не распознает источник проблемы, не поймёт её природу.
Проблема может заключаться в несвоевременном завершении процессов, запускаемых различным ПО. Они накапливаются и перегружают доступный объём памяти на сервере. Также может иметь место интенсивная работа различных программ с постоянным резервированием и освобождением ресурсов памяти.
Приведу пример расследования одной подобной ошибки из своей практики.
Инцидент
Поступило обращение со следующей ошибкой:
Смотрим журнал регистрации, там так же выводится ошибка с пояснением о нехватке памяти на сервере:
Настроив технологический журнал (ТЖ) системы 1С с событием EXCP — EXCPCNTX обнаруживаем запись:
Ошибка СУБД out of memory for query result
То есть, обе ошибки сообщают о проблеме объёма памяти, на основании чего нашим главным подозреваемым становится код конфигурации (возможно наличие неоптимальных запросов).
Находим код конфигурации, вызывающий ошибку.
В журнале регистрации указан следующий код:
Открываем конфигуратор и переходим в указанный модуль к указанному номеру строки кода:
Строка, на которой произошла ошибка:
Смотрим тип объекта (константы), к которой идёт обращение:
Итак, в конфигурации есть константа:
Она хранит в базе что-то неструктурированное (двоичные данные), что может занимать значительный объём памяти.
Проверяем, какой объем данных фактически занимает константа. Для этого узнаем имя таблицы хранения в базе 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С КОРП для снятия ограничений по настройкам и обеспечения возможностей для гибкой настройки распределения памяти сервера.
Другие варианты
Зачастую, особенно в ситуации, когда нужно срочно вернуть систему в работоспособное состояние при возникновении подобной ошибки, можно попробовать такие «дедовские» способы, как перезагрузка сервера 1С или перезапуск рабочих процессов 1С, что приведёт к уменьшению объёма используемой памяти.
Источником проблемы также может быть недостаток пространства на жестком диске сервера. Здесь решение будет зависеть от устройство сервера или кластера, но здесь также могут помочь и перезапуск сервера, и наращивание ёмкости диска (или освобождение существующего пространства), а также оптимизация запросов или обновление версии ПО системы.
23К открытий27К показов