Prowadzę dochodzenie w sprawie problemu z naszą witryną, która korzysta z serwera SQL do zarządzania sesjami. Strona internetowa to webformy asp.net oparte na CMS z sitecore. Mamy ten sam kod w różnych środowiskach, np. Kontrola jakości, inscenizacja i produkcja.dbo.TempGetStateItemExclusive3 wielokrotnie wywoływana
W produkcji obserwujemy okresowo gwałtownie rosnące zużycie procesora, które nie wiąże się w żaden sposób z ruchem na serwer. Wraz z tym skokiem procesora widzimy odpowiedni skok w sieciowych we/wy.
Nasze oprogramowanie monitorujące nie rozróżnia ruchu do Internetu i ruchu na serwer bazy danych; jednak to, co widzimy na serwerze DB, to dosłownie setki połączeń na sekundę z dbo.TempGetStateItemExclusive3
w bazie danych sesji asp, wszystkie dla tego samego identyfikatora sesji i bez odpowiadającej ilości żądań stron przychodzących na serwery WWW.
Przy tym samym kodzie i konfiguracji po prostu nie widzimy takiego zachowania dla innych środowisk. Nie widzimy tego również dla innych identyfikatorów sesji, tylko tego konkretnego.
Usunięcie wiersza z bazy danych powoduje po prostu jego odtworzenie z tym samym identyfikatorem sesji.
UPDATE
znalazłem ten błąd w dzienniku zdarzeń:
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)
Każdy jakieś pomysły jak duplikat identyfikator sesji może być ewentualnie próbowali być tworzone?
znasz mogli zobaczyć wzór jak długo tych kolców zwykle ostatnia, jak często one występują, i/lub o jakiej porze dnia ich wystąpienia? – jadarnel27
To tylko rodzaj ujęcia w ciemności, ale czy pule aplikacji są skonfigurowane (znacząco) inaczej w różnych środowiskach? Zastanawiam się, czy masa DB wywołuje linie z jakimś regularnym/regularnym cyklem puli aplikacji produkcyjnych (resetuje pulę aplikacji, a środowisko wykonawcze ASP.NET przywraca wszystkie nieuaktualnione sesje z SQL Server naraz) . – jadarnel27
Kolce trwają, dopóki pula aplikacji nie zostanie ponownie wykorzystana. To zazwyczaj usuwa problem na chwilę. Nie ma prawdziwego wzorca, który wydaje się przypadkiem. Poprzednio każdego dnia wykonywaliśmy recykling puli aplikacji w zaplanowanym czasie. Musieliśmy to zmieniać co 2 godziny, aby rozwiązać ten problem. Jeśli pomaga, mamy 2 serwery frontonu, które ładują się w sposób zrównoważony za pomocą lepkich sesji. Nasi technicy ISP mówią nam, że nie ma odpowiedniego ruchu przychodzącego przez LB, więc to tak, jakby wywoływał te wątki jakaś uciekająca nitka. –