2010-03-06 9 views
6

La aplicación web de nuestro cliente se reinicia repentinamente a intervalos aleatorios. Para cada reinicio, hemos encontrado una entrada como esta en el registro de sucesos de Windows:bloqueo de aplicaciones web ASP.NET: creo que es causado por el bloqueo de 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'. 

Esto ha ocurrido 10 veces en 3 semanas, varios de los que están siendo 2 o 3 veces en varias horas, y también repasando una semana sin que ocurra.

En el volcado de bloqueo que tenemos tal vez 70-80 conexiones de cliente, así:

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 

(eso es 55 minutos !!! No hay razón para una conexión de cliente debe estar conectado todo el día)

entradas relevantes en machine.config:

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

y (interior):

<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" /> 

La última vez que pudimos verlo tal como estaba sucediendo, vimos alrededor de 20 consultas en estado 'suspendido' en el servidor Sql. Parecía que todos podrían haber sido relacionados con una tabla (la tabla de Items, una muy central para muchas operaciones diferentes).

No estábamos seguros de qué era lo mejor que podía hacer en el medio del problema. Cuando se produjo el bloqueo, el servidor Sql se borró.

Cualquier orientación sobre lo que está pasando, o cómo saber qué está pasando, sería muy apreciada.

+0

Buena pregunta. Pero aprende a formatear tus preguntas. Consulte el cuadro amarillo "cómo formatear" cuando ingresa la pregunta. –

Respuesta

4

Si se trata de un punto muerto, significa que hay un punto muerto que tiene un bucle que se completa fuera de SQL. Lo que significa que está tratando de adquirir recursos de proceso (es decir, 'bloqueo' C#) mientras mantiene recursos SQL (es decir, una transacción). Para dar un ejemplo Houw esto puede suceder considere el siguiente escenario:

  1. T1 inicia una transacción de SQL y actualiza una tabla A en SQL
  2. T2 se bloquea un objeto en C#
  3. T1 intenta bloquear el mismo objeto en C#, bloques en la cerradura de T2
  4. T2 se lee de la tabla de SQL a, los bloques en la actualización de T1
  5. T1 T2 espera en el interior de su proceso, T2 T1 espera a que el interior de SQL, estancamiento indetectable

Situaciones como esta no se pueden detectar dentro de la monitorización de interbloqueo de SQL, ya que el bucle de interbloqueo se completa fuera de SQL. ¿Cómo diagnosticarías ese problema? Para el lado del servidor SQL del ciclo, tiene a su disposición una gran cantidad de poderosas herramientas, principalmente sys.dm_exec_requests, que le pueden indicar qué solicitudes están bloqueadas por qué. Pero desafortunadamente en el tamaño de la aplicación del ciclo no hay instrumentos listos para usar, por lo que está solo.Un ojo experimentado puede detectar el problema en la inspección de código (hacer llamadas SQL mientras mantiene bloqueos C o adquirir bloqueos C# en medio de transacciones SQL es una gran obsequio); de lo contrario, tiene que ejercitar alguna maestría WinDbg -fu, o instrumentar el código.

También debe considerar que esto no es un punto muerto en absoluto. Puede tener sus 20 solicitudes SQL bloqueadas por un defecto de código ordinario en su aplicación, como una fuga de transacción en ciertas solicitudes (es decir, las solicitudes esperan una transacción que las bloquea para confirmar, pero esa transacción se ha filtrado en el código y nunca será cerrado). De nuevo, sys.dm_exec_requests es tu amigo.

1

Compruebe los procesos en ejecución en el servidor SQL utilizando el monitor de actividad.

ACTUALIZACIÓN: vi que este error específico probablemente no es SQL. Encontré este artículo sobre cómo generar más información en el punto muerto: http://support.microsoft.com/?ID=828222

Cuestiones relacionadas