Назад | Перейти на главную страницу

Ограничение количества служб Windows приводит к сбою служб при запуске

Мы разработали специальную службу Windows на C # как часть большого корпоративного приложения. Наш отдел контроля качества тестирует несколько версий этой службы.

В лаборатории QA есть несколько (более 20) копий этой службы, установленных на одном тестовом боксе Windows 2003. Каждая копия находится в собственной папке и имеет уникальное имя службы, хотя каждый исполняемый файл имеет одинаковое имя (например, OurWindowsService.exe). Каждая служба использует одни и те же учетные данные Windows (пользователь домена).

Цель этой службы - обрабатывать сообщения MSMQ. Сообщения в очереди делают самые разные важные вещи.

По какой-то причине они могут одновременно запускать только 5 из этих сервисов. При запуске 6-го сервис вылетает при запуске.

Например, я могу начать с №1, №2, №3, №4 и №5. Когда я запускаю # 6, он вылетает. Однако, если я остановлюсь с №1 и начну с №6, №6 будет работать нормально, а теперь №1 не запустится.

При сбое служб в журнале событий Windows появляется следующая ошибка:

Сбойное приложение OurWindowsService.exe, версия 5.40.1.1, сбойный модуль kernel32.dll, версия 5.2.3790.4480, адрес сбоя 0x0000bef7.

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

0:000> kb100
ChildEBP RetAddr  Args to Child              
0012ece4 79037966 c06d007e 00000000 00000001 KERNEL32!RaiseException+0x53
0012ed4c 790099ba 00000008 0012ed08 7c82860c mscoree!__delayLoadHelper2+0x139
0012ed98 790075b1 001550c8 0012edac 0012fb34 mscoree!_tailMerge_**SHLWAPI_dll**+0xd
0012edb0 79007623 001550c8 0012edf8 0012edf4 mscoree!XMLGetVersionWithSupported+0x22
0012ee00 790069a4 aa06f1b0 00000000 000001fe mscoree!RuntimeRequest::GetRuntimeVersion+0x56
0012f478 790077aa 00000001 7903fb4c 0012fb34 mscoree!RuntimeRequest::ComputeVersionString+0x5bd
0012f89c 79007802 00000001 0012f8b4 7903fb4c mscoree!RuntimeRequest::FindVersionedRuntime+0x11c
0012f8b8 79007b19 00000001 00000000 aa06fa6c mscoree!RuntimeRequest::RequestRuntimeDll+0x2c
0012ffa4 79007c02 00000001 0012ffbc 00000000 mscoree!GetInstallation+0x72
0012ffc0 77e6f23b 00000000 00000000 7ffdf000 mscoree!_CorExeMain+0x12
0012fff0 00000000 79007bf0 00000000 78746341 KERNEL32!BaseProcessStart+0x23

Я считаю, что код ошибки, переданный Kernel32.RaiseException, c06d007e, означает, что модуль не найден, но я не уверен.

Кому-нибудь это знакомо? Мы достигли некоторого ограничения на количество экземпляров службы для какого-либо имени файла? MSMQ не любит более 5 сервисов прослушивания?

Если ваша служба загружает копию драйвера очереди сообщений (Mqac.sys) для каждого экземпляра, вероятно, вы заканчивается пул памяти System View Space. Каждый экземпляр MSMQ использует 4 МБ этого пула, и по умолчанию размер пула составляет всего 16 МБ.

Действительно ли это происходит, будет зависеть от того, как (если вообще) ваша служба использует систему MSMQ, и ссылается ли она на нее напрямую (загружает свои библиотеки) или использует какой-либо другой метод, такой как сокеты, для связи с ней.

Если окажется, что вы загружаете несколько экземпляров MSMQ, вы можете смягчить проблему, увеличив пул пространства просмотра системы. Это можно сделать:

  1. Откройте раздел реестра HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory Management.
  2. Создайте новое значение DWORD с именем SystemViewSize.
  3. Рассчитайте и укажите это значение следующим образом:
    • Используйте эту формулу: (16 + (количество загруженных ресурсов очереди сообщений x 4)).
    • Например, значение для кластера с тремя ресурсами очереди сообщений равно 28.
  4. перезагрузка

Этот сбой означает, что SHLWAPI.dll не найден на вашем компьютере. Проанализируйте свой стек вызовов, «XMLGetVersionWithSupported» вызовите API, экспортированный SHLWAPI.dll в каком-то состоянии, как ваше описание, API был вызван, когда вы запускаете службы более 5 раз.