Автоматический перезапуск службы 1С на Windows Server с очисткой кеша-сеансов

Доброго дня, коллеги. Рубрика — администрирование серверов 1С: Предприятие.

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

·       тестирование производительности 
(есть отдельная статья про интегральную оценку производительности по методике APDEX)

·       и стресс-тестирование 
(это когда в тестируемой ИС моделируют программно выполнение конкретных операций и планомерно увеличивают количество потоков их выполнения до отказа ИС, либо снижения ее производительности до неприемлемых значений).

Методика испытаний с такими видами тестирования есть, но некому реализовать, нет требований и т.п.

Почему так происходит? Эксперт по технологическим вопросам на проекте внедрения стоит дорого, да и если он есть, то не всегда получается добиться от заказчика понятных требований по составу ключевых операций, чтобы провести анализ внедряемого продукта досконально.

Следствием отсутствия реальных проверок разработанной информационной системы на технологическое качество и масштабируемость являются регулярные фризы (зависание работы программы на некоторое время или до перезапуска службы 1С на сервере) при одновременной работе пользователей в продуктивной среде.

Чаще всего причина фризов кроется не в ошибочно-подобранных параметрах инфраструктуры (количества процессоров, объема оперативной памяти, быстрых или медленных дисков и т.д.), а именно в плохом коде на языке 1С, который требует рефакторинга экспертом по технологическим вопросам на основании исследования, например, как описано в статье про APDEX.

Если такого эксперта искать, то на это уйдет не один месяц, а на выполнение рефакторинга отводится от месяца и более (зависит от опыта сотрудника и масштаба бедствия).

Все это время надо как-то жить.

Часто проблему удается стабилизировать настройкой кластера 1С на перезапуск рабочих процессов средствами самого кластера 1С, процесс описан в инструкциях на портале its.1c.ru.

Решение с настройкой кластера не всегда подходит, ведь настройка позволяет перезапускать рабочие процессы:

— по таймеру;

— по превышению заданного объема оперативной памяти.

Перезапуск по таймеру неудобен с точки зрения пользователя: при каждом перезапуске пользовательский интерфейс приложения как будто замирает без опознавательных знаков, вызывая недоумение у пользователей.

Перезапуск по превышению заданного объема оперативной памяти не решает проблему завершения именно проблемных рабочих процессов, поскольку не всегда проблема кроется действительно в них. Возможно, такой объем вполне допустим исходя из бизнес-логики приложения, например, при массовом проведении работ по регламенту.

Когда настройками кластера обходиться не получается по каким-то причинам, есть довольно действенный способ — регулярный перезапуск службы 1С с очисткой кеша сеансовых данных. Каталог хранения можно узнать из параметров запуска службы 1С, после ключа -d следует указать каталог службы, например:  

 C:\Program Files\1cv8\8.3.22.2283\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv8\srvinfo" -debug

Для сервера, запущенного с параметром -regport 1541, каталог сеансовых данных будет размещен в каталоге «reg_1541» и начинаться с «snccntx»:  

"C:\Program Files\1cv8\srvinfo\reg_1541\snccntx<ИдентификаторГлавногоМенеджераКластера>",

<ИдентификаторГлавногоМенеджераКластера>

Перезапуск нужно выполнять в нерабочее время (само собой!).

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

В Windows нет средств перезапуска служб по таймеру «из коробки», а тем более с чисткой кеша-сеансов.

Решением может быть cmd или powershell-скрипт и встроенный в ОС-планировщик задач `taskschd.msc`, настроенный на выполнение данного скрипта.

Почему же вообще я решил написать данный скрипт? По запросу «Автоматический перезапуск службы (сервиса) 1С на Windows Server» интернет выдавал лишь решения с паузой на фиксированное время между остановкой службы и ее стартом. Такое способ может быть рабочим до тех пор, пока известно за сколько рабочие процессы после подачи команды на остановку службы успевают корректно завершиться. Т.е. если рассматривать вариант именно с ожиданием корректного завершения процессов, стоит ждать столько, сколько нужно, а не фиксированное время, указываемое в скрипте. Поэтому я включил в скрипт проверку наличия в памяти ОС активных процессов с наименованиями, которые соответствуют процессам службы 1С, а именно:  «rmngr.exe», «rphost.exe», «ragent.exe». 

Прикладываю сам скрипт:
 

#Указываем наименование службы сервера 1С и останавливаем её

$serviceName = '1C: Enterprise 8.3 Server Agent (x86–64)'
stop-service -name $serviceName -force

#Ожидаем завершения процессов
Do {  $Processes= Get-Process| Where {($_.Name -eq «rphost») -or ($_.Name -eq «rmngr») -or ($_.Name -eq «ragent»)}| select name,  starttime}
Until ($Processes.Count -eq 0)

#Вычисляем каталог хранения сеансовых данных
$o = Get-WmiObject win32_service | ?{$_.Name -like $serviceName} | select-object
$ss = $o.PathName.SubString ($o.PathName.LastIndexOf (»-d »))
$sss = $ss.SubString ($ss.IndexOf (»«)+1)
$ssss=$sss.SubString (0,$sss.IndexOf (»«))
$regport= $o.PathName.SubString ($o.PathName.LastINdexOf («regport»)+8,4)
$ServiceDataDir = $ssss+'\reg_'+$regport+'\'
$SessionDataDir = Get-ChildItem -Path $ServiceDataDir -Filter snccntx*

#Удаляем сеансовые данные
Remove-Item -recurse $ServiceDataDir$SessionDataDir

#Запускаем службу сервера 1С
start-service -name $serviceName

,

'1C: Enterprise 8.3 Server Agent (x86–64)' — это имя службы, как оно задано в ветке редактора реестра.

Есть два способа:

1.   При помощи редактора реестра. Открыть его можно следующим образом: нажимаем сочетание клавиш Win+R, в поле «Открыть» набираем команду regidit, откроется редактор реестра, где имя службы — это имя папки в ветке (выделено жирным):

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent (x86-64)

2.   При помощи консоли служб 

Нажимаем сочетание клавиш Win+R, далее набираем команду: services.msc

В открывшемся списке служб находим службу 1С, открываем ее карточку, имя, это значение напротив «Service Name» («Имя службы» в русском интерфейсе).

Для запуска скрипта необходимо сохранить его в текстовый файл и присвоить файлу расширение .ps1. Далее этот файл помещаем в каталог, из-под которого он будет запускаться, например, %appdata%.

8a0a58839862ebb9252ce5c99a77f4d0.png

Планировщик задач можно открыть так:

1.   Нажимаем сочетание клавиш Win+R, далее набираем команду: taskschd.msc.

2.   Находим папку Microsoft, нажимаем по ней правой кнопкой мыши и выбираем «создать простую задачу».

eb00a2c0a102f62faf2fc597b99da128.png

3.   Заполняем понятное для себя наименование, отражающее сущность выполняемой операции, например, restart1cserviceClearCache. Описание заполнять необязательно, но, поскольку сервер могут обсуживать другие люди в дальнейшем, можете написать что-то вроде «перезапуск службы 1с по расписанию». Поверьте, коллеги вспомнят потом вас добрым словом за понятное представление задачи:).

4.   Указываем время и периодичность выполнения на ваше усмотрение. 

5.   Ставим действие (Action) — «Запустить программу» (Start a program)

6.   В поле «Программа или сценарий» (Program/script) указываем программу powershell (у меня путь такой: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe),

в качестве параметра (поле «Добавить аргументы (необязательно)») указываем через ключ `-File путь к файлу со скриптом`: -File "%appdata%\restart1cserviceClearCache.ps1".

a48f7514d9904a64b1d585bdb8e4949d.png

Нажимаем «ОК».

Ваше регламентное задание по перезапуску службы с очисткой кеша готово, осталось проверить его работу.

Если есть тестовый сервер, где нет работающих пользователей, настройте задание сначала на нем.

Для проверки работоспособности откройте каталог сеансовых данных проводником, чтобы были видны даты создания файлов в нем "C:\Program Files\1cv8\srvinfo\reg_1541\snccntx* и редактор powershell.

В редакторе powershell введите команду:  

Get-Process| Where {($_.Name -eq "rphost") -or ($_.Name -eq "rmngr")}| select name, starttime (*)

Результатом этой команды является табличка с датой старта процессов службы 1С, например:

Name   StartTime
----   ---------
rmngr  06.08.2024 18:33:47
rphost 06.08.2024 18:34:51
rphost 06.08.2024 18:33:50

Редактор не закрывайте.

В планировщике задач следует навести курсор на созданном вами задании и нажать правой кнопкой мыши, после чего выбрать пункт «Выполнить (Run)».

a84c8069219c41c1ed4e77159167bebf.png

После выполнения перейдите в редактор powershell и повторите команду (*) еще раз. Если вы видите новые значения StartTime для процессов, значит перезапуск выполнен успешно, осталось проверить очистился ли кеш.

Смотрим на даты создания файлов в каталоге "C:\Program Files\1cv8\srvinfo\reg_1541\snccntx*. Если они соответствуют новым значениям StartTime, то скрипт отработал успешно.

На этом все, спасибо за внимание:) 

© Habrahabr.ru