В процессе эксплуатации высоконагруженных информационных баз 1С:Предприятия администраторы нередко сталкиваются с ситуацией, когда один из рабочих процессов rphost внезапно за считанные секунды забирает всю доступную оперативную память сервера. При этом процесс не освобождает ресурсы вплоть до принудительного перезапуска по таймауту. Разберем по шагам, почему возникает такое поведение и как точно локализовать проблемный вызов с помощью средств платформы и технологического журнала.
Основным инструментом для поиска источника лавинообразного потребления памяти является технологический журнал (ТЖ). Проанализируем, какие именно события и свойства необходимо отслеживать:
MEM и MEM2, фиксирующих выделение памяти сеансами и вызовами. В конфигурационном файле logcfg.xml зададим фильтрацию по объему памяти, чтобы логировать только аномальные всплески.Context для событий CALL, SCALL и DBMSSQL. Это позволит связать всплеск потребления памяти с конкретной строкой программного модуля или запросом.Memory, MemoryPeak, InBytes, OutBytes).Рассмотрим пример типового фрагмента файла конфигурации технологического журнала logcfg.xml для отслеживания потребления ресурсов:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\LOGS\1C_Memory" history="24">
<event>
<eq property="name" value="MEM"/>
</event>
<event>
<eq property="name" value="MEM2"/>
</event>
<event>
<eq property="name" value="CALL"/>
<ge property="MemoryPeak" value="104857600"/>
</event>
<property name="all"/>
</log>
</config>
После активации ТЖ проанализируем логи в момент инцидента. Наша цель — найти сеанс (process, AppID, SessionID) и метод встроенного языка, который предшествовал резкому скачку MemoryPeak.
Выясним наиболее частые прикладные причины, приводящие к быстрому заполнению ОЗУ процессом rphost:
Запрос.Выполнить().Выгрузить() для получения сотен тысяч или миллионов записей вместо поэтапного обхода выборки через Выборка = Запрос.Выполнить().Выбрать(). Вся выгруженная таблица значений полностью материализуется в памяти рабочего процесса.DOMДокумент, фабрика XDTO) целиком, вместо последовательного потокового чтения через объект ЧтениеXML или ЧтениеJSON.-debug в производственной среде может приводить к накоплению служебных структур и утечкам памяти.Чтобы исключить падение всего сервера из-за одного некорректного пользовательского действия, оптимизируем параметры кластера через консоль администрирования:
Для дополнительной защиты операционной системы от полного зависания применим ограничения ресурсов ОС Windows:
rphost.exe через механизмы управления квотами ОС, чтобы оставить гарантированный резерв для системных служб.Process \ Private Bytes и Process \ Working Set для процессов 1С, сопоставляя их с временными метками технологического журнала.Таким образом, сочетание мониторинга через технологический журнал, ужесточения интервалов перезапуска процессов в кластере и оптимизации тяжелых запросов позволяет полностью локализовать и устранить причины неконтролируемого расхода памяти.