2010-03-06 7 views
6

L'app Web del nostro cliente si riavvia improvvisamente a intervalli casuali. Per ogni riavvio, abbiamo trovato una voce simile nel registro eventi di Windows:deadlocking di applicazioni Web ASP.NET: si pensa che sia causato dal blocco di 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'. 

Questo è successo 10 volte in 3 settimane, molti di quelli che sono 2 o 3 volte in diverse ore, e anche andare oltre una settimana senza che ciò accada.

Nel crash dump che abbiamo forse 70-80 connessioni client, in questo modo:

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 

(che è di 55 minuti !!! non c'è ragione per una connessione client dovrebbe essere intorno così a lungo)

voci rilevanti in machine.config:

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

e (all'interno):

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

In questo ultimo momento siamo stati in grado di osservare come stava accadendo e abbiamo visto circa 20 query tutte in stato "sospeso" in Sql Server. Sembrava che avrebbero potuto essere tutti correlati a un tavolo (la tabella degli articoli, molto centrale per molte operazioni diverse).

Non eravamo sicuri di quale fosse la cosa migliore da fare nel bel mezzo del problema. Quando si è verificato l'arresto anomalo, Sql Server è stato eliminato.

Qualsiasi consiglio su cosa sta succedendo o su come scoprire cosa sta succedendo sarebbe molto apprezzato.

+0

Buona domanda. Ma per favore impara a formattare le tue domande. Guarda la casella gialla "come formattare" quando inserisci la domanda. –

risposta

4

Se si tratta di un deadlock, significa che è un deadlock che ha un ciclo che completa SQL esterno. Significa che stai cercando di acquisire risorse di processo (ad es. C# 'lock') mentre stai utilizzando le risorse SQL (ad esempio una transazione). Per fare un esempio Houw questo può accadere Si consideri il seguente scenario:

  1. T1 avvia una transazione di SQL e aggiorna una tabella A in SQL
  2. T2 blocca un oggetto in C#
  3. T1 tenta di bloccare lo stesso oggetto in C#, blocchi sul blocco del T2
  4. T2 legge dalla tabella SQL a, blocchi su aggiornamento del T1
  5. T1 T2 attende sul all'interno del vostro processo, T2 T1 attende all'interno di SQL, situazione di stallo non rilevabile

Situazioni come questa non possono essere rilevate all'interno del monitoraggio deadlock di SQL, poiché il ciclo di deadlock completa SQL esterno. Come faresti a diagnosticare un problema del genere? Per il lato server SQL del ciclo sono disponibili molti strumenti potenti, principalmente sys.dm_exec_requests che possono dirti quali richieste sono bloccate da cosa. Ma sfortunatamente sulla dimensione dell'app del loop non c'è strumentazione pronta all'uso, quindi sei da solo.Un occhio esperto può rilevare il problema dell'ispezione del codice (fare le chiamate SQL tenendo i blocchi C# o acquisire i blocchi C# nel mezzo delle transazioni SQL è un grande guadagno), altrimenti devi esercitare un po 'di maestria WinDbg -fu, o strumento il codice.

Si dovrebbe anche considerare che questo non è affatto un punto morto. Puoi avere le tue 20 richieste SQL bloccate da un difetto di codice ordinario nella tua applicazione, come una perdita di transazione su determinate richieste (ad esempio, le richieste attendono una transazione che le blocchi per il commit, ma quella transazione è trapelata nel codice e non sarà mai chiuso). Di nuovo, sys.dm_exec_requests è tuo amico.

1

Controllare i processi in esecuzione nel server SQL utilizzando il monitor Attività.

AGGIORNAMENTO: Ho visto che questo errore specifico probabilmente non è SQL. Ho trovato questo articolo su come generare più informazioni sul deadlock: http://support.microsoft.com/?ID=828222