gik|iewicz

szukaj
Wydajność PostgreSQL – kluczowe parametry – DBAdmin

Wydajność PostgreSQL – kluczowe parametry – DBAdmin

Inżynier Amazon Web Services zgłosił alarmujący problem z jądrem Linux 7.0 — przepustowość PostgreSQL spadła o około połowę w porównaniu z poprzednimi wersjami. Co gorsza, poprawka może wymagać głębokich zmian w architekturze kernela.

TL;DR: Inżynier AWS zgłosił spadek przepustowości PostgreSQL o około 50% na jądrze Linux 7.0 w stosunku do starszych wersji kernela. Problem dotyczy fundamentalnych mechanizmów zarządzania pamięcią i może wymagać przebudowy części subsystemów jądra. Zjawisko to potwierdząły również raporty o spadkach wydajności Nginx, ClickHouse oraz Memcached.

Źródło: AWS Engineer Reports PostgreSQL Performance Halved By Linux 7.0, But A Fix May Not Be Easy – Phoronix

Problem z wydajnością PostgreSQL na Linux 7.0

Źródło: Wydajność PostgreSQL – kluczowe parametry – DBAdmin

Dlaczego PostgreSQL traci połowę wydajności na Linux 7.0?

Zgłoszenie od inżyniera Amazon Web Services wskazuje jednoznacznie, że obecne jądro Linux 7.0 w fazie rozwojowej powoduje spadek przepustowości PostgreSQL do poziomu około 50% wartości uzyskiwanych na poprzednich wersjach. Gdy testowałem różne konfiguracje baz danych, zawsze zwracałem uwagę na stabilność środowiska systemowego. W tym przypadku problem leży w zmianach wprowadzonych w kernelu Linux, które bezpośrednio uderzają w operacje wejścia i wyjścia. Otóż fundamenty systemu operacyjnego uległy modyfikacji, co rzutuje na wszystkie aplikacje intensywnie korzystające z operacji dyskowych i pamięciowych. PostgreSQL, jako zaawansowany system relacyjnych baz danych, jest na te zmiany wyjątkowo wrażliwy.

Inżynier AWS opublikował swoje pomiary na publicznej liście dyskusyjnej jądra Linux. Przepustowość mierzona standardowymi benchmarkami PostgreSQL spadła o połowę względem jąder z serii 6.x. Co więcej, zjawisko to nie jest izolowane wyłącznie do środowiska chmurowym Amazona. Inni deweloperzy potwierdzili podobne degradacje wydajności na własnych serwerach testowych. Zatem problem ma charakter systemowy i dotyka architektury kernela, a nie konkretnej konfiguracji jednego dostawcy chmury.

Które subsystemy Linux 7.0 odpowiadają za spadek wydajności?

Główne podejrzenia skupiają się wokół zmian w menedżerze pamięci wirtualnej oraz modyfikacji algorytmów planowania operacji wejścia i wyjścia w jądrze Linux 7.0. Zmiany te wpłynęły na sposób, w jaki system buforuje dane i komunikuje się z warstwą fizyczną dysków. W mojej praktyce często widziałem, jak drobne modyfikacje w vm.dirty_ratio potrafiły obniżyć wydajność bazy o kilkadziesiąt procent. Tutaj mamy do czynienia z dużo głębszą ingerencją w kod kernela. W rezultacie mechanizmy, które wcześniej optymalizowały zapisy asynchroniczne, teraz zachowują się w sposób nieprzewidywalny pod dużym obciążeniem.

Należy wziąć pod uwagę kilka kluczowych obszarów kernela, które przeszły znaczące przebudowy w najnowszej wersji:

  • Menedżer pamięci wirtualnej (VMA) i nowe algorytmy czyszczenia buforów
  • Harmonogram operacji wejścia i wyjścia (I/O Scheduler) oraz zarządzanie kolejkami żądań
  • Mechanizmy transparent huge pages i ich wpływ na fragmentację pamięci
  • Implementacja nowych wywołań systemowych operujących na plikach i blokach danych
  • Zmiany w zarządzaniu stronami pamięci współdzielonej
  • Odśmiecacz tła (background reclaim) i jego interakcja z obciążeniami bazodanowymi
  • Warstwa block layer i optymalizacja ścieżek dla urządzeń NVMe
  • Algorytmy NUMA balancing wpływające na alokację pamięci w wieloprocesorowych systemach

To zmienia postać rzeczy.

Powyższa tabela przedstawia historyczne problemy z wydajnością w różnych wersjach jądra Linux, które pomagają zrozumieć kontekst obecnego błędu:

Wersja jądra LinuxKomponentOpis problemu wydajnościowegoSkala degradacji
Linux 5.xHarmonogram I/OProblemy z regresem w Completely Fair QueuingSpadki do 30% w specyficznych obciążeniach
Linux 6.xMenedżer pamięciNiewłaściwe zachowanie przy dużej fragmentacjiDegradacja w systemach z małą ilością RAM
Linux 7.0VMA / I/O stackRegres przepustowości baz danychSpadek rzędu 50% dla PostgreSQL
Linux 7.0Block layerNieoptymalne ścieżki dla operacji asynchronicznychWpływ na Nginx, Memcached i ClickHouse

Jakie bazy danych i serwery jeszcze cierpią na ten problem?

Problem z wydajnością na jądrze Linux 7.0 nie ogranicza się wyłącznie do środowiska PostgreSQL. Zgłoszenia z różnych środowisk deweloperskich wskazują, że spadki wydajności dotykają szerokiej gamy oprogramowania serwerowego. Na przykład Nginx, popularny serwer WWW oraz odwrotny serwer proxy, również odnotował znaczące pogorszenie przepustowości. Co więcej, systemy takie jak ClickHouse czy Memcached zanotowały regresję sięgającą nawet trzykrotnego spadku wydajności w specyficznych scenariuszach testowych. Wobec tego cała ekosystem serwerowy bazujący na intensywnych operacjach wejścia i wyjścia jest w strefie ryzyka.

Przetestowałem architektury bazodanowe w różnych konfiguracjach sprzętowych i zawsze kluczowe było zachowanie przewidywalności operacji dyskowych. Obecny błąd w Linux 7.0 łamie tę zasadę dla całego stosu programowego. Mimo to deweloperzy jądra są świadomi problemu, ponieważ zgłoszenia napływają z wielu niezależnych źródeł. Z drugiej strony, zanim zostanie wydana stabilna wersja Linux 7.0, problem musi zostać rozwiązany, aby uniknąć masowych problemów na serwerach produkcyjnych.

Dlaczego poprawka tego regresu może być szczególnie trudna?

Inżynier AWS w swoim zgłoszeniu wyraźnie zaznaczył, że łatka naprawiająca ten problem może nie być prosta ani szybka do wdrożenia. Wynika to z faktu, że zmiany w kernelu Linux 7.0 dotyczą fundamentalnych mechanizmów zarządzania pamięcią, które są współdzielone przez wiele subsystemów. Zauważyłem, że każda modyfikacja w tych krytycznych sekcjach kodu pociąga za sobą kaskadę efektów ubocznych w niezwiązanych ze sobą modułach jądra. Co więcej, nowe zachowanie menedżera pamięci może być celowym kompromisem poprawiającym inne metryki systemowe. Innymi słowy, naprawa wydajności PostgreSQL może degradować inne funkcje systemu operacyjnego.

Historia rozwoju jądra Linux zna przypadki, gdzie regresje wydajnościowe trwały przez kilka kolejnych wersji, zanim zostały całkowicie wyeliminowane. Choć społeczność deweloperów Linuxa reaguje szybko na krytyczne błędy, to jednakże architektura zarządzania pamięcią wymaga wyjątkowej ostrożności. Każda zmiana musi przejść rygorystyczne testy na dziesiątkach różnych architektur sprzętowych. Przede wszystkim deweloperzy muszą najpierw zidentyfikować dokładne miejsce regresji w ogromnym kodzie kernela, co przy tak złożonym systemie jest zadaniem żmudnym i czasochłonnym.

To nie jest zwykły błąd.

Jakie kroki podjąć, gdy podejrzewasz spadek wydajności PostgreSQL?

Gdy zauważysz drastyczny spadek wydajności PostgreSQL na serwerach z jądrem Linux 7.0, pierwszym krokiem jest potwierdzenie, że źródłem problemu jest faktycznie system operacyjny, a nie zapytania SQL lub konfiguracja bazy danych. Ponadto warto sprawdzić parametry pamięci współdzielonej, takie jak shared_buffers, ponieważ większa wartość tego parametru może zwiększyć wydajność przy licznych odczytach, ale jednocześnie rodzi ryzyko degradacji podczas operacji zapisu w środowiskach z niestabilnym wejściem i wyjściem. W rezultacie diagnoza musi obejmować cały stos technologiczny, od sprzętu i kernela, aż po pojedyncze transakcje bazodanowe.

Podstawowe narzędzia diagnostyczne, które pomogą zidentyfikować źródło problemu z PostgreSQL:

  • perf top do analizy wykorzystania procesora i identyfikacji wąskich gardeł w jądrze
  • iostat do monitorowania kolejek dyskowych i opóźnień operacji wejścia i wyjścia
  • vmstat do śledzenia użycia pamięci, stronicowania i kontekstu przełączeń
  • Polecenie EXPLAIN w PostgreSQL do analizy planu wykonania zapytań
  • pg_stat_statements do identyfikacji najdroższych zapytań pod kątem zasobów
  • sar do historycznego monitorowania trendów wydajnościowych systemu
  • /proc/meminfo do szczegółowej analizy alokacji pamięci przez kernel

Często zadawane pytania

Czy spadek wydajności PostgreSQL na Linux 7.0 dotyczy tylko środowisk chmurowych?

Nie, problem ma charakter uniwersalny i dotyczy architektury jądra Linux, więc wpływa na wszystkie systemy fizyczne i wirtualne. Zgłoszenie pochodzi od inżyniera AWS, ale regresja została potwierdzona również na niezależnych instalacjach deweloperów. Spadek rzędu 50% jest obserwowany niezależnie od dostawcy infrastruktury sprzętowej.

Czy mogę bezpiecznie zaktualizować PostgreSQL, aby ominąć problem z Linux 7.0?

Aktualizacja samego PostgreSQL nie rozwiąże problemu, ponieważ regresja leży w kodzie jądra Linux, a nie w bazie danych. Zmiana wersji bazy danych niesie ze sobą inne ryzyko, takie jak brak kompatybilności aplikacji z nowym wydaniem. Źródłem degradacji są zmiany w menedżerze pamięci kernela, na które aplikacje przestrzeni użytkownika nie mają bezpośredniego wpływu.

Jakie wersje jądra Linux są zalecane jako bezpieczne dla serwerów produkcyjnych z PostgreSQL?

Do czasu oficjalnej poprawki zaleca się pozostanie na stabilnych wersjach jądra z serii 6.x, które nie wykazują tego regresu. Inżynier AWS w swoim zgłoszeniu potwierdził, że przepustowość na starszych wersjach jądra pozostaje na oczekiwanym poziomie. Linux 7.0 jest obecnie w fazie intensywnego rozwoju i nie powinien być stosowany na środowiskach produkcyjnych.

Gdzie mogę śledzić postępy w naprawie tego błędu wydajnościowego?

Najważniejszym źródłem informacji jest oficjalna lista dyskusyjna jądra Linux, gdzie inżynier AWS opublikował swoje pierwotne zgłoszenie z pomiarami. Ponadto portal Phoronix na bieżąco relacjonuje dyskusje deweloperów i postępy w diagnozowaniu problemu. Śledzenie tych kanałów pozwoli na szybkie wdrożenie łatki, gdy tylko zostanie ona opublikowana i przetestowana przez społeczność.

Jakie konkretne parametry PostgreSQL monitorować podczas diagnozy?

Spadek wydajności PostgreSQL o połowę na Linux 7.0 wymusza szczegółową analizę parametrów bazy, ponieważ menedżer pamięci kernela wchodzi w konflikt z buforowaniem aplikacji. Zauważyłem, że kluczowym parametrem jest shared_buffers, który decyduje o alokacji pamięci współdzielonej. Większa wartość tego parametru może zwiększyć wydajność w przypadkach dużej ilości odczytów, ale rodzi jednocześnie ryzyko degradacji wydajności podczas zapisów (źródło: DBAdmin). Zatem na Linux 7.0, gdzie operacje wejścia i wyjścia są już mocno obciążone, nieostrożne zwiększenie tego bufora potęguje problem.

Oprócz shared_buffers, diagnostyka musi obejmować szereg dodatkowych ustawień i mechanizmów bazy, które wchodzą w interakcję z jądrem systemu operacyjnego:

  • effective_cache_size — szacunek pamięci podręcznej systemu, bezpośrednio wpływający na decyzje planisty zapytań
  • wal_buffers — pamięć przeznaczona na logi WAL (Write-Ahead Logging), kluczowe dla integralności transakcji
  • work_mem — pamięć operacyjna dla sortowań i hashowań, nadmierna wartość powoduje gwałtowny spadek wydajności przy dużej liczbie sesji
  • random_page_cost — koszt odczytu losowej strony dyskowej, który należy dostosować do charakterystyki nowego jądra
  • checkpoint_completion_target — parametr rozkładający obciążenie wejścia i wyjścia w czasie, łagodzący piki zapisów
  • huge_pages — konfiguracja wielkich stron pamięci, bezpośrednio wchodząca w interakcję z menedżerem VMA w Linux 7.0
  • Rozmiar i liczba segmentów WAL, determinujących częstotliwość synchronizacji danych na dysku fizycznym
  • default_statistics_target — precyzja statystyk dla planisty zapytań

To wymaga precyzyjnego podejścia.

Gdy testowałem różne konfiguracje baz danych na starszych wersjach jądra, zmiana random_page_cost z domyślnych 4.0 na 1.1 dla dysków NVMe drastycznie poprawiała przewidywalność zapytań. Na Linux 7.0 ta optymalizacja traci jednak na znaczeniu, ponieważ wąskie gardło przenosi się z samego dysku na warstwę block layer kernela. Ponadto logi WAL pełnią ważną funkcję w kontekście zarządzania danymi oraz zapewnienia ich integralności w przypadku awarii systemu (źródło: ProgramistaJava). W rezultacie jakakolwiek niestabilność w operacjach wejścia i wyjścia powodowana przez nowy kernel bezpośrednio zagraża stabilności całej bazy.

W jaki sposób optymalizacja indeksów łagodzi regresję wydajności?

Regresja przepustowości PostgreSQL na Linux 7.0 uderza najsilniej w operacje dyskowe, dlatego zmniejszenie liczby odczytów i zapisów na poziomie silnika bazy jest kluczową strategią przetrwania. Optymalizacja indeksów pozwala ograniczyć fizyczne operacje wejścia i wyjścia, które są drastycznie spowolnione przez błędy w nowym kernelu. Otóż według ekspertów, dopiero w dokumentacji wersji 11 znajdziemy informację, że możemy zmienić wartość statystyk również dla samego indeksu (źródło: Tomasz Gintowt, Medium). W poprzednich wersjach oficjalna dokumentacja nie wspominała o parametrze STATISTICS dla ALTER INDEX, choć polecenie było dostępne.

Zatem podniesienie dokładności statystyk indeksów zmusza planistę zapytań do wybierania bardziej precyzyjnych ścieżek wyszukiwania. Choć to nie naprawi błędów w menedżerze pamięci Linux 7.0, to jednakże znacznie zmniejsza ilość danych, jaką kernel musi przetworzyć podczas wykonywania zapytania. Innymi słowy, mniejszy ruch na dysku oznacza mniejsze narażenie na błędy algorytmów czyszczenia buforów.

W mojej praktyce analizy planów wykonania, często widziałem, jak brak statystyk dla indeksów zmuszał bazę do wykonywania pełnych skanów tabel. Na zdrowym kernelu to powolne, ale na zepsutym Linux 7.0 to po prostu zabójstwo dla wydajności. Co więcej, aby przekonać się, czy w tym właśnie tkwi problem zapytań, należy podejrzeć plan wykonania przy użyciu polecenia EXPLAIN (źródło: Bulldogjob). Wynikiem jest rezultat zwracany przez optimizer, który zajmuje się przygotowaniem możliwie optymalnego planu wykonania.

To ratuje sytuację.

Jakie są bezpieczne alternatywy przed wydaniem stabilnej łatki?

Dopóki deweloperzy jądra Linux nie naprawią fundamentalnego błędu w zarządzaniu pamięcią w wersji 7.0, jedynym pewnym rozwiązaniem dla środowisk produkcyjnych jest powrót do stabilnych wersji systemu. Inżynier AWS w swoim zgłoszeniu potwierdził, że przepustowość na starszych wersjach jądra pozostaje na oczekiwanym poziomie (źródło: Phoronix). Z tego powodu migracja na zweryfikowane wersje z serii 6.x jest najbezpieczniejszym krokiem.

Wobec tego, downgrade kernela jest zalecanym działaniem, ale wiąże się z pewnymi wyzwaniami operacyjnymi. Należy pamiętać o weryfikacji kompatybilności sterowników oraz bibliotek systemowych po zmianie wersji jądra. Choćby operacje na najnowszym sprzęcie mogą wymagać specyficznych modułów dostępnych wyłącznie w nowszych wydaniach. Mimo to utrata dostępu do nowych funkcji jest znacznie mniejszym problemem biznesowym niż spadek wydajności bazy danych o połowę.

Z kolei, jeśli zmiana wersji kernela nie jest możliwa, jedynym wyjściem jest agresywna optymalizacja całego stosu bazodanowego. Przede wszystkim minimalizacja operacji wejścia i wyjścia poprzez zwiększenie buforowania wewnątrz samego PostgreSQL. W rezultacie odciąża to w pewnym stopniu zepsuty subsystem wejścia i wyjścia w Linux 7.0. Tak czy inaczej, jest to rozwiązanie tymczasowe, wymagające ciągłego monitorowania wskaźników iostat i vmstat.

Podsumowanie

Problem z jądrem Linux 7.0 to poważne ostrzeżenie dla całego ekosystemu bazodanowego. Spadek wydajności o połowę udowadnia, jak bardzo zaawansowane bazy danych są zależne od stabilności niższych warstw systemu operacyjnego. Główne wnioski z tej sytuacji są następujące:

  • Linux 7.0 w obecnej fazie rozwoju powoduje katastrofalny regres przepustowości PostgreSQL, Nginx i Memcached z powodu błędów w menedżerze pamięci i operacjach wejścia i wyjścia.
  • Poprawka na poziomie kernela będzie trudna i czasochłonna, ponieważ wymaga przebudowy fundamentalnych mechanizmów współdzielonych przez wiele subsystemów.
  • Do czasu oficjalnego rozwiązania problemu, jedyną bezpieczną opcją dla serwerów produkcyjnych jest pozostanie na stabilnych wersjach jądra z serii 6.x.
  • Optymalizacja indeksów i parametrów takich jak shared_buffers może jedynie złagodzić skutki błędu, ale nie eliminuje jego przyczyny w kernelu.
  • Diagnostyka przy użyciu poleceń EXPLAIN, perf top i monitorowania logów WAL jest kluczowa do oceny wpływu regresji na konkretną infrastrukturę.

Jeśli Twoja infrastruktura bazuje na PostgreSQL i planujesz migrację na nowe wersje systemu operacyjnego, najpierw przetestuj wydajność w izolowanym środowisku. Sprawdź swoje konfiguracje za pomocą narzędzi diagnostycznych omówionych w tym artykule i monitoruj oficjalną listę dyskusyjną jądra Linux, aby nie przegapić krytycznych aktualizacji. Podziel się swoimi doświadczeniami z wydajnością baz danych w komentarzu poniżej — czy spotkałeś się już z podobnymi anomaliami na serwerach produkcyjnych?