Wymagania: Istnieje wiele powodów, dla których baza danych SQL Server powoduje martwe zablokowania; w produkcji każdy może napotkać problemy z martwymi blokadami, a konkretna przyczyna może nie być zidentyfikowana wyłącznie na podstawie nieprawidłowych informacji o zablokowaniu aplikacji, dlatego konieczne jest wykorzystanie zdarzeń rozszerzenia w SQL Server do śledzenia problemów z blokadami i zapisywania szczegółów, kiedy się one pojawiają.
Rozszerzony przegląd wydarzenia
Extended Events to lekka funkcja monitorowania wydajności, która pozwala użytkownikom zbierać dane potrzebne do monitorowania i rozwiązywania problemów. Ta funkcja pozwala na przeglądanie szczegółów dotyczących wewnętrznych operacji silnika danych w celu monitorowania wydajności i rozwiązywania problemów.
Dzięki architekturze Extended Events (XEvents) użytkownicy mogą korzystać z tyle lub tak mało, ile potrzebują danych, aby monitorować, identyfikować lub rozwiązywać problemy z wydajnością SQL Server, Azure SQL Database oraz Azure SQL Managed Instance. Rozszerzone wydarzenia są bardzo konfigurowalne, lekkie i dobrze skalowalne.
Odniesienie:
Logowanie do linku jest widoczne.
Logowanie do linku jest widoczne.
Przyczyny impasów
Impas powstaje przez konkurencyjne blokady współbieżności w bazie danych, zazwyczaj w transakcjach wieloetapowych. Każda sesja użytkownika może mieć jedno lub więcej zadań działających w jej imieniu, gdzie każde zadanie może pobierać lub czekać na pobranie różnych zasobów. Następujące typy zasobów mogą powodować blokowanie, a ostatecznie prowadzić do impasu.
- Blokady: Blokady czekające na pobranie zasobów takich jak obiekty, strony, wiersze, metadane i aplikacje mogą powodować martwe blokady. Na przykład transakcja T1 ma wspólny zamek (S lock) w wierszu r1 i czeka na wyłączny zamek (X lock) dla wiersza r2. Transakcja T2 ma wspólny zamek (S lock) w wierszu r2 i czeka na wyłączny zamek (X lock) dla wiersza r1. Skutkuje to pętlą blokady, w której zarówno T1, jak i T2 czekają na uwolnienie zablokowanego zasobu.
- Wątki robocze: Kolejka zadań dla dostępnych wątków roboczych może powodować martwe zakleszczenia. Jeśli zadanie w kolejce ma zasób blokujący wszystkie wątki robocze, spowoduje to martwy punkt. Na przykład, po rozpoczęciu transakcji przez sesję S1 i uzyskaniu współdostępnej blokady (S-lock) dla linii r1, przechodzi ona w tryb uśpienia. Aktywna sesja działająca na wszystkich dostępnych wątkach roboczych próbuje uzyskać wyłączną blokadę (X-lock) dla linii r1. Ponieważ sesja S1 nie może uzyskać wątku roboczego, nie może zatwierdzać transakcji ani zwolnić blokady na linii r1. To doprowadzi do impasu.
- Pamięć: Impas może wystąpić, gdy żądanie równoczesne czeka na odzyskanie pamięci, a dostępna obecnie pamięć nie wystarcza do jego potrzeb. Na przykład dwa współbieżne zapytania (Q1 i Q2) są wykonywane jako funkcje zdefiniowane przez użytkownika, zdobywając odpowiednio 10 MB i 20 MB pamięci. Jeśli każde zapytanie wymaga 30 MB, a łączna dostępna pamięć wynosi 20 MB, Q1 i Q2 muszą czekać, aż nawzajem zwolnią pamięć, co spowoduje impas.
- Zapytania równoległe i zasoby związane z realizacją: Koordynatory przetwarzania, generatory lub wątki konsumenckie, zwykle powiązane z przełączanymi portami, mogą się wzajemnie blokować, gdy zawierają co najmniej jeden proces, który nie jest częścią zapytania równoległego, co prowadzi do martwych punktów. Dodatkowo, gdy zapytanie równoległe rozpoczyna wykonywanie, SQL Server określa stopień równoległości lub liczbę wątków roboczych na podstawie aktualnego obciążenia. Impas może wystąpić, jeśli nastąpi nieoczekiwana zmiana w obciążeniu systemowym, na przykład gdy na serwerze zaczyna się uruchamiać nowe zapytanie lub gdy system wyczerpie wątki robocze.
- Zasoby Multiple Activity Outcome Set (MARS): Te zasoby służą do kontroli krzyżowego wykonywania wielu żądań aktywności w ramach MARS.
Odniesienie:
Logowanie do linku jest widoczne.
Rozległe logowanie zdarzeń w martwym punkcie
Stwórz zdarzenie rozszerzenia, aby zapisać informacje o martwym punkcie za pomocą następującego polecenia:
Rozpocznij sesję zdarzenia martwego
Zatrzymaj sesję wydarzenia
Usuń sesję zdarzenia
Zapytaj dane sesji zdarzeń
Impas testowy
Stwórz nową tabelę Tab1 do testowania, utworz dwa nowe okna wykonania i wykonaj następujące polecenia odpowiednio:
Impas następuje następująco:
Transakcja (ID procesu 68) z innym procesem jest zablokowana na zablokowanym zasobu i została wybrana jako ofiara zablokowania. Proszę ponownie uruchomić transakcję. Transakcja (ID procesu 68) była zablokowana na zasobach blokady z innym procesem i została wybrana jako ofiara blokady. Ponownie przeprowadź transakcję.
Zobacz dane sesji wydarzenia, jak pokazano na poniższym rysunku:
Szczegółowe dane XML przedstawiają się następująco:
(Koniec)
|