2013-03-22 12 views
11

Sto esaminando un problema con il nostro sito Web che utilizza il server SQL per gestire le sessioni. Il sito Web è webforms asp.net basato sul sitecore CMS. Abbiamo lo stesso codice in vari ambienti, ad es. Controllo qualità, organizzazione e produzione.dbo.TempGetStateItemExclusive3 chiamato ripetutamente

Nella produzione, ciò che stiamo vedendo è, periodicamente, un utilizzo della CPU in rapida crescita che non è correlato in alcun modo al traffico verso il server. Insieme a questo picco di cpu, stiamo vedendo un picco corrispondente nell'I/O della rete.

Il nostro software di monitoraggio non distingue tra traffico verso Internet e traffico verso il server DB; tuttavia, ciò che stiamo vedendo sul server DB è letteralmente centinaia di chiamate al secondo a dbo.TempGetStateItemExclusive3 nel database di sessione asp, tutto per lo stesso ID di sessione e nessuna quantità corrispondente di richieste di pagine provenienti dai server web.

Con lo stesso codice e configurazione, semplicemente non vediamo questo comportamento per altri ambienti. Inoltre, non lo vediamo per altri ID di sessione, solo questo specifico.

L'eliminazione della riga dal database comporta semplicemente la ricreazione con lo stesso ID di sessione.

UPDATE

ho trovato questo errore nel registro eventi:

Violation of PRIMARY KEY constraint 'PK__ASPState__C9F49290145C0A3F'. Cannot insert duplicate key in object 'dbo.ASPStateTempSessions'. The duplicate key value is (sessionidwiththeproblem). The statement has been terminated. 
Stack trace: 

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean\ breakConnection) 
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand\ cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,\ TdsParserStateObject stateObj) 
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,\ RunBehavior runBehavior, String resetOptionsString) 
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, Boolean async) 
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,\ RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult\ result, String methodName, Boolean sendToPipe) 
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 
at System.Web.SessionState.SqlSessionStateStore.SqlExecuteNonQueryWithRetry(SqlCommand\ cmd, Boolean ignoreInsertPKException, String id) 

Chiunque tutte le idee come un duplicato ID di sessione potrebbe essere tentata da creare?

+0

Sei stato in grado di vedere un modello con quanto tempo questi picchi normalmente scorso, la frequenza con cui si verificano, e/o che ora del giorno si verificano? – jadarnel27

+0

Questa è solo una specie di ripresa al buio, ma i tuoi pool di app sono configurati (significativamente) in modo diverso tra i diversi ambienti? Mi chiedo se la massa delle chiamate DB si allinei con qualche tipo di ciclo pianificato/normale del pool di app di produzione (il pool di app ripristina e il runtime di ASP.NET sta ripristinando tutte le sessioni non scadute da SQL Server contemporaneamente) . – jadarnel27

+0

I picchi durano fino a quando il pool di app non viene riciclato. Questo di solito risolve il problema per un po '. Non esiste un modello reale che sembra accadere a caso. In precedenza, in precedenza, il riciclaggio delle piscine di applicazioni veniva pianificato ogni giorno, per cui dovevamo modificarlo ogni 2 ore per cercare di mitigare il problema. Se è utile, abbiamo 2 server front-end Web bilanciati utilizzando sessioni adesive. I nostri tecnici ISP ci dicono che non c'è traffico corrispondente in arrivo sul LB, quindi è come se qualche thread in fuga stia effettuando queste chiamate. –

risposta

0

Sembra un problema SQL piuttosto che uno Sitecore, probabilmente correlato alle sessioni non chiarite. Non sono un DBA ma SQL Agent è abilitato? Il server SQL di produzione è in un altro service pack/livello di patch per gli altri ambienti (l'articolo this menziona alcuni vecchi hotfix per un problema simile)?

Alcuni link per le indagini, fino a quando qualcuno non può rispondere in modo più specifico! Potresti voler includere alcune informazioni su quali versioni di SQL stai usando.

http://jerschneid.blogspot.co.uk/2010/01/aspnet-sql-server-requests-timing-out.html

https://www.simple-talk.com/sql/sql-tools/how-to-identify-blocking-problems-with-sql-profiler/

+0

Grazie per l'input, sì Agente SQL è in esecuzione e il processo di pulizia è in esecuzione correttamente. Ci sono forse 400 righe nella tabella sessionstate e il DB è di circa 15 MB. –

0

Per esplorare l'idea che è potrebbe essere qualcosa nella messa a punto di applicazione all'interno di IIS, è possibile scaricare la configurazione del vostro sito utilizzando implementare web (msdeploy). Quindi eseguire un confronto sull'output tra la casella che presenta il problema e un'altra che non lo fa.

Qualcosa di simile a questa uscita volontà di console

msdeploy –verb:dump –source:appHostConfig="Default Web Site" 

o come XML

msdeploy –verb:dump –source:appHostConfig="Default Web Site" -xml 

Vedi http://technet.microsoft.com/en-us/library/dd569101(v=ws.10).aspx

7

che abbiamo affrontato un problema simile avente la seguente configurazione:

  • IIS 7.5
  • .NET Framework 4.0
  • Windows 2008 (sia sul IIS e il server DB)
  • sessioni gestite dal database ASPState

Il problema era che a volte alcune delle sessioni rimasto chiuso nel database ASPState, con conseguente centinaia di chiamate al secondo a dbo.TempGetStateItemExclusive3 per ciascuna delle sessioni bloccate.

La CPU sul server IIS alla fine salirà con il numero di sessioni bloccate. Una soluzione temporanea era riciclare il pool di applicazioni.

Andando oltre e abilitando la Traccia sui server IIS e quindi analizzando le tracce, abbiamo notato che ogni volta che si verificava un problema (ad es. Un problema di connettività di rete che causava un errore del server interno 500) nel modulo EXECUTE_REQUEST_HANDLER, il prossimo il modulo che è RELEASE_REQUEST_STATE (e dovrebbe sbloccare la sessione) non è stato eseguito. Quindi la sessione è rimasta chiusa.

si è rivelato fino tratta di un problema da IIS e c'è stato risolto modificando il valore del uploadReadAheadSize a 0 nel web.config:

<system.webServer> 
    <serverRuntime uploadReadAheadSize="0" /> 
</system.webServer> 

La proprietà UploadReadAheadSize stabilisce il numero di byte di un server Web leggerà in un buffer e passerà a un'estensione ISAPI. Ciò si verifica una volta per richiesta del cliente.

Consulta anche: ManagedPipelineHandler for an AJAX POST crashes if an IE9 user navigates away from a page while that call was in progress

+0

Stiamo riscontrando questo stesso problema in produzione e stiamo prendendo in considerazione l'utilizzo della soluzione trovata. Non ho familiarità con quella proprietà, però, e ho difficoltà a trovare qualcosa sugli effetti di cambiarla su qualsiasi altra parte del sito. Sareste in grado di fornire maggiori dettagli su quali sarebbero gli altri effetti che regolano questo a 0? – Geneb

+0

Qual è l'istruzione 'SQL' per la visualizzazione ** sessioni rimaste bloccate ** nel database _ASPState_? COME ** monitoraggio ** _ centinaia di chiamate al secondo_: SQL Profiler o un altro software? – Kiquenet

+0

Quali sono i moduli eseguiti da IIS e *** *** ***? primo modulo EXECUTE_REQUEST_HANDLER, secondo RELEASE_REQUEST_STATE, ... – Kiquenet

Problemi correlati