Как известно, многие внедрения на платформе 1С Предприятие проходят тестирование лишь формально, а именно:
нагрузочное тестирование
(подробно описывать не буду, т.к. об этом есть отдельная статья про интегральную оценку производительности по методике APDEX Оценка интегральной производительности системы по методике APDEX :: Методики :: Методическая поддержка для разработчиков и администраторов 1С:Предприятия 8 (1c.ru))
и стресс-тестирование
(это когда моделируют программно выполнение конкретных операций и планомерно увеличивают количество потоков их выполнения до отказа системы, либо снижения ее производительности до неприемлемых значений)
проводится только "на бумаге": составляют список ключевых операций, их приоритет, целевое время, а цифры вносят "из головы".
Причины банальны: эксперт по технологическим вопросам на проекте внедрения стоит дорого, да и если он есть, не всегда получается добиться от заказчика внятных требований по составу ключевых операций для того, чтобы провести анализ внедряемого продукта досконально.
В связи с вышеописанным, возникает ситуация, когда после того как все пользователи начинают работать в программе, начинаются регулярные "фризы" (зависание работы программы на некоторое время или пока не перезапустишь службу 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" , в общем виде так:
Перезапуск нужно выполнять, само собой, в нерабочее время.
Можно, конечно, просить администратора этим заниматься вручную каждый день, но не каждый на такое согласиться.
Рабочей средой службы сервиса 1С может быть как Windows так и Linux. В обоих случаях нет средств перезапуска служб по таймеру "из коробки", а тем более с чисткой кэша сеансов.
-Для Windows решением может быть cmd или powershell скрипт и встроенный в ОС планировщик задач taskschd.msc, настроенный на выполнение данного скрипта.
-Для Linux - bash скрипт и встроенная в ОС служба cron - некий аналог планировщика в Windows.
Вариант для Linux я опишу как-нибудь в другой раз, уж извините.
Рассмотрим вариант для Windows и реализуем задачу средствами команд powershell, но сначала о том почему данный скрипт пришлось писать:
По запросу в поисковиках в интернете по задаче: "Автоматический перезапуск службы(сервиса) 1С", находились решения только с паузой на фиксированное время между остановкой службы и ее стартом. Такое решение может быть рабочим до тех пор, пока известно за сколько рабочие процессы после подачи команды на остановку службы успевают корректно завершиться, т.е. если рассматривать вариант именно с ожиданием корректного завершения процессов, стоит "подождать" столько, сколько нужно, а не фиксированное время указываемое в скрипте. Поэтому я включил в скрипт проверку наличия в памяти ОС активных процессов с наименованиями, которые соответствуют процессам службы 1С, а именно: "rmngr.exe", "rphost.exe", "ragent.exe".
Сам скрипт:
'1C:Enterprise 8.3 Server Agent (x86-64)' - Это имя службы, как оно задано в ветке редактора реестра:
Клавиша Win+R: набираем команду regidit, откроется редактор реестра. Имя службы, это имя "папки" в ветке (выделено жирным):
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.3 Server Agent (x86-64)
Или в консоли служб
Клавиша Win+R: services.msc. Находим службу в списке, открываем ее карточку, имя, это значение напротив "Service Name" ("Имя службы" в русском интерфейсе)
.
- Как сохранить скрипт
Для того чтобы этот скрипт запустить, необходимо сохранить его в текстовый файл и дать файлу расширение ps1, размещаем этот файл в каталог, который доступен пользователю из-под которого он будет запускаться, например, каталог %appdata%.
- Как настроить планировщик
Планировщик задач можно открыть так:
Клавиша Win+R: taskschd.msc
Переходим в папку Microsoft, правой кнопкой мыши - "создать простую задачу".
Заполняем понятное для себя наименование, отражающее сущность выполняемой операции, например restart1cserviceClearCache, описание заполнять не обязательно, но, поскольку сервер могут обсуживать другие люди после Вас, можете написать что-то , вроде "перезапуск службы 1с по расписанию". Поверьте, коллеги вспомнят о Вас потом добрым словом за понятное представление задачи:).
Указываем время и периодичность выполнения на ваше усмотрение.
Действие (Action) - "Запустить программу" (Start a program)
В поле "Программа или сценарий" (Program/script) указываем программу powershell (у меня путь такой: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe),
в качестве параметра ( поле "Добавить аргументы(необязательно)") указываем через ключ -File путь к файлу со скриптом: -File "%appdata%\restart1cserviceClearCache.ps1".
Нажимаем "ОК".
Ваше регламентное задание по перезапуску службы с очисткой кэша готово, осталось проверить его работу.
- Как проверить работоспособность задания планировщика
Если есть тестовый сервер, где нет работающих разработчиков или пользователей, настройте задание вначале на нем.
Для проверки работоспособности, откройте каталог сеансовых данных проводником, чтобы были видны даты создания файлов в нем "C:\Program Files\1cv8\srvinfo\reg_1541\snccntx* и редактор powershell
В редакторе powershell наберите команду (*)
Результатом этой команды является табличка с датой старта процессов службы 1С, например
Редактор не закрывайте.
В планировщике задач установить курсор на созданном Вами задании, правой кнопкой мыши -> Выполнить (Run)
После выполнения перейдите в редактор powershell и повторите команду (*) еще раз. Если вы видите новые значения StartTime для процессов, значит перезапуск выполнен успешно, осталось проверить очистился ли кэш. Смотрим на даты создания файлов в каталоге "C:\Program Files\1cv8\srvinfo\reg_1541\snccntx*. Если они соответствуют новым значениям StartTime, то скрипт отработал успешно.
На этом все, спасибо за внимание :)
///////////////
ПС:
ранее скрипт писал для cmd, оставлю его для истории:
echo off
sc stop "1C:Enterprise 8.3 Server Agent (x86-64)"
ping -n 1 -w 3000 10.10.254.254 >nul
:gettasklist
tasklist /fi "imagename eq rmngr.exe">"%appdata%\log.txt"
ping -n 1 -w 1000 10.10.254.254 >nul
set findoutput=""
set /p findoutput=<%appdata%\log.txt
echo "Awaiting for rmngr.exe stopping..." !
if not "%findoutput%"=="Информация: Задачи, отвечающие заданным критериям, отсутствуют." goto gettasklist
sc start "1C:Enterprise 8.3 Server Agent (x86-64)"
pause