加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET Web应用程序死锁 – 认为它是由SQL Server锁定引起的

发布时间:2020-12-16 03:54:36 所属栏目:asp.Net 来源:网络整理
导读:我们客户的网络应用程序会以随机间隔突然重启.对于每次重启,我们在 Windows事件日志中找到了这样的条目: Event Type: WarningEvent Source: W3SVC-WPEvent Category: NoneEvent ID: 2262Date: 2/21/2010Time: 1:33:52 PMUser: N/AComputer: LIQUID-NXCFZ9DJ
我们客户的网络应用程序会以随机间隔突然重启.对于每次重启,我们在 Windows事件日志中找到了这样的条目:

Event Type: Warning
Event Source: W3SVC-WP
Event Category: None
Event ID: 2262
Date: 2/21/2010
Time: 1:33:52 PM
User: N/A
Computer: LIQUID-NXCFZ9DJ
Description:
ISAPI 'c:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll' reported itself as unhealthy for the following reason: 'Deadlock detected'.

这种情况在3周内发生了10次,其中有几次在几个小时内发生了2到3次,并且在没有发生这种情况的情况下持续了一周.

在崩溃转储中,我们可能有70-80个客户端连接,如下所示:

GET request for   <path here>
Mapped To URL    <mapped path>
HTTP Version    HTTP/1.1
SSL Request    False
Time alive    00:55:24
QueryString    <query string here>
Request mapped to    
HTTP Request State    HTR_READING_CLIENT_REQUEST
Native Request State    NREQ_STATE_PROCESS

(这是55分钟!!!没有理由客户端连接应该在那么久)

machine.config中的相关条目:

<system.net>
<connectionManagement>
<add address="*" maxconnection="200" />
</connectionManagement>
</system.net>

和(内):

<deployment retail="true" />
<!--<customErrors mode="Off"/>-->

<processModel autoConfig="true"
memoryLimit="60"
maxIoThreads="200"
minIoThreads="30"
minWorkerThreads="40"
maxWorkerThreads="200"
clientConnectedCheck="00:00:05" />
<httpRuntime
minFreeThreads="20"
minLocalRequestFreeThreads="10"
enableKernelOutputCache="false"
maxRequestLength="10240" />

最近一次,我们能够查看它发生的情况,并在Sql Server中看到大约20个查询都处于“挂起”状态.看起来它们可能都与一个表有关(Items表,一个非常重要的用于许多不同的操作).

我们不确定最好的办法是在问题的中间.崩溃发生时,Sql Server清除.

任何有关正在发生的事情的指导,或如何找出正在发生的事情,都将非常感激.

解决方法

如果它是死锁,则意味着死锁具有在SQL外部完成的循环.这意味着您在保存SQL资源(即事务)时尝试获取进程资源(即C#’lock’).举个例子,可以考虑以下情况:

> T1启动SQL事务并更新SQL中的表A.
> T2锁定C#中的对象
> T1尝试在C#中锁定相同的对象,阻止T2的锁定
> T2从SQL表A读取,阻止T1的更新
> T1在你的进程内等待T2,T2在SQL内部等待T1,无法检测到死锁

在SQL的死锁监视中无法检测到这种情况,因为死锁循环在SQL之外完成.你怎么诊断这样的问题?对于循环的SQL服务器端,您可以使用许多强大的工具,主要是sys.dm_exec_requests,它可以告诉您哪些请求被哪些请求阻止.但不幸的是,在循环的应用程序大小上没有开箱即用的仪器,所以你是独立的.经验丰富的眼睛可以检测代码检查的问题(在SQL事务处理期间执行SQL调用同时执行SQL调用或获取C#锁是一个很大的收获),否则你必须运用一些熟练的WinDbg-fu,或者仪器码.

您还应该考虑到这根本不是僵局.您可以让应用程序中的普通代码缺陷阻止您的20个SQL请求,例如某些请求上的事务泄漏(即,请求等待阻止它们提交的事务,但该事务已泄漏到代码中,并且永远不会关闭).同样,sys.dm_exec_requests是你的朋友.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读