Зависает система электронного документооборота TESSA
Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов рунета Pyatilistnik.org. В прошлый раз мы с вами разобрали назначение технологии VLAN. Сегодня мы с вами разберем ситуацию, при которой зависает сервер с системой электронного документооборота TESSA. В России она очень часто используется для оптимизации бизнес процессов в средних и крупных компаниях. Уверен, что это исключительный случай из-за бага, но вы как администратор, должны знать порядок действий, как из него выходить, в своей зоне ответственности.
Описание проблемы
Есть виртуальная машина с Windows Server 2016 на которой крутится TESSA 3.2. В какой-то момент сервис перестает отвечать, но виртуальная машина не зависает. Зайдя на сервер и открыв диспетчер задач, я обнаружил, что в системе есть огромное количество процессов Chronos.exe и порожденных от него фоновых процессов conhost.exe.
У меня настроена система мониторинга Zabbix, где посмотрев, график я увидел, что явно есть протекание памяти в Tessa, это видно из графика, в какой-то момент память начинает падать, потом перезагрузка сервера и все повторяется со временем.
Если открыть логи Windows, то можно обнаружить вот такие события:
Faulting module name: KERNELBASE.dll, version: 10.0.14393.2273, time stamp: 0x5ae408f8
Exception code: 0xe0434352
Fault offset: 0x0000000000033c58
Faulting process id: 0xc674
Faulting application start time: 0x01d5327e46102347
Faulting application path: C:\tessa\Chronos\Chronos.exe
Faulting module path: C:\Windows\System32\KERNELBASE.dll
Report Id: 60f90a23-477f-48e6-af00-877382798849
Faulting package full name:
Faulting package-relative application ID:
Faulting module name: clr.dll, version: 4.7.3062.0, time stamp: 0x5ab9567c
Exception code: 0xc00000fd
Fault offset: 0x0000000000003167
Faulting process id: 0x76fc
Faulting application start time: 0x01d5327e22506232
Faulting application path: C:\tessa\Chronos\Chronos.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: f212247e-4ee3-4540-872e-7189ebd4b8eb
Faulting package full name:
Faulting package-relative application ID:
Faulting module name: clr.dll, version: 4.7.3062.0, time stamp: 0x5ab9567c
Exception code: 0xc0000005
Fault offset: 0x00000000000e5315
Faulting process id: 0xc428
Faulting application start time: 0x01d5327e106e6d0a
Faulting application path: C:\tessa\Chronos\Chronos.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Report Id: fca6579a-d9e7-4760-ab09-42571b207497
Faulting package full name:
Faulting package-relative application ID:
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.OutOfMemoryException
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[[System.Threading.Tasks.VoidTaskResult, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].AwaitUnsafeOnCompleted[[System.Runtime.CompilerServices.TaskAwaiter, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Chronos.Platform.Processes.CommandLineProcessHost+<OnChildStartedInternal>d__22, Chronos.Platform, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null]](System.Runtime.CompilerServices.TaskAwaiter ByRef, <OnChildStartedInternal>d__22 ByRef)
at Chronos.Platform.Processes.CommandLineProcessHost+<OnChildStartedInternal>d__22.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)
at Chronos.Platform.Processes.CommandLineProcessHost+<StartAsync>d__20.MoveNext()
Exception Info: System.AggregateException
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean)
at System.Threading.Tasks.Task.Wait(Int32, System.Threading.CancellationToken)
at Chronos.Program.RunConsoleApplication(System.String[])
at Chronos.Program.Main(System.String[])
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.OutOfMemoryException
at Chronos.Platform.Processes.CommandLineProcessHost+<StartAsync>d__20.MoveNext()
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[[Chronos.Platform.Processes.CommandLineProcessHost+<StartAsync>d__20, Chronos.Platform, Version=3.2.0.0, Culture=neutral, PublicKeyToken=null]](<StartAsync>d__20 ByRef)
at Chronos.Platform.Processes.CommandLineProcessHost.StartAsync(System.String[])
at Chronos.Program.RunConsoleApplication(System.String[])
at Chronos.Program.Main(System.String[])
Что такое Chronos?
Chronos.exe - это сервис необходимый для Tessa и е компонентов. Он нужен для расчета замещений, почтовых рассылок и уведомлений (https://mytessa.ru/docs/InstallationGuide/InstallationGuide.html#InstallChronos).
Как решить проблему с недоступностью Tessa
Самый правильный метод, это написать в техническую поддержку TESSA и выслать им логи, после чего дожидаться обновления, но пока они это делают, мы можем написать небольшой скриптик на PowerShell и принудительно убивать все процессы Chronos, которые старше 10 минут. Сказано, сделано.
Далее я для удобства свой скрипт PowerShell конвертирую в EXE, дабы не менять политику безопасности ExecutionPolicy.
Далее нам необходимо создать в библиотеке планировщика заданий новую задачу.
Задаем имя нашей задачи. Выставляем, что запускаться она будет от имени "СИСТЕМА", так де поставьте галку "Выполнить с наивысшими правами".
Переходим на вкладку "Тригеры", где создаем новый. Выставляем тип "Ежедневно", ставим галку "Повторять задачу каждые 10 минут" в течении "бесконечно"
Идем на вкладку действия и создаем новое. Через обзор указываем путь до вашего EXE и сохраняем настройки.
Теперь до выполнения тригера я открываю консоль PowerShell и выполняю команду:
В итоге получаю все текущие процессы Chronos.exe и через 10 минут повторяю команды, где вижу, что PID разные у процессов Chronos.exe, что говорит, о том, что скрипт успешно отработал.
Теперь если посмотреть новый график после внедрения скрипта, видно, что память не утекает. Так же попутно мне еще пришлось на сервере решить ошибку 10016.
На этом у меня все, с вами был Иван Семин автор и создатель IT портала Pyatilistnik.org.