Windows服务限制在启动时崩溃服务

我们已经在C#中开发了一个自定义Windows服务,作为大型企业应用程序的一部分。 我们的QA部门testing此服务的多个版本。

质量检查实验室在一个Windows 2003testing盒上安装了该服务的几个(超过20个)副本。 虽然每个可执行文件名称相同(例如OurWindowsService.exe),但每个副本都位于其自己的文件夹中,并且具有唯一的服务名称。 每个服务使用相同的Windows凭据(域用户)。

此服务的目的是处理MSMQ消息。 排队的消息做各种重要的东西。

由于某些原因,他们一次只能运行其中的5项服务。 当我们开始一个第六,启动时服务崩溃。

例如,我可以开始#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生成一个postmortem转储文件。 转储文件显示崩溃试图延迟加载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,意思是Module Not Found,但是我不确定。

这听起来对任何人都很熟悉吗? 我们是否对某些文件名上的服务实例数量有限制? MSMQ是否不喜欢5个以上的听音服务?

如果您的服务正在为每个实例加载消息队列驱动程序(Mqac.sys)的副本,则可能是由于系统视图空间内存池耗尽 。 每个MSMQ实例使用4MB的这个池,默认情况下,池大小只有16MB。

这个实际上是否真的取决于你的服务如何(如果有的话)使用MSMQ系统,以及它是直接引用它(加载它的库),还是使用一些其他方法(如套接字)来与它进行通信。

如果事实certificate您正在加载多个MSMQ实例,则可以通过增加系统视图空间池来缓解您的问题。 这可以通过以下方式完成:

  1. 打开registry项HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Memory Management。
  2. 创build一个名为SystemViewSize的新DWORD值。
  3. 计算并指定这个值如下:
    • 使用此公式:(16 +(消息队列资源的数量加载×4))。
    • 例如,具有三个消息队列资源的群集的值等于28。
  4. 重启

这意外意味着SHLWAPI.dll在您的电脑上找不到。 分析你的调用堆栈,“XMLGetVersionWithSupported”在某些情况下调用一个由SHLWAPI.dll导出的API,作为你的描述,当你运行服务的时候调用API超过5次。