2013-03-22 6 views
11

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?

+0

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

+0

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

+0

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

Antwort

0

Sieht aus wie ein SQL-Problem und nicht ein Sitecore, möglicherweise im Zusammenhang mit Sitzungen, die nicht aufgeklärt werden. Ich bin kein DBA, aber ist der SQL-Agent aktiviert? Ist Ihr Produktions-SQL-Server auf einem anderen Service Pack/Patch-Level als die anderen Umgebungen (this Artikel erwähnt einige alte Hotfixes für ein ähnliches Problem)?

Einige Links zur Untersuchung, bis vielleicht jemand diese Frage genauer beantworten kann! Möglicherweise möchten Sie einige Informationen zu den von Ihnen verwendeten SQL-Versionen hinzufügen.

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

Danke für Ihre Eingabe, ja SQL-Agent läuft und der Bereinigungsjob wird korrekt ausgeführt. Es gibt vielleicht 400 Zeilen in der Tabelle sessionstate und die DB ist ungefähr 15 MB. –

0

den Begriff zu erforschen, die etwas im Anwendungs-Setup innerhalb IIS sein ist, könnte, könnte man die Config Ihrer Website mit Web-deploy (MSDeploy) auskippen. Führen Sie dann einen Vergleich der Ausgabe zwischen der Box aus, die das Problem aufweist, und einer anderen, die dies nicht tut.

So etwas wie dieser Wille Ausgang

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

oder als XML zu trösten

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

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

7

Wir haben ein ähnliches Problem mit der folgenden Konfiguration konfrontiert:

  • IIS 7.5
  • .NET Framework 4.0
  • Windows 2008 (sowohl auf den IIS und den DB-Server)
  • Sitzungen, die von der ASPState Datenbank verwaltet

Das Problem war, dass manchmal einige der Sitzungen in die ASPState Datenbank gesperrt blieben, was zu Hunderten Aufrufe pro Sekunde an dbo.TempGetStateItemExclusive3 für jede der gesperrten Sitzungen.

Die CPU auf dem IIS-Server würde schließlich mit der Anzahl der gesperrten Sitzungen steigen. Eine vorübergehende Lösung bestand darin, den Anwendungspool zu recyceln.

Gehen Sie weiter und aktivieren Sie die Tracing auf den IIS-Server (n) und dann analysieren die Spuren, die wir bei jedem Problem (dh Netzwerkverbindungsproblem, das einen 500 Interner Serverfehler verursacht) im EXECUTE_REQUEST_HANDLER Modul, die nächste Das Modul RELEASE_REQUEST_STATE (und sollte die Sitzung entsperren) wurde nicht ausgeführt. So blieb die Sitzung gesperrt.

Es stellte sich auf einen Fehler von IIS zu sein und wir reparierte sie durch den Wert des Upload auf 0 in der web.config Wechsel:

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

Die Upload Eigenschaft legt die Anzahl der Bytes ein Web-Server wird in einen Puffer gelesen und an eine ISAPI-Erweiterung übergeben. Dies tritt einmal pro Clientanforderung auf.

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

+0

Wir sehen das gleiche Problem in der Produktion und denken darüber nach, die von Ihnen gefundene Lösung zu verwenden. Ich bin jedoch mit dieser Eigenschaft nicht vertraut, und ich habe Probleme, etwas über die Auswirkungen zu finden, die es auf irgendeinem anderen Teil der Seite ändert. Wären Sie in der Lage, detaillierter zu erläutern, welche anderen Effekte dies auf 0 setzen würden? – Geneb

+0

Welche 'SQL-Anweisung' für View ** -Sitzungen blieb in der _ASPState-Datenbank_ gesperrt **? WIE ** Überwachung ** _hunderte Anrufe pro Sekunde_: SQL Profiler oder eine andere Software? – Kiquenet

+0

Welche Module führt IIS und *** *** *** aus? erstes EXECUTE_REQUEST_HANDLER-Modul, zweites RELEASE_REQUEST_STATE, ... – Kiquenet

Verwandte Themen