Synteza jako jedna z metod poprawy wydajności PostgreSQL

Synteza jako jedna z metod poprawy wydajności PostgreSQL

Filozoficzne wprowadzenie

Jak wiadomo, istnieją tylko dwa sposoby rozwiązania problemów:

  1. Metoda analizy lub metoda dedukcji, czyli od ogółu do szczegółu.
  2. Metoda syntezy lub metoda indukcji, czyli od szczegółu do ogółu.

Aby rozwiązać problem "poprawy wydajności bazy danych", może to wyglądać następująco.

Analiza — rozkładamy problem na części składowe i staramy się w ten sposób poprawić wydajność bazy danych w całości.

W praktyce analiza wygląda mniej więcej tak:

  • Pojawia się problem (incydent wydajności)
  • Zbieramy informacje statystyczne o stanie bazy danych
  • Szukać wąskich gardeł
  • Rozwiązujemy problemy w wąskich gardłach

Wąskie gardła bazy danych — infrastruktura (CPU, pamięć, dyski, sieć, system operacyjny), ustawienia (postgresql.conf), zapytania:

Infrastruktura: możliwości wpływu i zmian dla inżyniera — prawie zerowe.

Ustawienia bazy danych: możliwości zmian są nieco większe niż w poprzednim przypadku, ale zazwyczaj nadal dość trudne, szczególnie w chmurach.

Zapytania do bazy danych: jedyny obszar do manewru.

SYNTEZA — poprawiamy wydajność poszczególnych części, licząc na to, że w rezultacie poprawi się wydajność bazy danych.

Liryczne wprowadzenie lub po co to wszystko

Jak przebiega proces rozwiązywania incydentów wydajności, jeśli wydajność bazy danych nie jest monitorowana:

Klient - "u nas jest źle, wolno, proszę to poprawić"
Inżynier - "źle to jak?"
Klient – "tak jak teraz (godzinę temu, wczoraj, na ostatniej sprawie było), wolno"
Inżynier – "a kiedy było dobrze?"
Klient – "tydzień (dwa tygodnie) temu było nieźle." (To się udało)
Klient – "a nie pamiętam, kiedy było dobrze, ale teraz jest źle" (Typowa odpowiedź)

W rezultacie otrzymujemy klasyczny obraz:

Synteza jako jedna z metod poprawy wydajności PostgreSQL

Kto jest winny i co robić?

Na pierwszą część pytania najłatwiej odpowiedzieć — zawsze winny jest inżynier DBA.

Na drugą część odpowiedzieć też nie jest zbyt trudno — trzeba wdrożyć system monitorowania wydajności bazy danych.

Pojawia się pierwsze pytanie — co monitorować?

Droga 1. Będziemy monitorować WSZYSTKO

Synteza jako jedna z metod poprawy wydajności PostgreSQL

Obciążenie CPU, ilość operacji odczytu/zapisu na dysku, rozmiar przydzielonej pamięci oraz jeszcze megatonę różnych liczników, które może dostarczyć każda bardziej- mniej sprawna system monitorowania.

W efekcie otrzymujemy mnóstwo wykresów, tabel przestawnych i nieprzerwane powiadomienia na e-mail oraz 100% obłożenie inżyniera rozwiązywaniem tych samych biletów, które zazwyczaj mają standardową formułę — „Tymczasowy problem. Nie wymaga działania”. Wszyscy jednak są zajęci i zawsze jest co pokazać klientowi — praca wre.

Droga 2. Monitorować tylko to, co potrzebne, a to, co niepotrzebne, nie należy monitorować.

Można monitorować, trochę inaczej — tylko byty i zdarzenia:

  • Na które inżynier DBA może wpływać.
  • Dla których istnieje algorytm działań w przypadku wystąpienia zdarzenia lub zmiany bytu.

W oparciu o to założenie i przypominając „Filozoficzne wprowadzenie”, aby uniknąć regularnego powtarzania „Liryczne wprowadzenie lub po co to wszystko”, uzasadnione będzie monitorowanie wydajności poszczególnych zapytań w celu optymalizacji i analizy, co finalnie powinno prowadzić do poprawy wydajności całej bazy danych.

Ale aby poprawić obciążające zapytanie wpływające na ogólną wydajność bazy danych, najpierw trzeba je zlokalizować.

Zatem pojawiają się dwa powiązane pytania:

  • które zapytanie uznaje się za obciążające?
  • jak wyszukiwać obciążające zapytania.

Oczywiste jest, że obciążające zapytanie to zapytanie, które wykorzystuje wiele zasobów OS do uzyskania wyniku.

Przechodzimy do drugiego pytania — jak wyszukiwać, a następnie monitorować obciążające zapytania?

Jakie możliwości monitorowania zapytań są w PostgreSQL?

W porównaniu do Oracle, możliwości są nieco ograniczone, ale mimo wszystko można coś zrobić.

Synteza jako jedna z metod poprawy wydajności PostgreSQL

PG_STAT_STATEMENTS

Do wyszukiwania i monitorowania obciążających zapytań w PostgreSQL przeznaczone jest standardowe rozszerzenie pg_stat_statements.

Po zainstalowaniu rozszerzenia, w docelowej bazie danych pojawia się widok o tej samej nazwie, który należy wykorzystywać do celów monitorowania.

Docelowe kolumny pg_stat_statements do budowy systemu monitorowania:

  • queryid Wewnętrzny kod haszujący wyliczany na podstawie drzewa rozbicia operatora.
  • max_time Maksymalny czas spędzony na operatorze, w milisekundach.

Zbierając i wykorzystując statystyki na podstawie tych dwóch kolumn, można zbudować system monitorowania.

Jak wykorzystuje się pg_stat_statements do monitorowania wydajności PostgreSQL?

Synteza jako jedna z metod poprawy wydajności PostgreSQL

Do monitorowania wydajności zapytań używa się:
Po stronie docelowej bazy danych — widok pg_stat_statements.
Po stronie serwera i bazy danych monitorującej — zestaw skryptów bash i tabel serwisowych.

1 krok — zbieranie danych statystycznych

Na hoście monitorowania regularnie uruchamiany jest skrypt, który kopiuje zawartość widoku pg_stat_statements z docelowej bazy danych do tabeli pg_stat_history w bazie danych monitoringowej.

W ten sposób powstaje historia wykonania poszczególnych zapytań, którą można wykorzystać do tworzenia raportów wydajności i konfiguracji metryk.

2 krok — konfiguracja metryk wydajności

Na podstawie zebranych danych wybieramy zapytania, których wykonanie jest najistotniejsze dla klienta (aplikacji). Po uzgodnieniu z zamawiającym ustalamy wartości metryk wydajności, korzystając z pól queryid i max_time.

Wynik — rozpoczęcie monitorowania wydajności

  1. Skrypt monitorujący przy uruchomieniu sprawdza skonfigurowane metryki wydajności, porównując wartość max_time metryki z wartością z widoku pg_stat_statements w docelowej bazie danych.
  2. Jeśli wartość w docelowej bazie danych przekracza wartość metryki – generowane jest ostrzeżenie (incydent w systemie zgłoszeń)

Dodatkowa możliwość 1

Historia planów wykonania zapytań

Aby skutecznie rozwiązywać incydenty wydajności, dobrze jest mieć historię zmian planów wykonania zapytań.

Do przechowywania historii wykorzystywana jest tabela serwisowa log_query. Tabela ta jest wypełniana podczas analizy załadowanego pliku dziennika PostgreSQL. Ponieważ do pliku dziennika, w przeciwieństwie do widoku pg_stat_statements, trafia pełny tekst z wartościami parametrów wykonania, a nie znormalizowany tekst, istnieje możliwość rejestrowania nie tylko czasu i długości zapytań, ale także przechowywania planów wykonania w danym momencie.

Dodatkowa możliwość 2

Proces ciągłego poprawiania wydajności

Monitorowanie pojedynczych zapytań generalnie nie jest przeznaczone do rozwiązywania problemu ciągłego poprawiania wydajności bazy danych jako całości, ponieważ kontroluje i rozwiązuje problemy wydajności tylko dla pojedynczych zapytań. Jednak metodę tę można rozszerzyć i skonfigurować monitorowanie dla wszystkich baz danych.

W tym celu konieczne jest wprowadzenie dodatkowych metryk wydajności:

  • W ciągu ostatnich dni
  • Za okres bazowy

Skrypt wybiera zapytania z widoku pg_stat_statements w docelowej bazie danych i porównuje wartość max_time z średnią wartością max_time, w pierwszym przypadku za ostatnie dni lub za wybrany okres czasu (baseline), w drugim przypadku.

W ten sposób w przypadku degradacji wydajności dla dowolnego zapytania, ostrzeżenie zostanie automatycznie wygenerowane, bez ręcznej analizy raportów.

A co ma wspólnego syntez?

W opisanym podejściu, jak zakłada metoda syntezy — poprawiając poszczególne części systemu, poprawiamy system jako całość.

  • Zapytanie wykonywane przez bazę danych – teza
  • Zmienione zapytanie – antyteza
  • Zmiana stanu systemu — synteza

Synteza jako jedna z metod poprawy wydajności PostgreSQL

Rozwój systemu

  • Rozszerzenie zbieranej statystyki o dodanie historii dla systemowego widoku pg_stat_activity
  • Rozszerzenie zbieranej statystyki o dodanie historii dla statystyk poszczególnych tabel biorących udział w zapytaniach
  • Integracja z systemem monitorowania w chmurze AWS
  • I jeszcze, coś można wymyślić…

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster