Wolny PostgreSQL pod presją produkcyjną zachęca do zgadywania, a zgadywanie to sposób, w jaki rescue idzie źle. Dodanie indeksu, podniesienie ustawienia pamięci albo restart serwera mogą ukryć prawdziwy bottleneck i wprowadzić nowe ryzyko. Praca, która naprawdę się broni, zaczyna się od dowodów i zmienia jedną rzecz naraz.
Kiedy pojawia się problem
Telefon dzwoni zwykle wtedy, gdy coś widocznego pęka: strony timeoutują w szczycie, background jobs się piętrzą, nocny raport przestaje się kończyć albo liczba połączeń skacze, aż aplikacja nie może otworzyć nowych sesji. Często w zapytaniu nic się nie zmieniło, tylko wolumen danych. Czasem deploy dodał zapytanie, które wygląda niewinnie, a robi sequential scan po tabeli, która po cichu urosła do dziesiątek milionów wierszy. Pierwsze zadanie to nie naprawianie. To precyzyjny opis incydentu.
Typowe tryby awarii
Strojenie ustawień przed czytaniem zapytań. Podniesienie work_mem albo shared_buffers wydaje się produktywne, ale jeśli jeden plan zapytania jest zły, globalna gałka tylko rozkłada koszt. Najpierw dowody, potem ustawienia.
Indeksowanie z intuicji. Indeksy, które nie pasują do żadnego realnego zapytania, dokładają narzut zapisu i bloat, nie pomagając odczytom. Nieużywane indeksy to koszt, nie polisa.
Ignorowanie locków i długich transakcji. Pojedyncza długo działająca transakcja potrafi blokować autovacuum, trzymać locki i zatrzymać wszystko za sobą. Wolny objaw często jest problemem locków przebranym za problem wydajności.
Pozwalanie na dryf bloatu i autovacuum. Tabele i indeksy puchną, gdy autovacuum nie nadąża, a bloat powoli degraduje każde zapytanie do nich. Jest niewidoczny, dopóki go nie zmierzysz.
Zmiana produkcji na ślepo. Poprawka, która działa na małym zbiorze, może zachować się zupełnie inaczej na danych wielkości produkcyjnej. Bez testu zbliżonego do produkcji “działało lokalnie” nie jest pocieszeniem.
Jak prowadzić śledztwo
Zacznij od kształtu incydentu, potem zawężaj dowodami.
Opisz objaw precyzyjnie
Wolne strony, opóźnione joby, lock waity, wysokie CPU, presja IO, wyczerpanie połączeń albo rosnące latency prowadzą każdym inną ścieżką. Nazwanie objawu zawęża obszar poszukiwań, zanim cokolwiek ruszysz.
Czytaj zapytania
Znajdź wolne zapytania, spójrz na plany wykonania, porównaj szacowane wiersze z rzeczywistością i sprawdź brakujące indeksy, nieużywane indeksy i powtarzające się full scany. Garść planów zwykle mówi jaśniej niż ogólne porady o tuningu.
Sprawdź warstwę operacyjną
Zbadaj locki, długie transakcje, kondycję autovacuum, bloat tabel i indeksów, zachowanie ostatnich migracji, connection pooling i presję background jobs. Wolna baza to często problem systemowy, nie tylko problem SQL.
Checklista operacyjna
- Incydent ma nazwany objaw, nie tylko “baza jest wolna”.
- Wolne zapytania są zidentyfikowane z dowodów, z przechwyconymi planami.
- Szacowane wiersze są porównane z rzeczywistymi, żeby wykryć przestarzałe statystyki.
- Locki i długie transakcje zostały wykluczone albo potwierdzone.
- Kondycja autovacuum i bloat są zmierzone, nie założone.
- Connection pooling i współbieżność jobów są uwzględnione.
- Każda proponowana zmiana ma rollback i sposób weryfikacji.
Bezpieczna droga naprzód
Zmierz, odizoluj jeden bottleneck, zmień najmniejszą użyteczną rzecz, zweryfikuj w warunkach zbliżonych do produkcji i trzymaj jasne opcje rollbacku. Oprzyj się pokusie wprowadzenia pięciu zmian naraz; jeśli coś się poprawi, nie będziesz wiedzieć, która zmiana zadziałała, a jeśli coś pęknie, nie będziesz wiedzieć, którą cofnąć. Jedna zmiana, jeden pomiar, powtórka.
Ta praca z bazą zwykle przychodzi w ramach modernizacji i rescue infrastruktury i często stoi obok dashboardów operacyjnych real-time, które jako pierwsze uwidoczniły spowolnienie. Łączy się z naszymi szerszymi usługami oraz z myśleniem o modernizacji z checklisty modernizacji Rails. Jeśli produkcyjna baza jest pod presją, napisz, co się psuje, a zaczniemy od dowodów.
Ten artykuł to ogólne wskazówki inżynierskie, nie porada dla jednego konkretnego systemu. Realne rescue powinno zawsze zaczynać się od pomiarów z Twojego środowiska produkcyjnego.

