【问题标题】:100% CPU, stuck on CreateDelegate and CerHashtable`2.get_Item100% CPU,卡在 CreateDelegate 和 CerHashtable`2.get_Item
【发布时间】: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 上,因为它不适合这篇文章)

http://pastebin.com/qcF4jX1g

我使用的是 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


【解决方案1】:

Linq-To-Sql 已被 Microsoft 停产。

他们推荐使用实体框架。

这不会是一个大修,因为你的 linq 代码我们仍然有效。 您只需要重新创建数据模型。

对于 .Net 3.5,您可以使用 EF v1。

尝试从http://www.microsoft.com/download/en/details.aspx?id=22下载 Microsoft .NET Framework 3.5 Service Pack 1
它应该包括http://en.wikipedia.org/wiki/ADO.NET_Entity_Framework 中所述的第一版实体框架 (EFv1)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多