gpt4 book ai didi

.net - CLR .tail 指令是否禁用抢占式 GC?

转载 作者:行者123 更新时间:2023-12-04 08:49:13 25 4
gpt4 key购买 nike

我正在尝试使用 Windows 服务调试生产问题,一旦多个并发连接处于事件状态,该服务就会迅速崩溃。通过核心转储和 DebugDiag 的魔力,我能够发现有一个挂起的 GC 操作,直到几个禁用抢占式 GC 的线程完成它们的工作后才能启动。

这是来自 WinDbg 的示例线程转储,显示了有问题的线程:

26   6e  1444 00..440   8009222 Disabled 00..200:00..f88 00..7a0     0 MTA (Threadpool Completion Port)
27 c1 1a0c 00..fe0 8009222 Disabled 00..e90:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
28 b5 17bc 00..6f0 8009222 Disabled 00..268:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
29 89 1f1c 00..ab0 8009222 Disabled 00..a30:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
30 ac 2340 00..f70 8009220 Disabled 00..d00:00..d08 00..7a0 1 MTA (GC) (Threadpool Completion Port)
31 88 1b64 00..fd0 8009220 Enabled 00..b28:00..b48 00..7a0 0 MTA (Threadpool Completion Port)

因此,在这里您可以看到几个禁用了抢占式 GC 的线程(线程 26、27、28、29)和一个(线程 30)正在等待这些线程执行 GC。

我的 Google-fu 带我到 this blog post它描述了听起来类似的问题,只是在我的情况下没有涉及 XML。它给了我足够的信息来知道去哪里挖掘,最终我发现禁用抢占式 GC 的线程的一个共同特征是堆栈跟踪,在顶部看起来像这样:
ntdll!NtWaitForSingleObject+a
ntdll!RtlpWaitOnCriticalSection+e8
ntdll!RtlEnterCriticalSection+d1
ntdll!RtlpLookupDynamicFunctionEntry+58
ntdll!RtlLookupFunctionEntry+a3
clr!JIT_TailCall+db
...

DebugDiag 还警告了我有关 CriticalSection 的信息,而且恰好是带有 JIT_TailCall 的线程。也是唯一带有 RtlEnterCriticalSection 的线程

所以我的问题是:它实际上是 .tail吗?导致此死锁的指令?如果是这样:我该怎么办?

我可以在我的 .fsproj 文件上禁用尾调用,但看起来其中至少一个来自 FSharp.Core.dll反编译器中的一些探索似乎证实了 .tail 的存在操作说明。所以我不知道更改项目配置会删除所有 .tail指示。

有没有人处理过这样的事情?

更新:
一些可能有用的更多信息。

这是 !locks 的输出对于这个转储:
!locks

CritSec +401680 at 0000000000401680
WaiterWoken No
LockCount 0
RecursionCount 1
OwningThread 2340
EntryCount 0
ContentionCount bf
*** Locked

Scanned 1657 critical sections

线程 2340 是启动 GC 的线程(我上面包含的部分列表中的线程 30)。

!syncblk只显示 ZooKeeper 客户端拥有的项目(虽然很烦人,但不涉及任何阻止 GC 启动的堆栈)
!syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
11 0000000019721a38 1 1 0000000019766e20 638 7 0000000000fb2950 System.Collections.Generic.LinkedList`1[[ZooKeeperNet.Packet, ZooKeeperNet]]
Waiting threads:
18 0000000019721c68 1 1 000000001ae71420 8ac 13 00000000012defc8 System.Collections.Generic.LinkedList`1[[ZooKeeperNet.Packet, ZooKeeperNet]]
Waiting threads:
-----------------------------
Total 64
CCW 0
RCW 0
ComClassFactory 0
Free 5

最佳答案

我怀疑尾声是问题所在(否则,我怀疑更多的 F# 用户会遇到这个问题)。从调用堆栈来看,您的代码似乎正在等待关键部分,这似乎更有可能是问题的根源......知道您的代码可能依赖哪些同步原语吗?

关于.net - CLR .tail 指令是否禁用抢占式 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18666100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com