我遇到了一个问题,多个请求(在AppPool关闭之前大约有300个)正在等待HttpApplicationState的写锁。这仅发生在我们的一台服务器上。在另一台服务器上,该站点可以正常运行,而无需进入这种状态。
我通过在windbg中查看w3wp转储发现了这一点。奇怪的是,在所有转储中都没有锁的“所有者”。这表示_lock的值为-1,表示其为写锁,但_threadId为0。我想这可能是一种竞争条件,我在清除锁的同时创建了转储,但它发生在我拥有的所有转储中。
0:446> !DumpObj /d 05fc0088
Name: System.Web.HttpApplicationStateLock
MethodTable: 21a64d00
EEClass: 21a71118
Size: 20(0x14) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_32\System.Web\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Web.dll
Fields:
MT Field Offset Type VT Attr Value Name
010dc860 4001927 4 System.Int32 1 instance -1 _lock
010dc860 4000274 8 System.Int32 1 instance 0 _recursionCount
010dc860 4000275 c System.Int32 1 instance 0 _threadId
关于为什么它仅在一台服务器上发生,是否有某种环境会影响HttpApplicationState的性能
在进一步检查之后,每个转储中都有一个线程在Lock上调用ReleaseWrite(),因此它正在被释放。如此多的请求正在等待如此快速的操作,这仍然是一种奇怪的行为。