Pau*_*ams 6 windows-server-2003 windows-service
我们已经在 C# 中开发了一个自定义 Windows 服务,作为大型企业应用程序的一部分。我们的 QA 部门测试了此服务的多个版本。
QA 实验室在一个 Windows 2003 测试盒上安装了此服务的多个(超过 20 个)副本。每个副本都在自己的文件夹中,并具有唯一的服务名称,但每个可执行文件的名称都相同(例如,OurWindowsService.exe)。每个服务都使用相同的 Windows 凭据(域用户)。
此服务的目的是处理 MSMQ 消息。排队的消息做各种重要的事情。
出于某种原因,他们一次只能运行 5 个这些服务。当我们启动 6th 时,服务在启动时崩溃。
例如,我可以开始#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
Run Code Online (Sandbox Code Playgroud)
我相信传递给 Kernel32.RaiseException, c06d007e 的错误代码意味着找不到模块,但我不确定。
这对任何人来说听起来都很熟悉吗?我们是否对某个文件名的服务实例数量达到了某种限制?MSMQ 不喜欢超过 5 个监听服务吗?
小智 1
如果您的服务正在为每个实例加载消息队列驱动程序 (Mqac.sys) 的副本,则您可能会耗尽系统视图空间内存池。每个 MSMQ 实例使用该池的 4MB,默认情况下池大小仅为 16MB。
这是否真的发生实际上取决于您的服务如何(如果有的话)使用 MSMQ 系统,以及它是直接引用它(加载其库)还是使用某种其他方法(例如套接字)与其通信。
如果事实证明您正在加载 MSMQ 的多个实例,您可以通过增加系统视图空间池来缓解问题。这可以通过以下方式完成:
归档时间: |
|
查看次数: |
1228 次 |
最近记录: |