Администраторы средних и крупных информационных систем на базе «1С:Предприятие 8» нередко сталкиваются с внезапными падениями рабочих процессов сервера. Одной из наиболее сложных в диагностике проблем является регулярное аварийное завершение процесса rphost.exe с кодом исключения 0xc0000005 (ошибка нарушения прав доступа к памяти или Access Violation). В этой статье мы подробно разберем реальный практический кейс, когда рабочий процесс падал каждые 2–5 минут, выясним первопричину сбоя, связанную с защитой СЛК/Катран, а также рассмотрим комплексные методы борьбы с этой проблемой.
В рассматриваемой ситуации на сервере приложений 1С (платформа версии 8.3.12.1790, хотя проблема актуальна и для современных релизов) наблюдались постоянные падения процессов rphost.exe. Пользователи при этом периодически получали сообщения о разрыве соединения с базой данных («Удаленный хост принудительно разорвал существующее подключение»).
Для начала проанализируем системный журнал событий Windows (Event Viewer). В нем фиксировались следующие критические ошибки:
rphost.exe8.3.12.1790unknown (в некоторых случаях может явно указываться временный файл с расширением .tmp, например, v8_9A97_1d.tmp)0xc00000050x1558Код исключения 0xc0000005 однозначно указывает на попытку выполнения недопустимой операции с памятью — процесс попытался прочитать или записать данные по адресу, к которому у него нет доступа. Тот факт, что в качестве сбойного модуля указан unknown или динамически создаваемый файл во временном каталоге, наводит на мысль о влиянии внешних динамических библиотек (DLL), которые подгружаются в адресное пространство процесса rphost.exe во время его работы.
Для точной локализации проблемы нам необходимо сопоставить системную ошибку с логами платформы «1С:Предприятие». Переведем шестнадцатеричный идентификатор процесса 0x1558 из журнала событий Windows в десятичный формат. Сделать это можно с помощью обычного калькулятора программиста: значение 0x1558 равно десятичному числу 4292. Это PID (Process ID) упавшего процесса rphost.exe.
Теперь обратимся к Технологическому журналу (ТЖ) 1С. Для того чтобы ТЖ собирал сведения об аварийных завершениях и сетевых ошибках, файл конфигурации logcfg.xml должен содержать следующие настройки для сбора исключений:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="C:\v8_logs\excp" history="72">
<event>
<eq property="Name" value="EXCP"/>
</event>
<event>
<eq property="Name" value="EXCPCNTX"/>
</event>
<property name="all"/>
</log>
</config>
Проанализировав логи ТЖ для процесса с PID 4292 непосредственно перед моментом падения, мы обнаружим критическое событие:
11:18.204056-0,EXCP,0,process=rphost,OSThread=10232,ClientID=12,
Exception=NetDataExchangeException,Descr='server_addr=(2)10.10.5.46:51055
descr=10054(0x00002746): Удаленный хост принудительно разорвал существующее подключение.
line=1149 file=src\DataExchangeServerImpl.cpp'
Здесь зафиксирована сетевая ошибка 10054 (WSAECONNRESET). Это означает, что удаленный сервер (или служба) принудительно разорвал установленное TCP-соединение с процессом rphost.exe. Выясним, почему обычный разрыв соединения приводит к краху всего рабочего процесса 1С.
Виновником сбоя является конфликт платформы с компонентами Системы лицензирования конфигураций (СЛК), разработанной компанией «Катран Софт». Эта защита активно используется во многих отраслевых решениях 1С (например, «1С:Бухгалтерия сельскохозяйственного предприятия», «1С:Общепит» и др.).
Механизм работы СЛК устроен следующим образом:
Temp в профиле пользователя usr1cv8) под случайным именем вида v8_XXXX_XX.tmp.rphost.exe.10.10.5.46) для подтверждения активности сеанса и проверки ключей.Если в локальной сети происходят микросбои или сервер СЛК неожиданно закрывает сокет, внешняя компонента защиты фиксирует сетевую ошибку 10054. В устаревших версиях СЛК обработка этого сетевого исключения была реализована с ошибками. Вместо того чтобы мягко вернуть ошибку в код 1С, библиотека защиты совершала некорректное обращение к памяти (например, пыталась обратиться к уже уничтоженному объекту сокета), что вызывало системное исключение 0xc0000005. Поскольку библиотека была запущена внутри rphost.exe, операционная система завершала весь рабочий процесс 1С целиком, выбрасывая из базы десятки работающих пользователей.
Выясним, какое именно событие инициирует обращение к серверу СЛК каждые 2–5 минут. Как правило, это специализированное фоновое регламентное задание проверки лицензий, встроенное в отраслевую конфигурацию.
Рассмотрим по шагам быстрый способ локализации и временного купирования проблемы:
ПроверкаЛицензииСеанса, ПроверкаЗащиты или аналогично).Важно понимать последствия отключения регламентного задания:
Первичная проверка лицензии происходит при запуске сеанса пользователя. Отключение фонового регламентного задания позволит пользователям успешно заходить в программу и работать. Однако фоновое подтверждение лицензии прекратится. В краткосрочной перспективе это решает проблему падений rphost.exe. Но в долгосрочной перспективе на сервере СЛК могут «зависать» лицензии пользователей, чьи сеансы завершились некорректно. Также некоторые конфигурации при длительном отсутствии фонового подтверждения могут выводить предупреждения и принудительно завершаться.
Для того чтобы полностью исключить падения сервера и обеспечить стабильную работу пользователей без отключения регламентных задач, необходимо применить комплекс мер по системной настройке.
По умолчанию в кластере 1С на одном процессе rphost.exe могут обслуживаться десятки различных информационных баз. Если в одной из баз происходит сбой внешней компоненты СЛК, падает весь процесс, закрывая сеансы пользователей совершенно других баз (например, «Зарплата и управление персоналом» или «Бухгалтерия предприятия»).
Чтобы изолировать проблемные базы, выполним следующие настройки в консоли администрирования кластера 1С:
1. Это заставит систему создавать под каждую базу свой индивидуальный процесс rphost.exe.При такой схеме, даже если внешняя компонента СЛК вызовет падение процесса, аварийно завершится только конкретный rphost.exe, обслуживающий базу БСХП. Пользователи остальных 70 баз продолжат работать без каких-либо прерываний.
Разработчики системы защиты Катран регулярно выпускают обновления, исправляющие утечки памяти и некорректную обработку сетевых ошибок (включая ошибку 10054). Рекомендуется выполнить следующие действия:
Поскольку ошибка 10054 вызвана принудительным разрывом сетевого соединения, необходимо убедиться, что сетевые пакеты между сервером приложений 1С и сервером лицензирования СЛК не блокируются средствами защиты:
9099 для СЛК 3.x, либо 9091/15201 для более старых версий) в правила исключений брандмауэра Windows (как для входящих, так и для исходящих подключений).Убедимся, что у пользователя операционной системы, под которым функционирует служба сервера 1С (обычно это usr1cv8 или локальная система SYSTEM), есть полные права доступа на чтение, запись и изменение системных временных каталогов:
C:\Windows\TempC:\Users\usr1cv8\AppData\Local\Temp (или соответствующий профиль пользователя службы)Если у процесса 1С ограничены права на перезапись или исполнение временных файлов v8_*.tmp, это неизбежно приведет к ошибке доступа к памяти 0xc0000005 при попытке обращения к компоненте защиты СЛК.