【发布时间】:2015-12-14 23:29:37
【问题描述】:
我有一个 .NET 3.5 网站,它偶尔会挂起并达到 100% CPU。通过 WinDbg 运行转储显示大约一半的线程位于
System.Reflection.CerHashtable`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].get_Item(System.__Canon)
另一半坐在
System.Reflection.Emit.DynamicMethod.CreateDelegate(System.Type)
它们都在 LINQ-to-SQL 查询的中间。有人知道这里会发生什么吗?数据库似乎保持响应,至少在问题发生时来自 SSMS。
如果有人需要更多信息,请告诉我。
编辑:
有 22 个线程。 (当我说一半时,我是在概括)这是 !threads 的输出
线程数:23
未启动线程:0
背景线程:22
待处理线程:0
死线:1
托管运行时:否
抢先锁定
ID OSID ThreadOBJ State GC GC Alloc Context Domain Count APT Exception
7 1 19a0 00000000022c7710 8220 启用 0000000000000000:0000000000000000 00000000022a2940 0 Ukn
27 2 1fa0 0000000005591f90 b220 已启用 00000001a0425058:00000001a04266c0 00000000022a2940 0 MTA(终结器)
29 3 4824 0000000006550450 380b220 已启用 000000012213cf18:000000012213dec0 00000000067500a0 1 MTA(线程池工作者)
30 4 40c8 00000000061378c0 380b220 启用 00000001c1f84c38:00000001c1f860f0 00000000067500a0 1 MTA(线程池工作者)
31 5 2a54 0000000006138770 180b220 已禁用 0000000101e3c858:0000000101e3db00 00000000067500a0 2 MTA(线程池工作者)
32 6 1984 000000000613c940 180b220 已启用 0000000000000000:0000000000000000 00000000067500a0 0 MTA(线程池工作程序)System.ObjectDisposedException(000000017ffe458)
33 7 18d8 000000000613eb80 380b220 已启用 00000001820c3a30:00000001820c3c90 00000000067500a0 1 MTA(线程池工作者)
34 8 31f4 0000000006141d10 380b220 已启用 0000000122147048:0000000122147ec0 00000000067500a0 1 MTA(线程池工作者)
35 9 5fe4 00000000061427c0 180b220 已启用 00000001e1ffbdc8:00000001e1ffc190 00000000067500a0 2 MTA(线程池工作者)
36 a 3768 0000000006143270 180b220 已启用 00000001e200add0:00000001e200c190 00000000067500a0 1 MTA(线程池工作者)
37 b 1820 000000000670fa10 80a220 已启用 0000000000000000:0000000000000000 00000000022a2940 0 MTA(线程池完成端口)
38 c 1220 000000000673e160 1220 启用 0000000000000000:0000000000000000 00000000022a2940 0 Ukn
39 d 507c 0000000008c1f9b0 180b220 启用 0000000101e392d0:0000000101e39b00 00000000067500a0 2 MTA(线程池工作者)
14 e 651c 000000000a507000 880a220 已启用 0000000000000000:0000000000000000 00000000022a2940 0 MTA(线程池完成端口)
40 f 14a0 000000000ab0a850 380b220 已启用 00000001a15886c0:00000001a158a638 00000000067500a0 1 MTA(线程池工作者)
XXXX 10 0 000000000bd7c7b0 9820 启用 0000000000000000:0000000000000000 00000000022a2940 0 MTA
42 11 48d8 000000000c00c120 380b220 启用 0000000000000000:0000000000000000 00000000067500a0 0 MTA(线程池工作者)
3 12 6180 000000000c00c6f0 220 启用 0000000000000000:0000000000000000 00000000022a2940 0 Ukn
43 13 3798 000000000c00d290 180b220 已启用 00000001420f9730:00000001420f9828 00000000067500a0 2 MTA(线程池工作者)
45 14 1be8 000000001184f150 180b220 启用 00000001c1f880e0:00000001c1f880f0 00000000067500a0 2 MTA(线程池工作者)
48 15 13ec 000000001184f720 200b220 启用 0000000000000000:0000000000000000 00000000067500a0 1 MTA
49 17 3bac 00000000198f1b20 180b220 启用 0000000182059020:0000000182059c90 00000000067500a0 2 MTA(线程池工作者)
50 16 4670 00000000197b6b00 380b220 已启用 0000000162040fd0:0000000162042658 00000000067500a0 1 MTA(线程池工作者)
这是 !EEStack 的冗长结果(发布在 pastebin 上,因为它不适合这篇文章)
我使用的是 SQL 2005 标准
编辑:
这里的结果是 !syncblk,它显示“CerHashtable”为所有者,尽管 CerHashtable 上的所有线程似乎都在等待锁定?
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
148 000000000e4ec1f8 12 0 0000000000000000 无 000000017fe48560 System.Reflection.CerHashtable`2[[System.Reflection.RuntimeMethodInfo, mscorlib],[System.Reflection.RuntimeMethodInfo, mscorlib]]
等待线程:*** 警告:无法验证 NewRelic.Profiler.dll 的校验和
*** 错误:找不到符号文件。默认为 NewRelic.Profiler.dll 导出符号 -
29 30 33 34 40 50
-----------------------------------------
总计 252
逆时针 3
RCW 5
ComClassFactory 0
免费 81
【问题讨论】:
-
能否请您发布您的堆栈跟踪?
-
您是否检查过您是否也在使用非线程安全集合? Web 应用程序默认是多线程的,因此您必须手动锁定它们或切换到并发应用程序。
-
您使用的是 SQL Express 还是 SQL Standard?
-
一半的线程 - 多少线程?
-
编辑了问题。如果您还需要什么,请告诉我
标签: c# asp.net vb.net linq windbg