2010-03-06 41 views
6

我们客户端的Web应用程序突然以随机间隔重新启动。对于每次重新启动,我们发现在Windows事件日志中这样的条目:ASP.NET Web应用程序死锁 - 认为它是由SQL Server锁定造成的

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:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_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个查询都处于“挂起”状态。看起来他们可能都与一张桌子相关(项目表,这是一个非常重要的项目表,用于很多不同的操作)。

我们不确定最好的事情是在问题的中间。发生崩溃时,Sql Server被清除。

任何有关正在发生的事情的指导或如何了解发生了什么,都将非常感激。

+0

好问题。但请学会格式化您的问题。当您输入问题时,请参阅黄色的“如何格式化”框。 – 2010-03-06 00:58:11

回答

4

如果它是一个死锁,则意味着一个死锁,它具有一个完成外部SQL的循环。这意味着您正在尝试获取流程资源(即C#“锁定”),同时持有SQL资源(即事务)。为了让houw会发生这种情况考虑以下情形的例子:

  1. T1启动SQL交易并更新SQL表格中的
  2. T2锁定在C#中的对象
  3. T1试图锁定同一个对象在C#中,在T2的锁块
  4. T2从SQL表A读取,在T1的更新模块
  5. T1上的过程中等待T2,T2等待SQL里面T1,检测不到僵局

在SQL的死锁监视中无法检测到类似情况,因为死锁循环在SQL外部完成。你将如何诊断这样的问题?对于循环的SQL服务器端,您可以使用许多强大的工具,主要是sys.dm_exec_requests,它可以告诉您哪些请求被什么阻塞。但不幸的是,在循环的应用程序大小中,没有开箱即用的仪器,因此您是独立的。一个经验丰富的眼睛可以检测代码检查的问题(在SQL事务中间持有C#锁或获取C#锁的同时进行SQL调用是一个很大的放弃),否则你不得不练习一些熟练的WinDbg -fu或者码。

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

1

使用活动监视器检查SQL服务器中正在运行的进程。

更新:我看到这个特定的错误可能不是SQL。我发现这篇文章介绍如何生成关于死锁的更多信息:http://support.microsoft.com/?ID=828222