PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najważniejsze rzeczy do monitorowania w PostgreSQL — analiza obciążenia

Kluczowe rzeczy do monitorowania w PostgreSQL — analiza obciążenia

W systemach komputerowych monitorowanie to proces zbierania metryk, analizowania, obliczania statystyk oraz generowania podsumowań i wykresów dotyczących wydajności lub pojemności systemu, a także generowania alertów w przypadku nieoczekiwanych problemów lub awarii, które wymagają natychmiastowej uwagi lub działania. Dlatego monitorowanie ma dwa zastosowania:jedno do analizy i prezentacji danych historycznych, które pomagają nam identyfikować średnio- i długoterminowe trendy w naszym systemie, a tym samym pomagają nam planować aktualizacje, a drugie do natychmiastowego działania w przypadku problemów.

Monitorowanie pomaga nam identyfikować problemy i reagować na te problemy w szerokim zakresie dziedzin, takich jak:

  • Infrastruktura/sprzęt (fizyczny lub wirtualny)
  • Sieć
  • Przechowywanie
  • Oprogramowanie systemowe
  • Oprogramowanie aplikacji
  • Bezpieczeństwo

Monitorowanie to główna część pracy administratora baz danych. PostgreSQL jest tradycyjnie znany jako „nie wymagający konserwacji” dzięki swojemu wyrafinowanemu projektowi, a to oznacza, że ​​system może funkcjonować z niską frekwencją w porównaniu z innymi alternatywami. Jednak w przypadku poważnych instalacji, w których kluczowa jest wysoka dostępność i wydajność, system bazy danych musi być regularnie monitorowany.

Rola PostgreSQL DBA może wspinać się na wyższe poziomy w hierarchii firmy, nie tylko czysto techniczne:poza podstawowym monitorowaniem i analizą wydajności, musi być w stanie dostrzec zmiany we wzorcach użytkowania, zidentyfikować możliwe przyczyny, zweryfikować założenia i wreszcie przetłumaczyć ustalenia pod względem biznesowym. Na przykład administrator baz danych musi być w stanie zidentyfikować nagłą zmianę w określonej działalności, która może być powiązana z potencjalnym zagrożeniem bezpieczeństwa. Tak więc rola PostgreSQL DBA jest kluczową rolą w firmie i musi ściśle współpracować z innymi szefami działów w celu identyfikowania i rozwiązywania pojawiających się problemów. Monitorowanie to duża część tej odpowiedzialności.

PostgreSQL udostępnia wiele gotowych narzędzi, które pomagają nam zbierać i analizować dane. Ponadto, ze względu na swoją rozszerzalność, zapewnia środki do opracowywania nowych modułów w systemie podstawowym.

PostgreSQL jest wysoce zależny od systemu (sprzętu i oprogramowania), na którym działa. Nie możemy oczekiwać, że serwer PostgreSQL będzie działał dobrze, jeśli wystąpią problemy w którymkolwiek z istotnych komponentów w pozostałej części systemu. Tak więc rola PostgreSQL DBA pokrywa się z rolą administratora. Poniżej, gdy sprawdzimy, co należy oglądać w monitorowaniu PostgreSQL, napotkamy zarówno zmienne i metryki zależne od systemu, jak i konkretne dane PostgreSQL.

Monitoring nie jest bezpłatny. Firma/organizacja musi w nią włożyć dobrą inwestycję z zaangażowaniem w zarządzanie i utrzymanie całego procesu monitorowania. Dodaje również niewielkie obciążenie serwera PostgreSQL. Nie ma się czym martwić, jeśli wszystko jest poprawnie skonfigurowane, ale musimy pamiętać, że może to być inny sposób na niewłaściwe użycie systemu.

Podstawy monitorowania systemu

Ważnymi zmiennymi w monitorowaniu systemu są:

  • Wykorzystanie procesora
  • Korzystanie z sieci
  • Miejsce na dysku / Wykorzystanie dysku
  • Wykorzystanie pamięci RAM
  • IOPS dysku
  • Zamień użycie miejsca
  • Błędy sieciowe

Oto przykład ClusterControl pokazujący wykresy dla niektórych krytycznych zmiennych PostgreSQL pochodzących z pg_stat_database i pg_stat_bgwriter (które omówimy w kolejnych akapitach) podczas dwukrotnego uruchamiania pgbench -c 64 -t 1000 pgbench:

Zauważyliśmy, że w pierwszym uruchomieniu mamy szczyt odczytów bloków, ale podczas drugiego testu zbliżamy się do zera, ponieważ wszystkie bloki znajdują się w shared_buffers.

Inne interesujące zmienne to między innymi aktywność stronicowania, przerwania, przełączanie kontekstu. Istnieje mnóstwo narzędzi do użycia w systemach Linux/BSD i systemach uniksowych lub podobnych do uniksów. Niektóre z nich to:

  • ps:lista uruchomionych procesów

  • top/htop/sysstat:do monitorowania wykorzystania systemu (procesora / pamięci)

  • vmstat:do ogólnego monitorowania aktywności systemu (w tym pamięci wirtualnej)

  • iostat/iotop/top -mio:do monitorowania IO

  • ntop:do monitorowania sieci

Oto przykład vmstat na polu FreeBSD podczas zapytania, które wymaga odczytów dysku, a także pewnych obliczeń:

procs  memory      page                         disks      faults          cpu
r b w  avm   fre   flt   re  pi  po   fr    sr  ad0 ad1  in     sy    cs us sy id
0 0 0  98G  666M   421   0   0   0   170  2281    5  0  538   6361  2593  1  1 97
0 0 0  98G  665M   141   0   0   0     0  2288   13  0  622  11055  3748  3  2 94
--- query starts here ---
0 0 0  98G  608M   622   0   0   0   166  2287 1072  0 1883  16496 12202  3  2 94
0 0 0  98G  394M   101   0   0   0     2  2284 4578  0 5815  24236 39205  3  5 92
2 0 0  98G  224M  4861   0   0   0  1711  2287 3588  0 4806  24370 31504  4  6 91
0 0 0  98G  546M    84 188   0   0 39052 41183 2832  0 4017  26007 27131  5  7 88
2 0 0  98G  469M   418   0   0   1   397  2289 1590  0 2356  11789 15030  2  2 96
0 0 0  98G  339M   112   0   0   0   348  2300 2852  0 3858  17250 25249  3  4 93
--- query ends here ---
1 0 0  98G  332M  1622   0   0   0   213  2289    4  0  531   6929  2502  3  2 95

Powtarzając zapytanie, nie zauważylibyśmy żadnego nowego wzrostu aktywności dysku, ponieważ te bloki dysku byłyby już w pamięci podręcznej systemu operacyjnego. Chociaż administrator PostgreSQL DBA musi być w stanie w pełni zrozumieć, co dzieje się w podstawowej infrastrukturze, w której działa baza danych, bardziej złożone monitorowanie systemu jest zwykle zadaniem administratora systemu, ponieważ jest to duży temat sam w sobie.

W Linuksie bardzo przydatny skrót do góry narzędzie naciska „C”, które przełącza wyświetlanie wiersza poleceń procesów. PostgreSQL domyślnie przepisuje wiersz poleceń backendów z aktualną aktywnością SQL, którą aktualnie wykonują, a także z użytkownikiem.

Podstawy monitorowania PostgreSQL

Ważnymi zmiennymi w monitorowaniu PostgreSQL są:

  • Wydajność pamięci podręcznej bufora (trafienia w pamięci podręcznej a odczyty z dysku)
  • Liczba zatwierdzeń
  • Liczba połączeń
  • Liczba sesji
  • Punkty kontrolne i statystyki bgwriter
  • Odkurzacze
  • Zamki
  • Replikacja
  • I na koniec, ale zdecydowanie nie mniej ważne, zapytania

Zasadniczo w konfiguracji monitorowania istnieją dwa sposoby gromadzenia danych:

  • Aby uzyskać dane za pośrednictwem dziennika
  • Aby uzyskać dane przez zapytanie systemu PostgreSQL

Pozyskiwanie danych w oparciu o pliki dziennika zależy od (odpowiednio skonfigurowanego) dziennika PostgreSQL. Tego rodzaju rejestrowanie możemy wykorzystać do przetwarzania danych „off-line”. Monitorowanie oparte na plikach dziennika najlepiej sprawdza się, gdy wymagane jest minimalne obciążenie serwera PostgreSQL i kiedy nie zależy nam na danych w czasie rzeczywistym lub otrzymywaniu alertów na żywo (chociaż monitorowanie na żywo przy użyciu danych z pliku dziennika może być możliwe poprzez np. skierowanie dziennika postgresql do sysloga a następnie przesyłanie strumieniowe syslog na inny serwer przeznaczony do przetwarzania logów).

Pobierz oficjalny dokument już dziś Zarządzanie i automatyzacja PostgreSQL za pomocą ClusterControlDowiedz się, co musisz wiedzieć, aby wdrażać, monitorować, zarządzać i skalować PostgreSQLPobierz oficjalny dokument

Zbieracz statystyk PostgreSQL

PostgreSQL zapewnia bogaty zestaw widoków i funkcji łatwo dostępnych za pośrednictwem podsystemu Statistics Collector. Dane te są podzielone na dwie kategorie:

  • Dynamiczne informacje o tym, co system robi w tej chwili.
  • Statystyki zgromadzone od ostatniego zresetowania podsystemu zbierającego statystyki.

Dynamiczne widoki statystyk podaj informacje o bieżącej aktywności na proces (pg_stat_activity), stanie fizycznej replikacji (pg_stat_replication), stanie fizycznego czuwania (pg_stat_wal_receiver) lub logicznego (pg_stat_subscription), ssl (pg_stat_ssl) i próżni (pg_stat_progress_vacuum).

Wyświetlenia zebranych statystyk dostarczać informacji o ważnych procesach w tle, takich jak archiwizator wal, bgwriter i obiekty bazy danych:tabele użytkowników lub systemowe, indeksy, sekwencje i funkcje, a także same bazy danych.

Powinno być już oczywiste, że istnieje wiele sposobów kategoryzowania danych związanych z monitorowaniem:

  • Według źródła:
    • Narzędzia systemowe (ps, top, iotop itp.)
    • Plik dziennika PgSQL
    • Baza danych
      • Dynamiczny
      • Zebrane
  • Według określonej operacji bazy danych:
    • Buforowa pamięć podręczna
    • Potwierdza
    • Zapytania
    • Sesje
    • Punkty kontrolne
    • itd.

Po przeczytaniu tego artykułu i eksperymentowaniu z przedstawionymi pojęciami, koncepcjami i terminami powinieneś być w stanie stworzyć macierz 2D ze wszystkimi możliwymi kombinacjami. Na przykład, konkretną aktywność PostgreSQL (polecenie SQL) można znaleźć za pomocą:ps lub top (narzędzia systemowe), plików dziennika PostgreSQL, pg_stat_activity (widok dynamiczny), ale także za pomocą pg_stat_statements, rozszerzenia znalezionego w contrib (widok zebranych statystyk) . Podobnie informacje o blokadach można znaleźć w plikach dziennika PostgreSQL, pg_locks i pg_stat_activity (przedstawiony tuż poniżej) za pomocą wait_event i wait_event_type . Z tego powodu trudno jest objąć rozległy obszar monitoringu w jednowymiarowy, linearny sposób, a autorowi grozi z tego powodu zamieszanie u czytelnika. Aby tego uniknąć, zajmiemy się monitorowaniem z grubsza, postępując zgodnie z oficjalną dokumentacją i dodając powiązane informacje w razie potrzeby.

Dynamiczne wyświetlenia statystyk

Korzystanie z pg_stat_activity jesteśmy w stanie zobaczyć, jaka jest bieżąca aktywność różnych procesów backendowych. Na przykład, jeśli uruchomimy następujące zapytanie na częściach tabeli z około 3 milionami wierszy:

testdb=# \d parts
                         Table "public.parts"
   Column   |          Type          | Collation | Nullable | Default
------------+------------------------+-----------+----------+---------
 id         | integer                |           |          |
 partno     | character varying(20)  |           |          |
 partname   | character varying(80)  |           |          |
 partdescr  | text                   |           |          |
 machine_id | integer                |           |          |
 parttype   | character varying(100) |           |          |
 date_added | date                   |           |          |

I uruchommy następujące zapytanie, które potrzebuje kilku sekund na ukończenie:

testdb=# select avg(age(date_added)) FROM parts;

Otwierając nowy terminal i uruchamiając następujące zapytanie, podczas gdy poprzednie wciąż działa, otrzymujemy:

testdb=# select pid,usename,application_name,client_addr,backend_start,xact_start,query_start,state,backend_xid,backend_xmin,query,backend_type from pg_stat_activity where datid=411547739 and usename ='achix' and state='active';
-[ RECORD 1 ]----+----------------------------------------
pid              | 21305
usename          | achix
application_name | psql
client_addr      |
backend_start    | 2018-03-02 18:04:35.833677+02
xact_start       | 2018-03-02 18:04:35.832564+02
query_start      | 2018-03-02 18:04:35.832564+02
state            | active
backend_xid      |
backend_xmin     | 438132638
query            | select avg(age(date_added)) FROM parts;
backend_type     | background worker
-[ RECORD 2 ]----+----------------------------------------
pid              | 21187
usename          | achix
application_name | psql
client_addr      |
backend_start    | 2018-03-02 18:02:06.834787+02
xact_start       | 2018-03-02 18:04:35.826065+02
query_start      | 2018-03-02 18:04:35.826065+02
state            | active
backend_xid      |
backend_xmin     | 438132638
query            | select avg(age(date_added)) FROM parts;
backend_type     | client backend
-[ RECORD 3 ]----+----------------------------------------
pid              | 21306
usename          | achix
application_name | psql
client_addr      |
backend_start    | 2018-03-02 18:04:35.837829+02
xact_start       | 2018-03-02 18:04:35.836707+02
query_start      | 2018-03-02 18:04:35.836707+02
state            | active
backend_xid      |
backend_xmin     | 438132638
query            | select avg(age(date_added)) FROM parts;
backend_type     | background worker

Widok pg_stat_activity dostarcza nam informacji o procesie backendu, użytkowniku, kliencie, transakcji, zapytaniu, stanie, a także wyczerpujące informacje o stanie oczekiwania na zapytanie.

Ale dlaczego 3 rzędy? W wersjach>=9.6, jeśli zapytanie może być uruchamiane równolegle lub jego części mogą być uruchamiane równolegle, a optymalizator uważa, że ​​wykonywanie równoległe jest najszybszą strategią, wówczas tworzy Gather lub Zbierz scalanie węzła, a następnie żąda co najwyżej max_parallel_workers_per_gather procesy robocze w tle, których domyślnie jest 2, stąd 3 wiersze, które widzimy w powyższym wyjściu. Możemy odróżnić proces backendu klienta od pracownika działającego w tle, używając backend_type kolumna. Aby widok pg_stat_activity był włączony, musisz upewnić się, że parametr konfiguracji systemu track_activities jest włączony. Parametr pg_stat_activity zapewnia bogate informacje w celu określenia zablokowanych zapytań za pomocą kolumn wait_event_type i wait_event.

Bardziej wyrafinowanym sposobem monitorowania oświadczeń jest użycie pg_stat_statements rozszerzenie contribut, wspomniane wcześniej. W najnowszym systemie Linux (Ubuntu 17.10, PostgreSQL 9.6) można to dość łatwo zainstalować:

testdb=# create extension pg_stat_statements ;
CREATE EXTENSION
testdb=# alter system set shared_preload_libraries TO 'pg_stat_statements';
ALTER SYSTEM
testdb=# \q
[email protected]:~$ sudo systemctl restart postgresql
[email protected]:~$ psql testdb
psql (9.6.7)
Type "help" for help.

testdb=# \d pg_stat_statements

Stwórzmy tabelę z 100000 wierszami, a następnie zresetujmy instrukcje pg_stat_statements, zrestartujmy serwer PostgreSQL, dokonaj wyboru na tej tabeli w (wciąż zimnym) systemie, a następnie zobaczmy zawartość instrukcji pg_stat_statements dla zaznaczenia:

testdb=# select 'descr '||gs as descr,gs as id into medtable from  generate_series(1,100000) as gs;
SELECT 100000
testdb=# select pg_stat_statements_reset();
 pg_stat_statements_reset
--------------------------
 
(1 row)

testdb=# \q
[email protected]:~$ sudo systemctl restart postgresql
[email protected]:~$ psql testdb -c 'select * from medtable' > /dev/null
testdb=# select shared_blks_hit,shared_blks_read from pg_stat_statements where query like '%select%from%medtable%';
 shared_blks_hit | shared_blks_read
-----------------+------------------
               0 |              541
(1 row)

testdb=#

Teraz wykonajmy jeszcze raz zaznaczenie *, a następnie ponownie zajrzyjmy do zawartości pg_stat_statements dla tego zapytania:

[email protected]:~$ psql testdb -c 'select * from medtable' > /dev/null
[email protected]:~$ psql testdb
psql (9.6.7)
Type "help" for help.

testdb=# select shared_blks_hit,shared_blks_read from pg_stat_statements where query like '%select%from%medtable%';
 shared_blks_hit | shared_blks_read
-----------------+------------------
             541 |              541
(1 row)

Tak więc za drugim razem instrukcja select znajdzie wszystkie wymagane bloki we współdzielonych buforach PostgreSQL, a pg_stat_statements zgłasza to przez shared_blks_hit . pg_stat_statements dostarcza informacji o całkowitej liczbie wywołań instrukcji, total_time, min_time, max_time i mean_time, co może być niezwykle pomocne przy próbie analizy obciążenia systemu. Powolne zapytanie, które jest uruchamiane bardzo często, powinno wymagać natychmiastowej uwagi. Podobnie, stale niskie współczynniki trafień mogą oznaczać konieczność przejrzenia shared_buffers ustawienie.

pg_stat_replication dostarcza informacji o aktualnym stanie replikacji dla każdego wal_sender. Załóżmy, że ustawiliśmy prostą topologię replikacji z naszym podstawowym i jednym gorącym trybem gotowości, a następnie możemy wysłać zapytanie o pg_stat_replication na podstawowym (wykonanie tego samego w trybie gotowości nie przyniesie żadnych wyników, chyba że mamy skonfigurowaną replikację kaskadową, a ten konkretny tryb gotowości służy jako upstream do innych rezerwowych urządzeń końcowych), aby zobaczyć aktualny stan replikacji:

testdb=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 1317
usesysid         | 10
usename          | postgres
application_name | walreceiver
client_addr      | 10.0.2.2
client_hostname  |
client_port      | 48192
backend_start    | 2018-03-03 11:59:21.315524+00
backend_xmin     |
state            | streaming
sent_lsn         | 0/3029DB8
write_lsn        | 0/3029DB8
flush_lsn        | 0/3029DB8
replay_lsn       | 0/3029DB8
write_lag        |
flush_lag        |
replay_lag       |
sync_priority    | 0
sync_state       | async

Cztery kolumny sent_lsn , write_lsn , flush_lsn , replay_lsn powiedz nam dokładną pozycję WAL na każdym etapie procesu replikacji w zdalnym trybie gotowości. Następnie tworzymy duży ruch na podstawowym za pomocą polecenia takiego jak:

testdb=# insert into foo(descr) select 'descr ' || gs from generate_series(1,10000000) gs;

I spójrz ponownie na pg_stat_replication:

postgres=# select * from pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 1317
usesysid         | 10
usename          | postgres
application_name | walreceiver
client_addr      | 10.0.2.2
client_hostname  |
client_port      | 48192
backend_start    | 2018-03-03 11:59:21.315524+00
backend_xmin     |
state            | streaming
sent_lsn         | 0/D5E0000
write_lsn        | 0/D560000
flush_lsn        | 0/D4E0000
replay_lsn       | 0/C5FF0A0
write_lag        | 00:00:04.166639
flush_lag        | 00:00:04.180333
replay_lag       | 00:00:04.614416
sync_priority    | 0
sync_state       | async

Teraz widzimy, że mamy opóźnienie między głównym i rezerwowym, przedstawionym w sent_lsn , write_lsn , flush_lsn , replay_lsn wartości. Od PgSQL 10.0 pg_stat_replication pokazuje również opóźnienie między ostatnio opróżnionym lokalnie WAL a czasem potrzebnym na zdalne zapisanie, opróżnienie i odtworzenie. Widząc wartości null w tych 3 kolumnach, oznacza to, że główny i rezerwowy są zsynchronizowane.

Odpowiednik pg_stat_replication po stronie gotowości nazywa się:pg_stat_wal_receiver:

testdb=# select * from pg_stat_wal_receiver ;
-[ RECORD 1 ]---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
pid                   | 17867
status                | streaming
receive_start_lsn     | 0/F000000
receive_start_tli     | 1
received_lsn          | 0/3163F210
received_tli          | 1
last_msg_send_time    | 2018-03-03 13:32:42.516551+00
last_msg_receipt_time | 2018-03-03 13:33:28.644394+00
latest_end_lsn        | 0/3163F210
latest_end_time       | 2018-03-03 13:32:42.516551+00
slot_name             | fbsdclone
conninfo              | user=postgres passfile=/usr/local/var/lib/pgsql/.pgpass dbname=replication host=10.0.2.2 port=20432 fallback_application_name=walreceiver sslmode=disable sslcompression=1 target_session_attrs=any

testdb=#

Gdy nie ma żadnej aktywności, a tryb gotowości odtworzył wszystko, to latest_end_lsn musi być równy sent_lsn na podstawowym (i wszystkich pośrednich numerach sekwencyjnych dziennika).

Podobnie jak w przypadku replikacji fizycznej, w przypadku replikacji logicznej, gdzie rolę podstawową przejmuje wydawca, a rezerwową subskrybent, naturalnie rolę pg_stat_wal_receiver jest pobierany przez pg_stat_subscription . Możemy zapytać pg_stat_subscription w następujący sposób:

testdb=# select * from pg_stat_subscription ;
-[ RECORD 1 ]---------+------------------------------
subid                 | 24615
subname               | alltables_sub
pid                   | 1132
relid                 |
received_lsn          | 0/33005498
last_msg_send_time    | 2018-03-03 17:05:36.004545+00
last_msg_receipt_time | 2018-03-03 17:05:35.990659+00
latest_end_lsn        | 0/33005498
latest_end_time       | 2018-03-03 17:05:36.004545+00

Zwróć uwagę, że po stronie wydawcy odpowiedni widok jest taki sam jak w przypadku replikacji fizycznej:pg_stat_replication .

Wyświetlenia zebranych statystyk

pg_stat_archiver widok ma jeden wiersz, który zawiera informacje o archiwizatorze walu. Przechowywanie migawki tego wiersza w regularnych odstępach czasu pozwala obliczyć rozmiar ruchu WAL między tymi interwałami. Daje również informacje o błędach podczas archiwizacji plików WAL.

pg_stat_bgwriter widok zawiera bardzo ważne informacje na temat zachowania:

  • Wskaźnik kontrolny
  • Pisarz w tle
  • Backendy (obsługa klienta)

Ponieważ ten widok podaje skumulowane dane od ostatniego resetowania, bardzo przydatne jest utworzenie kolejnej tabeli ze znacznikami czasu z okresowymi migawkami pg_stat_bgwriter , dzięki czemu łatwo będzie uzyskać przyrostową perspektywę między dwoma migawkami. Dostrajanie to nauka (lub magia) i wymaga obszernego rejestrowania i monitorowania, a także jasnego zrozumienia podstawowych pojęć i elementów wewnętrznych PostgreSQL, aby uzyskać dobre wyniki, a ten widok jest od czego zacząć, szukając takich rzeczy, jak:

  • Czy punkty kontrolne_czasowe? zdecydowana większość wszystkich punktów kontrolnych? Jeśli nie, należy podjąć działania, zmierzyć wyniki i powtórzyć cały proces, aż nie zostaną znalezione żadne ulepszenia.
  • Czy punkt kontrolny_buforów? znaczna większość nad pozostałymi dwoma rodzajami (buffers_clean ale co najważniejsze buffers_backend ) ? Jeśli wartości buffers_backend są wysokie, to znowu pewne parametry konfiguracji muszą zostać zmienione, należy wykonać nowe pomiary i ponownie je ocenić.

Pg_stat_[użytkownik|sys|wszystkie]_tabele

Najbardziej podstawowym zastosowaniem tych widoków jest sprawdzenie, czy nasza strategia próżniowa działa zgodnie z oczekiwaniami. Duże wartości martwych krotek w stosunku do żywych krotek oznaczają nieefektywne odkurzanie. Widoki te dostarczają również informacji na temat skanowania i pobierania sekwencji i indeksu, informacji o liczbie wierszy wstawionych, zaktualizowanych, usuniętych oraz aktualizacji HOT. Powinieneś starać się utrzymywać jak największą liczbę aktualizacji HOT, aby poprawić wydajność.

Pg_stat_[użytkownik|sys|wszystkie]_indexes

Tutaj system przechowuje i wyświetla informacje o indywidualnym wykorzystaniu indeksu. Należy pamiętać, że idx_tup_read jest dokładniejszy niż idx_tup_fetch. Nie PK/nieunikalne indeksy z niskim idx_scan należy rozważyć ich usunięcie, ponieważ utrudniają one tylko aktualizacje HOT. Jak wspomniano na poprzednim blogu, należy unikać nadmiernego indeksowania, indeksowanie wiąże się z kosztami.

Pg_statio_[użytkownik|sys|wszystkie]_tabele

W tych widokach możemy znaleźć informacje o wydajności pamięci podręcznej w odniesieniu do odczytów sterty tabeli, odczytów indeksów i odczytów TOAST. Proste zapytanie w celu zliczenia procentu trafień i rozkładu trafień w tabelach wyglądałoby następująco:

with statioqry as (select relid,heap_blks_hit,heap_blks_read,row_number() OVER (ORDER BY 100.0*heap_blks_hit::numeric/(heap_blks_hit+heap_blks_read) DESC),COUNT(*) OVER () from pg_statio_user_tables where heap_blks_hit+heap_blks_read >0)
select relid,row_number,100.0*heap_blks_hit::float8/(heap_blks_hit+heap_blks_read) as "heap block hits %", 100.0 * row_number::real/count as "In top %" from statioqry order by row_number;
   relid   | row_number | heap block hits % |     In top %      
-----------+------------+-------------------+-------------------
     16599 |          1 |  99.9993058404502 | 0.373134328358209
     18353 |          2 |  99.9992251425738 | 0.746268656716418
     18338 |          3 |    99.99917566565 |  1.11940298507463
     17269 |          4 |  99.9990617323798 |  1.49253731343284
     18062 |          5 |  99.9988021889522 |  1.86567164179104
     18075 |          6 |  99.9985334109273 |  2.23880597014925
     18365 |          7 |  99.9968070500335 |  2.61194029850746
………..
     18904 |        127 |  97.2972972972973 |  47.3880597014925
     18801 |        128 |  97.1631205673759 |  47.7611940298507
     16851 |        129 |  97.1428571428571 |   48.134328358209
     17321 |        130 |  97.0043198249512 |  48.5074626865672
     17136 |        131 |                97 |  48.8805970149254
     17719 |        132 |  96.9791612263018 |  49.2537313432836
     17688 |        133 |   96.969696969697 |  49.6268656716418
     18872 |        134 |  96.9333333333333 |                50
     17312 |        135 |  96.8181818181818 |  50.3731343283582
……………..
     17829 |        220 |  60.2721026527734 |   82.089552238806
     17332 |        221 |  60.0276625172891 |  82.4626865671642
     18493 |        222 |                60 |  82.8358208955224
     17757 |        223 |  59.7222222222222 |  83.2089552238806
     17586 |        224 |  59.4827586206897 |  83.5820895522388

To mówi nam, że co najmniej 50% stołów ma współczynnik trafień większy niż 96,93%, a 83,5% stołów ma współczynnik trafień lepszy niż 59,4%

Pg_statio_[użytkownik|sys|wszystkie]_indeksy

Ten widok zawiera informacje o blokowaniu/odczycie dla indeksów.

Pg_stat_database

Ten widok zawiera jeden wiersz na bazę danych. Pokazuje niektóre informacje z poprzednich widoków zagregowane do całej bazy danych (odczytane bloki, trafienia bloków, informacje o tups), niektóre informacje dotyczące całej bazy danych (łączna liczba xactions, pliki tymczasowe, konflikty, martwe zegary, czas odczytu/zapisu) , a na koniec liczba aktualnych backendów.

Rzeczy, na które należy zwrócić uwagę, to stosunek blks_hit/(blks_hit + blks_read) :im wyższa wartość, tym lepiej dla I/O systemu. Jednak chybienia niekoniecznie powinny być uwzględniane w odczytach dysku, ponieważ mogły one być bardzo dobrze obsługiwane przez pamięć podręczną plików systemu operacyjnego.

Podobnie jak w przypadku innych widoków zebranych statystyk wymienionych powyżej, należy utworzyć wersję pg_stat_database ze znacznikiem czasu zobacz i zobacz różnice między dwoma kolejnymi migawkami:

  • Czy liczba wycofań rośnie?
  • Czy liczba popełnionych działań?
  • Czy mamy o wiele więcej konfliktów niż wczoraj (dotyczy to czuwania)?
  • Czy mamy nienormalnie dużą liczbę zakleszczeń?

To wszystko są bardzo ważne dane. Pierwsze dwa mogą oznaczać pewną zmianę w pewnym wzorcu użytkowania, co należy wyjaśnić. Duża liczba konfliktów może oznaczać, że replikacja wymaga dostrojenia. Duża liczba zakleszczeń jest zła z wielu powodów. Nie tylko wydajność jest niska, ponieważ transakcje są wycofywane, ale także jeśli aplikacja cierpi z powodu zakleszczeń w topologii jednego mastera, problemy będą się nasilać tylko wtedy, gdy przejdziemy na multi-master. W takim przypadku dział inżynierii oprogramowania musi przepisać fragmenty kodu, które powodują zakleszczenia.

Zamki

Powiązane zasoby ClusterControl dla PostgreSQL Jak zarządzać istniejącym serwerem Postgres i monitorować go Jak porównywać wydajność PostgreSQL

Blokowanie jest bardzo ważnym tematem w PostgreSQL i zasługuje na swój własny(e) blog(i). Niemniej jednak podstawowe monitorowanie śluz musi odbywać się w taki sam sposób, jak inne aspekty monitorowania przedstawione powyżej. pg_locks view dostarcza w czasie rzeczywistym informacji o aktualnych blokadach w systemie. Możemy złapać długo czekające blokady, ustawiając log_lock_waits , wówczas informacja o długim oczekiwaniu zostanie zapisana w logu PgSQL. Jeśli zauważymy nietypowo wysokie blokowanie, które skutkuje długimi oczekiwaniem, to znowu, jak w przypadku wspomnianych powyżej zakleszczeń, inżynierowie oprogramowania muszą przejrzeć wszelkie fragmenty kodu, które mogą powodować długo utrzymywane blokady, np. jawne blokowanie w aplikacji (LOCK TABLE lub SELECT … FOR UPDATE).

Podobnie jak w przypadku impasów, system z krótkimi blokadami łatwiej przejdzie do konfiguracji z wieloma wzorcami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Klauzula SQL Between z kolumnami stringów

  2. Optymalizacja zapytań w PostgreSQL. WYJAŚNIJ podstawy – część 3

  3. Problemy z poleceniem postgresql COPY z Railsami na innym serwerze

  4. Jak mieć pełną funkcjonalność offline w aplikacji internetowej z bazą danych PostgreSQL?

  5. Znajdź n najbliższych sąsiadów dla danego punktu za pomocą PostGIS?