Debian 12 na serwerze VPS z małą ilością pamięci RAM: Jak ograniczyć awarie MySQL spowodowane brakiem pamięci (OOM)

Ryzyko zatrzymania MySQL przez OOM Killera na serwerze VPS Debian 12 z małą ilością pamięci RAM można zmniejszyć, potwierdzając przyczynę problemu, budżetując pamięć dla wszystkich usług, ograniczając współbieżność bazy danych i udostępniając przestrzeń wymiany tam, gdzie pozwala na to serwer VPS. Sama mniejsza pula buforów InnoDB nie jest rozwiązaniem problemu. Ani przestrzeń wymiany, ani ustawienie ochrony przed OOM nie gwarantują, że przeciążenie będzie nadal działać.

Niniejszy przewodnik został opracowany 9 października 2026 roku z wykorzystaniem dokumentacji Debiana 12 „bookworm”, Linuksa 6.1 oraz Oracle MySQL 8.0/8.4. Poniższe ustawienia stanowią przykładowy punkt wyjścia, a nie wyniki testów porównawczych ani uniwersalną konfigurację. Przed wprowadzeniem zmian należy wykonać kopię zapasową bazy danych i konfiguracji oraz zaplanować ponowne uruchomienie bazy danych, gdy przestój jest akceptowalny.

1. Zidentyfikuj serwer przed skopiowaniem ustawień MySQL

Zweryfikowano: Pakiet default-mysql-server systemu Debian 12 zależy od MariaDB. Serwer VPS opisany jako „MySQL” może w rzeczywistości obsługiwać MariaDB, podczas gdy inny może mieć Oracle MySQL z oddzielnego repozytorium lub kontenera.

mysql --version
systemctl status mysql mariadb

Pierwsze polecenie identyfikuje klienta, ale nie identyfikuje jednoznacznie działającego serwera. Połącz się, używając konta administratora bazy danych i uruchom:

SELECT VERSION(), @@version_comment;

Użyj istniejącej metody uwierzytelniania; instalacje Debian MariaDB mogą zezwalać na administrację lokalną za pomocą sudo mysql. Zapisz wersję serwera i rzeczywistą nazwę usługi. W kolejnych poleceniach usługi użyj mysql.service; mariadb.servicew razie potrzeby. Nie dodawaj zmiennych przeznaczonych tylko dla Oracle do konfiguracji MariaDB.

Przykłady poleceń terminalowych umożliwiających sprawdzenie wersji klienta bazy danych i statusu usługi MySQL lub MariaDB.
Sprawdź nazwy klienta i usług, a następnie wyślij zapytanie do uruchomionego serwera, aby ustalić produkt i wersję.

2. Potwierdź, że wyłączenie było zdarzeniem OOM

Częste nieporozumienie: Każdy niewyjaśniony restart bazy danych to awaria pamięci (OOM). Błędy uwierzytelniania, wyczerpanie dysku, nieprawidłowa konfiguracja, awarie i restarty administratora również mogą zakłócić działanie usługi.

sudo journalctl -k -b
sudo journalctl -u mysql.service --since today
sudo journalctl -u systemd-oomd --since today

Poszukaj w czasie wystąpienia zdarzenia komunikatów jądra identyfikujących stan braku pamięci i zatrzymany proces, a następnie porównaj te komunikaty z dziennikiem usługi. Sprawdź również dziennik błędów bazy danych, jeśli pakiet zapisuje je do pliku, a nie do dziennika. Jeśli zdarzenie wystąpiło przed ponownym uruchomieniem, sprawdź poprzedni rozruch i journalctl -k -b -1dostępność zachowanych dzienników. Brak historycznych dzienników pozostawia przyczynę niepotwierdzoną.

Menedżer przestrzeni użytkownika może również kończyć obciążenia. Podręcznik systemu systemd-oomd Debiana opisuje interwencję opartą na obciążeniu pamięci przed zdarzeniem braku pamięci (OOM) jądra. Sprawdź, czy jest zainstalowany i aktywny, zamiast zakładać, że każdy serwer VPS z Debianem go używa.

Sprawdź również limity systemd:

systemctl show mysql.service \
  -p ControlGroup -p MemoryCurrent -p MemoryHigh \
  -p MemoryMax -p MemorySwapMax

W systemie cgroup v2 użyj zgłoszonej ścieżki ControlGroup, aby odczytać memory.events, memory.maxi memory.swap.maxponiżej /sys/fs/cgroup. Sprawdź również nadrzędne cgroup. Dokumentacja Linux cgroup v2 wyjaśnia te liczniki i limity. cgroup może wyczerpać dozwoloną pamięć, nawet gdy host ma wystarczającą pojemność. Licznik oom_killrejestruje zamykanie, ale musi być interpretowany z limitami i logami, aby ustalić przyczynę.

Przykłady poleceń terminalowych służących do sprawdzania dzienników usług jądra i bazy danych.
Przed przypisaniem przerwy w działaniu bazy danych do braku pamięci (OOM) należy sprawdzić dzienniki zdarzeń.

3. Zmierz cały VPS, a nie tylko pulę buforów

free -h
ps -eo pid,comm,rss --sort=-rss
vmstat 1

Zbieraj obserwacje podczas normalnego ruchu i zadań związanych z awariami. W [brakuje kontekstu - kontekstu - kontekstu] skup się na dostępnej pamięci, a nie tylko na wolnej kolumnie. W podręcznikufree Debiana dostępna pamięć jest opisana jako szacunkowa ilość pamięci, która może zostać wykorzystana bez wymiany. Wartości RSS w liście procesów są wyrażone w KiB; ich dodanie może spowodować podwójne naliczenie pamięci współdzielonej.

Zweryfikowano: MySQL alokuje pamięć poza pulą buforów InnoDB, w tym alokacje związane z połączeniami i zapytaniami. Dokumentacja MySQL dotycząca wykorzystania pamięci dokumentuje te komponenty. Formułę opartą na skonfigurowanych buforach należy traktować jako oszacowanie planistyczne, a nie jako precyzyjną górną granicę.

Działanie: Zarezerwuj pojemność dla jądra, webworkerów, monitorowania, kopii zapasowych i przejściowej pracy bazy danych. Znana rada, aby przeznaczyć większość pamięci RAM na InnoDB, nie sprawdza się bez dostosowania na współdzielonym serwerze VPS. Jeśli workworkery PHP lub zadanie kompilacji zużywają dostępny zapas mocy obliczeniowej, dostosuj lub przenieś to obciążenie zamiast wielokrotnie zmniejszać wydajność MySQL.

Przykłady poleceń terminalowych dotyczących dostępnej pamięci, RSS procesów i monitorowania vmstat.
Zmierz wszystkie konkurujące procesy i obciążenie pamięci podczas wykonywania reprezentatywnej czynności.

4. Dodaj pamięć wymiany jako bufor, a nie jako zamienną pamięć RAM

Zależne od kontekstu: Swap może absorbować chwilowe obciążenie pamięci anonimowej, ale ciągłe swapowanie może powodować, że zapytania będą zbyt wolne. Serwer VPS oparty na kontenerach może ograniczać swap, a usługa MemorySwapMaxmoże uniemożliwić jego użycie, nawet gdy host ma swap.

swapon --show
free -h
df -h /
findmnt -no FSTYPE /

Jeśli swap jest nieobecny, dostawca na to pozwala i masz wystarczającą ilość wolnego miejsca na dysku, poniższy kod tworzy plik wymiany o rozmiarze 1 GiB w odpowiednim lokalnym systemie plików, takim jak ext4. Nie uruchamiaj go, jeśli plik /swapfile już istnieje. Najpierw sprawdź wymagania specyficzne dla danego systemu plików; Btrfs wymaga odpowiedniej konfiguracji pliku wymiany bez kopiowania przy zapisie.

sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show

Dopiero po pomyślnym zakończeniu aktywacji dodaj ten wpis jeden raz do /etc/fstab:

/swapfile none swap sw 0 0

W podręczniku Debiana dotyczącym swapu opisano ograniczenia dotyczące pliku wymiany. Jeśli aktywacja jest blokowana przez środowisko VPS, należy zapytać dostawcę o obsługiwany plik wymiany lub zwiększyć pamięć planu; nie należy utrwalać nieudanej konfiguracji.

Nie kopiuj poprawki „ustaw swappiness na zero” jako zabezpieczenia przed brakiem pamięci (OOM). Dokumentacja maszyny wirtualnej jądra definiuje swappiness jako preferencję kosztu odzyskiwania. Nie tworzy ona pamięci ani nie nakłada limitu pamięci bazy danych. Pozostaw ją początkowo niezmienioną i zmierz zachowanie.

Przykłady poleceń terminala służących do sprawdzania aktywnej wymiany, przestrzeni dyskowej i typu głównego systemu plików.
Przed podjęciem decyzji, czy plik wymiany jest odpowiedni, należy sprawdzić stan wymiany i systemu plików.

5. Ustal skromną bazę danych bazową

Dla przykładu rozważmy serwer VPS o pojemności 1 GiB z niewielkim obciążeniem InnoDB i kilkoma pracownikami aplikacji. Poniższe wartości stanowią propozycję do oceny, a nie dowód na to, że to obciążenie jest odpowiednie:

[mysqld]
innodb_buffer_pool_size=128M
max_connections=20
tmp_table_size=16M
max_heap_table_size=16M

Umieść opcje serwera w pliku konfiguracyjnym faktycznie dołączonym podczas instalacji. Pakiet Oracle MySQL może zawierać /etc/mysql/mysql.conf.d/; Debian MariaDB często używa . Zweryfikuj istniejące dyrektywy include i zachowaj kopię zapasową. Dokumentacja pliku opcji/etc/mysql/mariadb.conf.d/ MySQL wyjaśnia grupy opcji serwera i obsługę plików.

Pula buforów o pojemności 128 MiB ogranicza pamięć podręczną, a nie całkowitą pamięć bazy danych. Limit połączeń wynoszący 20 może być zbyt restrykcyjny, jeśli kilka instancji aplikacji utrzymuje pulę. Z drugiej strony, 20 jednoczesnych, intensywnych zapytań może nadal przeciążać serwer VPS. Utrzymuj pulę aplikacji poniżej zamierzonego limitu serwera, z zachowaniem możliwości dostępu administracyjnego, i obserwuj odrzucone połączenia.

Wymienione powyżej zmienne wspólne pojawiają się również w dokumentacji zmiennych systemowych MariaDB , ale zachowanie tabel tymczasowych różni się w zależności od produktu i wersji. Unikaj zwiększania globalnych buforów sortowania, dołączania i odczytu jako ogólnej poprawki wydajności na ograniczonej maszynie.

Terminal wyświetlający przykładową konfigurację mysqld z pulą buforów 128 MB i limitem 20 połączeń.
Te ustawienia małego serwera stanowią punkt wyjścia do oceny, a nie ograniczenie całkowitej pamięci bazy danych.

6. Kontroluj tabele tymczasowe i współbieżność

Powszechne nieporozumienie: Ustawienie tmp_table_size=16Mlimitu pamięci zapytań na poziomie 16 MiB nie powoduje tego. Wiele sesji, wiele tabel tymczasowych i inne alokacje wykonawcze mogą współistnieć.

W przypadku Oracle MySQL 8.4 dodatkowym ilustrującym punktem wyjścia jest:

temptable_max_ram=64M
temptable_max_mmap=0

Dodaj je do istniejącej [mysqld]grupy dopiero po potwierdzeniu obsługi produktu. Regulują one próg współdzielonej pamięci RAM silnika TempTable i wykorzystanie plików tymczasowych mapowanych w pamięci. Nie ograniczają one całego procesu MySQL ani wszystkich alokacji lokalnych wątków. Niższe progi mogą powodować przeniesienie większej ilości zadań na dysk.

Dokumentacja tabel tymczasowych MySQL 8.4 wyjaśnia te ograniczenia. MySQL 8.0 ma zachowanie zależne od wersji: temptable_max_mmappojawił się w wersji 8.0.23 i tmp_table_sizestał się indywidualnym limitem dla tabel tymczasowych w wersji 8.0.28. Przed zastosowaniem tych samych ustawień zapoznaj się z dokumentacją MySQL 8.0 . Nie kopiuj tych opcji specyficznych dla Oracle do MariaDB.

Działanie: Ogranicz nakładające się zapytania do raportów, procesy robocze w tle oraz zadania tworzenia kopii zapasowych lub importu. Przejrzyj plany zapytań i indeksy, gdy dana operacja generuje obciążenie. Przeniesienie ponadwymiarowych zadań poza szczytowy ruch może pomóc; jeśli normalne, współbieżne zapotrzebowanie nadal przekracza przepustowość, odpowiednim kolejnym krokiem będzie dodatkowa pamięć RAM lub oddzielenie bazy danych.

Terminal wyświetlający przykładowe ustawienia tabeli tymczasowej Oracle MySQL dla 64 MB pamięci RAM i wyłączonej alokacji mapowanej na pamięć.
Zastosuj te ustawienia TempTable tylko do obsługiwanej wersji Oracle MySQL, postępując zgodnie ze wskazówkami dotyczącymi danej wersji.

7. Sprawdź zmiany i uruchom ponownie system rozmyślnie

W przypadku wersji Oracle MySQL obsługujących tę opcję należy sprawdzić konfigurację przed ponownym uruchomieniem:

sudo mysqld --validate-config

Użyj tej samej ścieżki do pliku defaults i odpowiednich argumentów startowych, co usługa, jeśli nie korzysta z wykrywania konfiguracji domyślnej. W dokumentacji walidacji MySQL zaznaczono, że walidacja nie inicjuje każdego podsystemu. Jej zaliczenie nie jest testem obciążenia i wydajności. Nie zakładaj, że MariaDB obsługuje tę opcję Oracle.

Uruchom ponownie usługę w zaplanowanym czasie, a następnie sprawdź uruchomienie i zapytaj o wartości efektywne:

sudo systemctl restart mysql.service
systemctl status mysql.service
sudo journalctl -u mysql.service --since today
SHOW GLOBAL VARIABLES WHERE Variable_name IN
('innodb_buffer_pool_size','max_connections','tmp_table_size',
 'max_heap_table_size','temptable_max_ram','temptable_max_mmap');
SHOW GLOBAL STATUS WHERE Variable_name IN
('Threads_connected','Threads_running','Max_used_connections');

Nieobsługiwane zmienne nie pojawią się w wynikach. Sprawdź zamierzone ustawienia, zamiast zakładać, że nowy plik ma pierwszeństwo. Jeśli uruchomienie nie powiedzie się z powodu wprowadzonej zmiany, przywróć zapisaną konfigurację lub usuń tylko nową nadpisaną konfigurację, a następnie uruchom ponownie. Zachowaj szczegóły błędu w celu diagnostyki.

Terminal pokazujący przykłady walidacji Oracle MySQL, ponownego uruchomienia usługi i polecenia service-status.
Przed planowanym ponownym uruchomieniem sprawdź poprawność obsługiwanej konfiguracji Oracle MySQL; powodzenie uruchomienia nie oznacza, że ​​ilość pamięci RAM jest wystarczająca.

8. Zdefiniuj sukces w warunkach obciążenia reprezentacyjnego

free -h
vmstat 1
cat /proc/pressure/memory

Porównaj ten sam ruch i zaplanowane zadania przed i po zmianach. Śledź nowe zdarzenia OOM, restarty bazy danych, dostępną pamięć, odrzucenia połączeń, aktywność wymiany i opóźnienia zapytań. W systemie vmstat, ciągłe operacje wymiany (swap-in/swap-out) wymagają analizy. Podręcznik Debian vmstat wyjaśnia, że ​​pierwszy raport uśrednia aktywność od momentu uruchomienia; kolejne raporty służą do określania bieżących wskaźników.

Referencje dotyczące PSI w jądrze opisują pomiary ciśnienia i zastoju. Wydłużenie czasu zastoju pamięci może ujawnić problem jeszcze przed kolejnym wyłączeniem. Dziesięciominutowy okres bezczynności systemu nie oznacza, że ​​kolejna kopia zapasowa lub wzrost ruchu jest bezpieczny.

Terminal pokazujący przykłady poleceń kontroli dostępnej pamięci, vmstat i obciążenia pamięci.
Monitoruj pamięć, aktywność wymiany i obciążenie, a także opóźnienie zapytań po wprowadzeniu zmian.

Błędne przekonania, które mogą pogorszyć problem

RoszczenieCo zamiast tego zrobić
Zabezpiecz mysqld przed brakiem pamięci (OOM), a braki znikną.Zmniejsz popyt lub zwiększ wydajność; zmiana wyboru ofiary może spowodować przeniesienie awarii na inny proces.
Ustaw małą wartość MemoryMax, aby dopasować MySQL.Najpierw sprawdź istniejące limity i dostosuj obciążenie; sztywny limit może spowodować brak zasobów (OOM) w usłudze.
Po automatycznym ponownym uruchomieniu baza danych będzie stabilna.Użyj zachowania ponownego uruchomienia w celu odzyskania, jednocześnie mierząc, czy pierwotne ciśnienie pozostało.
Wyłącz ustawienia trwałości, aby zaoszczędzić pamięć RAM.Oddziel wymagania dotyczące odzyskiwania i trwałości od dostrajania pamięci.

Podręcznik systemu Debian do kontroli zasobów systemd wyjaśnia, że MemoryMax​​można wywołać obsługę braku pamięci (OOM) w jednostce. Nie należy bezmyślnie usuwać limitów dostawcy lub kontenera. Aplikacja potrzebuje budżetu pamięci, który mieści się w tych limitach, lub limity wymagają autoryzowanej zmiany pojemności.

Nie ma zweryfikowanego minimalnego rozmiaru VPS, który gwarantuje uruchomienie tego konkretnego obciążenia. Jeśli użyteczna przepustowość wymaga ciągłej wymiany, jeśli zaplanowane zadania nadal powodują zamykanie lub jeśli mniejsze pamięci podręczne powodują nieakceptowalne opóźnienia, przestań traktować konfigurację jako substytut pojemności. Zwiększ pamięć RAM, zmniejsz współbieżność aplikacji lub przenieś bazę danych do osobnej usługi.

Zostaw komentarz

Debian 12 na serwerze VPS z małą ilością pamięci RAM: Jak ograniczyć awarie MySQL spowodowane brakiem pamięci (OOM)

Debian 12 na serwerze VPS z małą ilością pamięci RAM: Jak ograniczyć awarie MySQL spowodowane brakiem pamięci (OOM)

Diagnozuj błędy OOM MySQL w systemie Debian 12, sprawdzaj limity pamięci VPS, konfiguruj wymianę oraz dostosowuj pamięć i współbieżność bazy danych, nie obiecując przy tym uniwersalnego rozwiązania.

How to Build a Debian Desktop as an OSTree-Based Immutable System

How to Build a Debian Desktop as an OSTree-Based Immutable System

Learn how to create and test a Debian-derived OSTree desktop in a VM, including system-tree preparation, boot integration, deployment checks, and rollback.

How to Mount a Remote SSHFS Directory Automatically at Boot in Debian

How to Mount a Remote SSHFS Directory Automatically at Boot in Debian

Configure an SSHFS boot mount in Debian with SSH keys, fstab, and systemd automount. Includes reboot checks, permissions, timeouts, and troubleshooting.

Październik 2026: jesienna lista przeglądów domu w Warszawie i na Mazowszu przed sezonem grzewczym

Październik 2026: jesienna lista przeglądów domu w Warszawie i na Mazowszu przed sezonem grzewczym

Praktyczna lista na październik 2026 dla Warszawy i Mazowsza: ogrzewanie, przymrozki, komin i kocioł, rynny oraz uszczelki okienne. Z podziałem obowiązków właściciela i najemcy.

Co sadzić w Warszawie w październiku 2026? Warzywa, zioła i kwiaty na Mazowszu

Co sadzić w Warszawie w październiku 2026? Warzywa, zioła i kwiaty na Mazowszu

Sprawdź, co siać i sadzić w Warszawie w październiku 2026: czosnek ozimy, cebule kwiatowe, siew ozimy warzyw, zioła na parapet i tygodniowa checklista.

Trendy w podcastingu, które musisz znać w 2026 roku: plan dla początkujących

Trendy w podcastingu, które musisz znać w 2026 roku: plan dla początkujących

Dopiero zaczynasz przygodę z podcastingiem? Poznaj trendy na rok 2026, które kształtują wideo, wyszukiwanie, transkrypcje, sztuczną inteligencję, analitykę, monetyzację i praktyczny plan wdrożenia.

Mistrzowska klasa UGC: Twórz treści tworzone przez użytkowników, które wzbudzają zaufanie i skłaniają do działania

Mistrzowska klasa UGC: Twórz treści tworzone przez użytkowników, które wzbudzają zaufanie i skłaniają do działania

Praktyczny kurs mistrzowski dotyczący UGC, w którym dowiesz się, jak pozyskiwać, uzyskiwać pozwolenia, przygotowywać briefingi, publikować i oceniać treści tworzone przez klientów i twórców, nie tracąc przy tym autentyczności.

Dlaczego budowanie społeczności jest nowym marketingiem — i kiedy nim nie jest

Dlaczego budowanie społeczności jest nowym marketingiem — i kiedy nim nie jest

Budowanie społeczności może pogłębić zaufanie, retencję, informację zwrotną i zaangażowanie, ale nie zastąpi każdego kanału marketingowego. Porównaj kompromisy i wybierz odpowiedni model.

Poruszanie się po zmianach algorytmów mediów społecznościowych w 2026 roku: co jest potwierdzone, kontekstowe i wciąż nieznane

Poruszanie się po zmianach algorytmów mediów społecznościowych w 2026 roku: co jest potwierdzone, kontekstowe i wciąż nieznane

Dowiedz się, co główne platformy społecznościowe faktycznie potwierdziły na temat zmian w rankingu w 2026 r., co zależy od kontekstu i jak się dostosować, nie ulegając mitom.

Authentic Storytelling in Brand Marketing: How to Build Trust Without Sounding Scripted

Authentic Storytelling in Brand Marketing: How to Build Trust Without Sounding Scripted

Learn how to make brand storytelling feel credible, human, and specific—using proof, real tension, ethical customer stories, and a practical authenticity check.