Korzystając z oprogramowania DBPLUS PERFORMANCE MONITOR przyjrzyjmy się czasowi ładowania 20 kwietnia. Od razu zauważamy, że podczas gdy czas ładowania zapytania zwykle waha się między 12 a 15 sekund na snapshot, w niektórych okresach występuje znaczny skok do ponad 2000 sekund.
Taka anomalia może mieć poważny wpływ na ogólną wydajność bazy danych. Wydłużony czas przetwarzania zapytań sugerował, że system wskazywał na głębszy, prawdopodobnie systemowy problem. To wstępne odkrycie wymagało bardziej szczegółowego zbadania przyczyn tych opóźnień, prowadząc proces rozwiązywania problemów w kierunku określonych wąskich gardeł wydajności.
Po zidentyfikowaniu anomalii przy korzystaniu z oprogramowania DBPLUS PERFORMANCE MONITOR, kolejnym logicznym krokiem było poszukiwanie możliwej korelacji blokad z wykonaniami, odczytami z dysku, zapisami bufora itp. Jednak dopiero po przeanalizowaniu statystyk blokad, wzór stał się jasny - doszło do znacznego nakładania się momentów, w których czas trwania zapytań wzrasta i kiedy nasilają się problemy z blokadami.
Aby rozpocząć dokładną analizę, przechodzimy do zakładki lock history, która rejestruje wszystkie zdarzenia blokad w danym dniu. Sekcja ta ma za zadanie przedstawić nam chronologię zdarzeń. Klikamy na poszczególne punkty na osi czasu, aby uzyskać dostęp do kompleksowych danych na temat każdego zdarzenia blokady.
Jak przeprowadzimy analizę blokady:
Sesja, o której mowa, była konsekwentnie oznaczana jako „uśpiona” w wielu snapshotach. Status ten wskazuje, że podczas gdy sesja była połączona i transakcja została zainicjowana, żadne aktywne zapytania nie były wykonywane przez dłuższy czas. Sesja rozpoczęła transakcję o godzinie 11:55, ale nie wykazała żadnej aktywności przez 257 sekund w początkowej obserwacji. Kolejne snapshoty wskazywały, że ta bezczynność trwała nadal, a sesja nadal nie wykonywała żadnych zapytań. Ta przedłużająca się bezczynność wstrzymywała zasoby, blokując jednocześnie inne transakcje, co prowadziło do wydłużenia czasu oczekiwania dla innych sesji.
Analiza wykazała, że aplikacja użytkownika nie zarządzała odpowiednio swoimi transakcjami. Stan uśpienia transakcji wskazywał, że została ona zainicjowana, ale nie była aktywnie przetwarzana z powodu braku wykonywanych zapytań lub braku poleceń finalizacji transakcji, takich jak zatwierdzenie lub wycofanie. To niewłaściwe zarządzanie transakcjami sugeruje, że aplikacja może nie mieć solidnej obsługi błędów lub zasad limitu czasu transakcji, które mogłyby zapobiegać przedłużającej się bezczynności.
Niewłaściwa obsługa transakcji może prowadzić do kilku problemów w środowisku bazy danych, głównie poprzez tworzenie niezwolnionych blokad. W omawianym przypadku brak prawidłowego zarządzania stanami transakcji przez aplikację skutkował niepotrzebnymi blokadami przez aplikację na zasobach, które nie były aktywnie wykorzystywane. Powodowało to blokowanie innych transakcji i pogarszało ogólną wydajność systemu. Sytuacja ta pogarszała się w okresach największego obciążenia, gdy efekt kumulacji wielu nieefektywnych transakcji spowalniał działanie systemu.
Jest wiele do zrobienia, aby zapobiec takim sytuacjom w przyszłości: