Mam wielu użytkowników na mojej stronie internetowej (20000–60000 dziennie), która jest witryną pobierania plików mobilnych. Mam zdalny dostęp do mojego serwera (Windows Server 2008-R2). Wcześniej
otrzymywałem błędy „Serwer jest niedostępny” , ale teraz widzę błąd przekroczenia limitu czasu połączenia.
Nie znam się na tym - dlaczego tak się dzieje i jak mogę to naprawić?
Pełny błąd znajduje się poniżej:
Błąd serwera w aplikacji „/”. Limit czasu upłynął. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada. Instrukcja została zakończona. Opis: Wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania internetowego. Przejrzyj dane śledzenia stosu, aby uzyskać więcej informacji o błędzie i jego źródle w kodzie.
Szczegóły wyjątku: System.Data.SqlClient.SqlException: Upłynął limit czasu. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada. Instrukcja została zakończona.
Błąd źródła:
Podczas obsługi bieżącego żądania sieciowego wygenerowano nieobsługiwany wyjątek. Informacje dotyczące pochodzenia i lokalizacji wyjątku można zidentyfikować za pomocą śledzenia stosu wyjątków poniżej.
Ślad stosu:
[SqlException (0x80131904): Upłynął limit czasu. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada. Instrukcja została zakończona.]
System.Data.SqlClient.SqlConnection.OnError (wyjątek SqlException, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParserhe Run Run , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataBeRaverior, Run RunSer
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteBeReHeReRe 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (wynik DbAsyncResult, ciąg MethodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
Parametry NovinMediaDataDataProcedura , Int32 i wiersze zmienione) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (Nadawca obiektu, EventArgs e) +163[HttpException (0x80004005): Upłynął limit czasu. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada. Oświadczenie zostało zakończone.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext kontekst, HttpApplication app) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext kontekst, MethodInfo [] koparki) +191
System.Web.HttpApplication. InitSpecial (stan HttpApplicationState, procedury obsługi MethodInfo [], kontekst aplikacji IntPtr, kontekst HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (kontekst aplikacji IntPtr, kontekst kontekstu HttpContext) +407
System.Web.Hosting.PipextRuntime.Info[HttpException (0x80004005): Upłynął limit czasu. Limit czasu upłynął przed zakończeniem operacji lub serwer nie odpowiada. Instrukcja została zakończona.]
System.Web.HttpRuntime.FirstRequestInit (kontekst HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (kontekst HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate II Nota prywatna7 Nota prywatna
EDIT PO odpowiada:
my Application_Start
w Global.asax
to jak poniżej:
protected void Application_Start(object sender, EventArgs e)
{
Application["OnlineUsers"] = 0;
OnlineUsers.Update_SessionEnd_And_Online(
DateTime.Now,
false);
AddTask("DoStuff", 10);
}
Wywoływana procedura składowana to:
ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
@Session_End datetime,
@Online bit
As
Begin
Update OnlineUsers
SET
[Session_End] = @Session_End,
[Online] = @Online
End
Mam dwie metody pozyskiwania użytkowników online:
- za pomocą
Application["OnlineUsers"] = 0;
- drugi używa bazy danych
Tak więc dla metody nr 2 resetuję wszystkich użytkowników online o Application_Start
. W tej tabeli znajduje się ponad 482 751 rekordów.
źródło
Odpowiedzi:
Wygląda na to, że masz zapytanie, które trwa dłużej niż powinno. Ze śladu stosu i kodu powinieneś być w stanie dokładnie określić, jakie to zapytanie.
Ten typ limitu czasu może mieć trzy przyczyny;
Impas może być trudny do naprawienia, ale łatwo jest ustalić, czy tak jest. Połącz się z bazą danych za pomocą Sql Server Management Studio. W lewym okienku kliknij prawym przyciskiem myszy węzeł serwera i wybierz Monitor aktywności . Spójrz na uruchomione procesy. Zwykle większość będzie bezczynna lub działa. Gdy wystąpi problem, możesz zidentyfikować każdy zablokowany proces według stanu procesu. Jeśli klikniesz prawym przyciskiem myszy na proces i wybierzesz szczegóły , wyświetli się ostatnie zapytanie wykonane przez proces.
Drugi problem spowoduje, że baza danych będzie korzystała z nieoptymalnego planu zapytań. Można to rozwiązać, usuwając statystyki:
Jeśli to nie zadziała, możesz spróbować
Nie powinieneś tego robić, gdy twój serwer jest obciążony, ponieważ tymczasowo poniesie duży hit wydajności, ponieważ wszystkie przechowywane procy i zapytania są rekompilowane przy pierwszym uruchomieniu. Ponieważ jednak stwierdzasz, że problem występuje czasami , a ślad stosu wskazuje, że aplikacja się uruchamia, myślę, że uruchamiasz zapytanie, które jest uruchamiane tylko od czasu do czasu. Lepiej może być wymuszając na SQL Server nieużywanie poprzedniego planu zapytań. Zobacz tę odpowiedź, aby dowiedzieć się, jak to zrobić.
Dotknąłem już trzeciego problemu, ale możesz łatwo ustalić, czy zapytanie wymaga dostrojenia, wykonując je ręcznie, na przykład za pomocą Sql Server Management Studio. Jeśli zapytanie trwa zbyt długo, nawet po zresetowaniu statystyk prawdopodobnie będziesz musiał je dostroić. Aby uzyskać pomoc, powinieneś zamieścić dokładne zapytanie w nowym pytaniu.
źródło
exec sp_updatestats
rozwiązania mojego problemu. Wielkie dzięki!W kodzie, w którym uruchamiasz procedurę przechowywaną, powinieneś mieć coś takiego:
Dodaj taki wiersz kodu:
Będzie to czekać tyle czasu, ile potrzeba na zakończenie operacji.
źródło
Można ustawić
CommandTimeout
właściwość polecenia SQL, aby zezwolić na długo działającą transakcję SQL.Konieczne może być także przyjrzenie się zapytaniu SQL, które powoduje przekroczenie limitu czasu.
źródło
Chociaż wszystkie wcześniejsze odpowiedzi dotyczą tego problemu, nie obejmowały wszystkich przypadków.
Firma Microsoft potwierdziła problem i naprawiła go w 2011 roku dla obsługiwanych systemów operacyjnych, więc jeśli otrzymasz ślad stosu, taki jak:
może być konieczne zaktualizowanie zestawów .NET.
Szczegółowe informacje zawiera KB 2605597
https://support.microsoft.com/kb/2605597
źródło
Może przyda się komuś. Zetknąłem się z tym samym problemem i w moim przypadku przyczyną było to, że SqlConnection został otwarty i nie został umieszczony w metodzie, którą wywołałem w pętli z około 2500 iteracjami. Pula połączeń została wyczerpana. Właściwe usunięcie rozwiązało problem.
źródło
using
bloków) mam problem z przekroczeniem limitu czasu. To wydawało się rozwiązać.Musisz ustawić atrybut CommandTimeout. Możesz ustawić atrybut CommandTimeout w klasie potomnej DbContext.
źródło
Napotkałem ten sam problem, który pracował nad nim około 3 dni. Zauważyłem, ponieważ nasza liczba rekordów to niewiele, nasz starszy programista przechowuje 2 obrazy i odcisk palca w bazie danych. Kiedy próbuję pobrać te wartości szesnastkowe, co zajmuje dużo czasu, obliczam średni czas wykonania mojej procedury na około 38 sekund. Domyślny limit czasu poleceń wynosi 30 sekund, więc jest to mniej niż średni czas wymagany do uruchomienia mojej procedury składowanej. Ustawiłem limit czasu poleceń jak poniżej
i działa dobrze, ale czasami, jeśli twoje zapytanie trwa dłużej niż 50 sekund, wyświetli ten sam błąd.
źródło
Ostatnio napotkałem ten błąd i po krótkim dochodzeniu odkryłem, że przyczyną jest brak miejsca na dysku przechowującym bazę danych (mniej niż 1 GB).
Gdy tylko przeniosłem pliki bazy danych (.mdf i .ldf) na inny dysk na tym samym serwerze (z dużo większą ilością miejsca), ta sama strona (uruchamiająca zapytanie) została wczytana w ciągu trzech sekund.
Inną kwestią do zbadania podczas próby rozwiązania tego błędu jest rozmiar plików dziennika bazy danych. Twoje pliki dziennika mogą wymagać zmniejszenia.
źródło
Mam problem z dużymi obliczeniami w sp_foo, które zajmują dużo czasu, więc naprawiłem
ten mały kod
źródło
Domyślny limit czasu to 15 sekund. Aby to zmienić, 0 jest nieograniczone, każda inna liczba to liczba sekund.
W kodzie
W twoim Web.Config: „Limit czasu poleceń = 0;” nie przekraczaj limitu czasu lub poniżej 1 godziny (3600 sekund)
źródło
@SilverLight .. Jest to oczywiście problem z obiektem bazy danych. Może to być źle napisane zapytanie lub brakujące indeksy. Ale na razie nie sugeruję, aby zwiększyć limit czasu bez zbadania problemu z obiektami bazy danych
Umieść punkt przerwania w tym wierszu kodu, aby znaleźć nazwę procedury, a następnie zoptymalizuj procedurę, sprawdzając jej plan wykonania.
Nie mogę ci pomóc, dopóki nie opublikujesz szczegółowych informacji na temat procedury przechowywanej.
źródło
próbować
następnie odbuduj swój indeks
źródło
źródło
TLDR :
Często napotykałem ten błąd z różnych powodów i miałem różne rozwiązania, w tym:
źródło
Upewnij się również, że po prostu nie masz oczekującej transakcji. :)
Robiłem kilka testów i rozpocząłem bezpieczną transakcję, ale nigdy jej nie zamknąłem. Chciałbym, żeby błąd był bardziej wyraźny, ale no cóż!
źródło
Mieliśmy ciężkie czasy
Timeout expired/max pool reached
Sqlexception
. Aby obejść ten problem i aby zapobiec ponownemu uruchomieniu serwera lub usługi, modyfikujemyMAX SERVER MEMORY
zmienną w SQL Server (za pomocą SQL Managment Studio lub T-SQL):To tymczasowo rozwiązuje problem, dopóki nie powtórzy się. W naszym przypadku podejrzewamy, że ma to związek z przeciekami połączeń na poziomie aplikacji.
źródło
Niedawno zaktualizowaliśmy do wersji NuGet
SqlClient
(Microsoft.Data.SqlClient
), która zawiera błąd . Ten błąd został wprowadzony podczas cyklu 1.x i został już naprawiony. Poprawka będzie dostępna w wersji 2.0.0, która nie jest dostępna w momencie pisania tego tekstu. Podgląd jest dostępny.Możesz sprawdzić szczegóły tutaj: https://github.com/dotnet/SqlClient/issues/262
źródło