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?
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
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
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. –