2010-02-10 85 views
2

生产服务器有一个应用程序运行24x7,有时它开始占用近50%的CPU。我无法在本地重现它,但是我用adplus做了一次Memory Dump。 服务器具有Windows 2008 Server 64位,.NET 3.5。应用程序监听一个MSMQ并有一个线程池来执行操作,当我执行了内存转储时,它应该没有任何运行,但它仍然在使用CPU。.net应用程序挂起。奇怪的崩溃转储

下面是转储。你知道会发生什么吗?这很奇怪,慢线程也说GC禁用!那是什么?

这很奇怪我在同一台服务器上有一个ASP.NET应用程序,有时会发生同样的事情。

0:000> !threads 
ThreadCount: 23 
UnstartedThread: 0 
BackgroundThread: 6 
PendingThread: 0 
DeadThread: 5 
Hosted Runtime: no 
               PreEmptive            Lock 
     ID OSID  ThreadOBJ  State GC  GC Alloc Context     Domain   Count APT Exception 
    0 1 1ec0 0000000000249c10  a020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    2 2 84c 0000000000253470  b220 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA (Finalizer) 
    3 3 10b8 0000000019d0f900 80a220 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA (Threadpool Completion Port) 
    5 4 2184 0000000019d4a550 880b220 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA (Threadpool Completion Port) 
    6 6 14a0 0000000019d602a0 180b220 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA (Threadpool Worker) 
    8 7 490 0000000019d7db70 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    9 8 2164 0000000019dae680 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    10 9 ac0 0000000019db4740 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    11 a 24cc 0000000019db51f0 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    12 b 1fb4 0000000019db5ca0 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    13 c 2408 0000000019db1520 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    14 d 1b44 0000000019db1fd0 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    15 e 1280 0000000019db2a80 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    16 f 206c 0000000019db8780 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    17 10 1ff8 0000000019db9230 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    18 11 2548 0000000019dc2120 200b020 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA 
    20 18 2588 0000000019dc49d0 180b220 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 MTA (Threadpool Worker) 
    21 1a 20a0 0000000019dc5570  b220 Disabled 0000000001653d88:0000000001655978 00000000002410b0  1 MTA 
XXXX 26 0 0000000019dc89c0  9820 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 Ukn 
XXXX 2c 0 0000000019dc5b40  9820 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 Ukn 
XXXX 2b 0 0000000019dc3290  9820 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 Ukn 
XXXX 5 0 0000000019dc8f90  9820 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 Ukn 
XXXX 27 0 0000000019dc7850  9820 Enabled 0000000000000000:0000000000000000 00000000002410b0  0 Ukn 

0:000> !runaway 
User Mode Time 
    Thread  Time 
    **21:20a0  0 days 0:27:21.718** 
    6:14a0  0 days 0:00:01.921 
    18:2548  0 days 0:00:01.015 
    2:84c  0 days 0:00:00.890 
    (18 more....) 

0:000> ~21s 
*** WARNING: Unable to verify checksum for System.ni.dll 
mscorwks!JIT_WriteBarrier_Fast+0x3: 
000007fe`f88de5c3 4881fa607f4701 cmp  rdx,1477F60h 

0:021> !clrstack 
OS Thread Id: 0x20a0 (21) 
*** WARNING: Unable to verify checksum for mscorlib.ni.dll 
Child-SP   RetAddr   Call Site 
000000001b05f090 000007fef651b1ba System.Net.TimerThread+TimerNode..ctor(Callback, System.Object, Int32, System.Object) 
000000001b05f0d0 000007fef69a0c3f System.Net.TimerThread+TimerQueue.CreateTimer(Callback, System.Object) 
000000001b05f180 000007fef651b73e System.Net.ConnectionPool.CleanupCallbackWrapper(Timer, Int32, System.Object) 
000000001b05f1d0 000007fef651b560 System.Net.TimerThread+TimerNode.Fire() 
000000001b05f2a0 000007fef64e6388 System.Net.TimerThread+TimerQueue.Fire(Int32 ByRef) 
000000001b05f330 000007fef271175b System.Net.TimerThread.ThreadProc() 
000000001b05f400 000007fef27a95fd System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
000000001b05f450 000007fef88e1552 System.Threading.ThreadHelper.ThreadStart() 
0:021> kb 
RetAddr   : Args to Child  : Call Site 
000007fe`f6a1b87e : 00000000 (Edited) : mscorwks!JIT_WriteBarrier_Fast+0x3 
000007fe`f651b1ba : 00000000 (Edited) : System_ni+0x70b87e 
000007fe`f69a0c3f : 00000000 (Edited) : System_ni+0x20b1ba 
000007fe`f651b73e : 000007fe (Edited) : System_ni+0x690c3f 
000007fe`f651b560 : 00000000 (Edited) : System_ni+0x20b73e 
000007fe`f64e6388 : 00000000 (Edited) : System_ni+0x20b560 
000007fe`f271175b : 00000000 (Edited) : System_ni+0x1d6388 
000007fe`f27a95fd : 00000000 (Edited) : mscorlib_ni+0x2f175b 
000007fe`f88e1552 : 00000000 (Edited) : mscorlib_ni+0x3895fd 
000007fe`f877e5e3 : 00000000 (Edited) : mscorwks!CallDescrWorker+0x82 
000007fe`f878c83f : 00000000 (Edited) : mscorwks!CallDescrWorkerWithHandler+0xd3 
000007fe`f887ae8d : 00000000 (Edited) : mscorwks!MethodDesc::CallDescr+0x24f 
000007fe`f8839374 : 00000000 (Edited) : mscorwks!ThreadNative::KickOffThread_Worker+0x191 
000007fe`f8732045 : 00000000 (Edited) : mscorwks!TypeHandle::GetParent+0x5c 
000007fe`f8846139 : 00000000 (Edited) : mscorwks!SVR::gc_heap::make_heap_segment+0x155 
000007fe`f8700e15 : 00000000 (Edited) : mscorwks!ZapStubPrecode::GetType+0x39 
000007fe`f8700ae7 : 00000000 (Edited) : mscorwks!ThreadNative::KickOffThread+0x401 
000007fe`f88614fc : 00000002 (Edited) : mscorwks!ThreadNative::KickOffThread+0xd3 
00000000`76bdbe3d : 00000000 (Edited) : mscorwks!Thread::intermediateThreadProc+0x78 
00000000`76d16a51 : 00000000 (Edited) : kernel32!BaseThreadInitThunk+0xd 
+0

哇!你是否告诉我GC由于线程池耗尽而饿死或拒绝服务? – t0mm13b 2010-02-10 00:21:21

+0

这是64位的环境? – t0mm13b 2010-02-10 00:33:16

+0

我告诉你我不知道:)。但其他转储也显示这样的问题,所以完全有可能。你知道任何解决方法或提示如何进行?谢谢! – 2010-02-10 00:34:12

回答

2

我这里用至今没有专家敢,但一些更多的信息,可能是有用的:

  • this,是在CLR启动时创建GC线程,至少对于服务器GC,所以 不具有对GC运行足够的线程是可能甚至无法;-)

  • “已禁用”,在 线21的“GC”列只是意味着它决定 没有不会被最终的GC 操作所占用。当线程上的 代码确定它是 执行不应受GC干扰的关键操作(如 加载和装配,因此融合)时,会发生这种情况。

  • 从 “KB” 命令输出我 猜你实际上是使用 服务器GC(的StackFrame “mscorwks SVR :: gc_heap :: make_heap_segment!”; 工作站GC将有一些 带班/命名空间“WKS”)。 这并非意外,因为它应该是 在“服务器 操作”系统上的默认值。你应该使用“!eeversion”命令确定这一点。 此外,您应该了解您拥有多少个核心,因为如果服务器GC运行,它将使用尽可能多的线程(每个逻辑/物理核心一个线程)。

难道是,定时器很频繁地发射,还是比前一个完成得快。您可以使用“!ThreadPool”命令获得线程池线程使用情况的概述。另外,您可能需要检查方法和本地语句(!clrstack -a)和/或堆栈上当前对象(!dso)的实际参数。也许这可以让我们更清楚一些。

作为疯狂的猜测,一些“System.Net.ConnectionPool.CleanupCallbackWrapper”的搜索结果产生以下链接,也许这可能是你的问题?

+0

Awsome!我会看一看。谢谢! – 2010-02-10 13:04:49

+0

你是我的新神。 SmtpClient类是问题,我现在要解决这个问题。非常感谢你! – 2010-02-10 14:20:25