Проблемы с закрытием службы Windows NT

Я разработал промежуточное программное обеспечение, которое обеспечивает функциональность RPC для нескольких клиентских приложений на разных платформах в нашей организации. Промежуточное программное обеспечение написано на C# и работает как служба Windows NT. Он обрабатывает такие вещи, как доступ к файлам к сетевым ресурсам, доступ к базе данных и т. Д. Промежуточное программное обеспечение размещается на двух высокопроизводительных системах под управлением Windows Server 2008.

Когда один из наших администраторов сервера перезагружает компьютер, главным образом для обновления Windows, возникают серьезные проблемы с поведением системы в отношении моей службы NT. Моя служба предназначена для немедленной остановки прослушивания новых подключений, немедленного начала отклонения новых запросов к существующим подключениям и, в противном случае, для максимально быстрого завершения работы в случае запроса OnStop или OnShutdown от SCM. Тем не менее, для поддержания целостности системы операциям, которые выполняются в настоящее время, разрешено продолжаться в течение разумного периода времени. Обычно сервер выключается в течение 30 секунд (например, когда служба останавливается вручную). Однако, когда система получает команду на перезагрузку, моя служба немедленно теряет доступ к сетевым дискам и UNC-путям, что вызывает проблемы целостности данных для любых открытых файлов и частичную запись в эти расположения. Мой сервис перечисляет Workstation (и, следовательно, SMB Redirector) как зависимость, поэтому я думаю, что мой сервис нужно будет остановить до остановки Workstation/Redirector, если Windows соблюдает эти зависимости.

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

В отличие от приложения Windows, моя служба Windows NT, по-видимому, не имеет возможности остановить текущее выключение системы, задержать выключение системы или даже просто возможность сохранить любые ожидающие записи на сетевой диск до принудительного отключения и завершения работы., Как разработчик NT Service должен иметь какую-либо целостность приложений в этой среде? Почему Forms Applications получают все возможности завершить свой бизнес до завершения работы, а службы, похоже, не получают таких преимуществ?

Я пытался:

Вызов SetProcessShutdownParameters через p/invoke, чтобы попытаться уведомить мое приложение о завершении работы раньше, чтобы избежать отключения Redirector до того, как я это сделаю.

Вызов ServiceBase.RequestAdditionalTime со значением, меньшим или равным двухминутному пределу.

Настройка WaitToKillServiceTimeout

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

Но, в конце концов, я все еще получаю ~30 секунд проблемного времени, в течение которого моя служба, похоже, даже не уведомлена о событии OnShutdown, но запросы не выполняются из-за того, что перенаправитель больше не обслуживает мои запросы общего сетевого ресурса.

Как решить эту проблему? Что я могу сделать, чтобы отложить или остановить завершение работы или, по крайней мере, разрешить закрыть мои активные задачи без исчезновения служб переадресации из-под меня? Я могу понять, что Microsoft пытается сделать, чтобы службы не тормозили и не показывали выключения, но это кажется большой целью для клиентских операционных систем Windows, а не для серверов. Я не хочу, чтобы мои серверы быстро отключались, я хочу целостности работы и постепенного завершения работы.

Заранее благодарим за любую помощь, которую вы можете предоставить.

ОБНОВЛЕНИЕ: я сделал точные сроки. Во время тестового выключения я получил уведомление о выключении в 23:55:58 и заметил, что в 23:56:02 потерял связь с сетевым ресурсом. Таким образом, в течение четырех секунд я потерял способность сохранять любое активное состояние.

1 ответ

Решение

На этот вопрос: https://serverfault.com/questions/34427/windows-service-dependencies на ServerFault следует ответить самостоятельно. Он ссылается на эту статью: http://blogs.technet.com/askperf/archive/2008/02/04/ws2008-service-shutdown-and-crash-handling.aspx, которая должна помочь вам получить уведомление перед отключением и заказ сервисного отключения.

Другие вопросы по тегам