解决在IIS 6.0上托管WCF服务的svchost.exe的100%cpu挂起?

时间:2011-11-21 13:04:19

标签: wcf iis-6 cpu windbg

我们在Windows Server 2003 SP2 x64上的IIS 6.0上托管的WCF服务遇到了一个奇怪的cpu问题。在我们的一些环境中,似乎当应用程序池启动时,运行iissvcs的svchost.exe将旋转到100%cpu并无限期地停留(观察3天以上)。

调查花絮:

  • 它似乎不是任何特定的应用程序池(我们托管5+ WCF 每个自己的应用程序池中的服务也不会每次都发生。
  • 启动了w3wp.exe进程,但几乎没有使用内存/ cpu - 看起来很早就初始化了。
  • 看起来奇怪的是它实际上是svchost.exe而不是w3wp.exe是100%,所以我怀疑配置问题。它似乎永远不会触及我们的代码。
  • 我们有3个环境有问题,1个环境没有。不幸的是环境是手动安装的,所以它们并不完全相同。
  • 环境似乎只会被我们的两个分支之一“感染”。但是在第一次看到问题之后,即使部署了另一个分支,问题仍然存在。
  • 这个过程似乎没有I / O,无论是磁盘还是网络。
  • 已从其中一台服务器禁用了防病毒软件。

我花了无数个小时搜索这个问题,我无法在SO / google上找到任何相关问题。

使用WinDbg调查转储表示活动线程堆栈跟踪是:

00000000 000afaa8 00000000 77d6e4a6 ntdll!NtReadFile + 0xa 00000000 000afab0 000007ff 7fefe89e kernel32!ReadFile + 0x1e0 00000000 000afb50 000007ff 7fefe7cd advapi32!ScGetPipeInput + 0x3e 00000000 000afbc0 000007ff 7fee4ec9 advapi32!ScDispatcherLoop + 0xa0 00000000 000afca0 00000001 00002b29 advapi32!StartServiceCtrlDispatcherW + 0x119 00000000 000aff10 00000001 000029be svchost!wmainCRTStartup + 0x18a 00000000 000aff50 00000000 77d596ac svchost!wmainCRTStartup + 0xe 00000000 000aff80 00000000 00000000 kernel32!BaseProcessStart + 0x29

但是,转储正常工作的svchost.exe会产生相同的结果。

所有线程的堆栈跟踪:

我想在这里加入痕迹,但由于它们很长,我暂时将它们放在pastebin上。

对于可能导致这种情况的原因 - 或进一步调查的方法 - 的任何见解都是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

有几点:

此线程在尝试分配内存时遇到异常:

      10  Id: b8c.9bc Suspend: 0 Teb: 000007ff`fff9c000 Unfrozen
Child-SP          RetAddr           Call Site
00000000`01c1e020 00000000`77ee5a46 ntdll!RtlpUnwindPrologue+0x83
00000000`01c1e070 00000000`77ee6198 ntdll!RtlVirtualUnwind+0x4f3
00000000`01c1e0f0 00000000`77ee65d9 ntdll!RtlUnwindEx+0x155
00000000`01c1e770 00000000`77ee459d ntdll!_C_specific_handler+0xdd
00000000`01c1e800 00000000`77ee60a7 ntdll!RtlpExecuteHandlerForException+0xd
00000000`01c1e830 00000000`77ef31ed ntdll!RtlDispatchException+0x1b4
00000000`01c1eee0 00000000`77ef6409 ntdll!KiUserExceptionDispatch+0x2d
00000000`01c1f480 00000000`77ef636f ntdll!RtlpLowFragHeapAlloc+0x404
00000000`01c1f570 000007ff`7fefef84 ntdll!RtlAllocateHeap+0xc1
00000000`01c1f7c0 000007ff`6b0c9d32 advapi32!ReportEventW+0xb8
00000000`01c1f880 000007ff`6b0c9bb8 iisutil!EVENT_LOG::LogEventPrivate+0xe2
00000000`01c1f910 000007ff`6b05a58f iisutil!EVENT_LOG::LogEvent+0x148
00000000`01c1f9a0 000007ff`6b05c793 iisw3adm!CONFIG_MANAGER::CrossValidateDataObjects+0x30f
00000000`01c1fd80 000007ff`6b05c4d5 iisw3adm!CONFIG_MANAGER::FinishChangeProcessingOnConfigThread+0x1d3
00000000`01c1fe10 000007ff`6b06b780 iisw3adm!CONFIG_MANAGER::ProcessMetabaseChangeOnConfigThread+0x115
00000000`01c1fe90 000007ff`6b044f39 iisw3adm!MB_CHANGE_ITEM::ExecuteWorkItem+0x30
00000000`01c1fec0 000007ff`6b06ad7a iisw3adm!WORK_QUEUE::ProcessWorkItem+0xb9
00000000`01c1ff10 000007ff`6b05c179 iisw3adm!CHANGE_PROCESSOR::RunNotificationWorkQueue+0x9a
00000000`01c1ff50 00000000`77d6b71a iisw3adm!ChangeNotificationLauncher+0x9
00000000`01c1ff80 00000000`00000000 kernel32!BaseThreadStart+0x3a

线程堆栈13,16,17具有相同的问题。这看起来像堆损坏,但没有转储文件很难验证。在某处,应用程序的动态内存管理代码存在错误。

iiws3adm存在多个错误,因此最好将机器修补到最新级别。否则,下一步是检查堆损坏。