Ich untersuche ein Problem mit unserer Website, die SQL Server zum Verwalten von Sitzungen verwendet. Die Website ist asp.net Webforms basierend auf dem Sitecore CMS. Wir haben den gleichen Code in verschiedenen Umgebungen, z.B. QA, Inszenierung und Produktion.dbo.TempGetStateItemExclusive3 wiederholt aufgerufen
In der Produktion sehen wir regelmäßig eine schnell ansteigende CPU-Auslastung, die in keiner Weise mit dem Datenverkehr zum Server korreliert. Zusammen mit dieser CPU-Spitze sehen wir einen entsprechenden Anstieg der Netzwerk-E/A.
Unsere Überwachungssoftware unterscheidet nicht zwischen Datenverkehr zum Internet und Datenverkehr zum DB-Server; Was wir jedoch auf dem DB-Server sehen, ist buchstäblich Hunderte von Anrufen pro Sekunde zu dbo.TempGetStateItemExclusive3
in der ASP-Session-Datenbank, alle für die gleiche Session-ID und keine entsprechende Menge von Seitenanforderungen in die Webserver kommen.
Mit dem gleichen Code und der gleichen Konfiguration sehen wir dieses Verhalten für andere Umgebungen einfach nicht. Wir sehen es auch nicht für andere Sitzungs-IDs, nur diese eine spezifische.
Das Löschen der Zeile aus der Datenbank führt einfach dazu, dass sie mit derselben Sitzungs-ID neu erstellt wird.
UPDATE
Ich habe diesen Fehler in dem Ereignisprotokoll gefunden:
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)
jemand irgendwelche Ideen, wie eine doppelte Session-ID möglicherweise versucht werden könnte, geschaffen werden?
Können Sie dauern in der Regel ein Muster mit, wie lange diese Spitzen sehen, wie häufig sie auftreten, und/oder zu welcher Tageszeit sie auftreten? – jadarnel27
Dies ist nur eine Art im Dunkeln, aber sind Ihre App-Pools (signifikant) unterschiedlich in den verschiedenen Umgebungen konfiguriert? Ich frage mich, ob die Masse von DB-Calls mit einer Art geplantem/regelmäßigem Zyklus des Produktions-App-Pools in Verbindung kommt (App-Pool wird zurückgesetzt und die ASP.NET-Laufzeit stellt alle nicht abgelaufenen Sitzungen von SQL Server auf einmal wieder her) . – jadarnel27
Die Spikes dauern bis der App-Pool recycelt wird. Dies beseitigt normalerweise das Problem für eine kurze Zeit. Es gibt kein wirkliches Muster, das zufällig vorkommt. Früher hatten wir das App-Pool-Recycling zu einem bestimmten Zeitpunkt jeden Tag, wir mussten dies alle zwei Stunden ändern, um dieses Problem zu beheben. Wenn es hilft, haben wir zwei Web-Front-End-Server, die mit Sticky-Sitzungen ausgeglichen werden. Unsere ISP-Techniker sagen uns, dass es keinen entsprechenden Verkehr über die LB gibt, also ist es so, als würde ein entlaufener Thread diese Anrufe tätigen. –