Czy serwer VPS potrzebuje swap? Jak dobrać rozmiar
Większość obrazów chmurowych nie posiada pliku swap. Sprawdź, kiedy warto go dodać, jak obliczyć optymalny rozmiar, co zmienia parametr vm.swappiness oraz kiedy lepiej wybrać zram.
Czy VPS wymaga partycji swap?
Większość obrazów systemowych w chmurze jest dostarczana bez skonfigurowanej przestrzeni swap. W przypadku małego serwera VPS odpowiedź zazwyczaj brzmi: tak, należy dodać plik swap. Swap nie sprawi, że serwer z 1 GB pamięci RAM zacznie zachowywać się jak maszyna z 2 GB. Zapewnia on jednak jądru systemu miejsce na przeniesienie nieaktywnych stron pamięci anonimowej. Dzięki temu pamięć podręczna stron (page cache) pozostaje użyteczna, a mechanizm OOM killer (procedura jądra wybierająca i kończąca proces w celu zwolnienia pamięci) staje się ostatecznością, a nie pierwszym wyborem.
W skrócie: na serwerze obsługującym kilka długo działających usług, niewielki plik swap jest wart zajętego miejsca na dysku. Na maszynie, gdzie jeden proces regularnie próbuje zaalokować więcej pamięci niż posiada cały system, swap nie pomoże; sprawi jedynie, że awaria będzie wolniejsza i trudniejsza do zdiagnozowania. Dalsza część tego przewodnika wyjaśnia, jak rozróżnić te dwa przypadki oraz omawia dwa rodzaje kosztów, które występują tylko w środowisku VPS.
Każde z poniższych poleceń wymaga uprawnień root na własnym serwerze, dlatego należy wykonywać je bezpośrednio w docelowym systemie, zamiast kopiować wyniki z cudzych maszyn.
Czym w rzeczywistości jest swap i do czego nie służy
Pamięć w systemie Linux występuje w dwóch rodzajach. Strony powiązane z plikami (file backed pages) to kopie danych istniejących już na dysku: programów oraz każdego pliku, który był ostatnio odczytywany. Zbiór ten tworzy pamięć podręczną stron (page cache). Strony anonimowe (anonymous pages) to pamięć, która nie posiada odpowiednika w pliku: sterta (heap) i stos (stack), a także większość zasobów alokowanych przez bazy danych w czasie wykonywania.
Gdy pamięci zaczyna brakować, jądro musi odzyskać strony. Czysta strona powiązana z plikiem jest łatwa do odzyskania, ponieważ jej kopia na dysku nadal istnieje i może zostać wczytana ponownie w późniejszym czasie. W przypadku strony anonimowej jest to niemożliwe, gdyż jej jedyna kopia znajduje się w pamięci RAM. Bez partycji swap jądro ma tylko dwa wyjścia w odniesieniu do pamięci anonimowej: zachować ją lub zakończyć proces, do którego należy.
Serwer bez swapu nadal wykonuje stronicowanie. Wykonuje je jednak na niewłaściwych obszarach pamięci. Pod obciążeniem jądro zmniejsza rozmiar pamięci podręcznej stron, usuwając strony plików, które za chwilę będą ponownie potrzebne, w tym kod wykonywalny uruchomionych programów. Strony te wracają do pamięci w wyniku poważnych błędów strony (major page faults). W kolumnie bi narzędzia vmstat widoczne są operacje odczytu z dysku, a licznik pgmajfault w /proc/vmstat rośnie, podczas gdy si oraz so przez cały czas pozostają na poziomie zero. System wpada w stan thrashingu, a liczniki swapu nie wykazują żadnej aktywności.
Swap nie zwiększa pojemności pamięci. Jeśli zestaw roboczy, czyli strony faktycznie wykorzystywane, jest większy niż dostępna pamięć RAM, swap zamienia błąd braku pamięci (OOM kill) na bardzo powolne działanie serwera. Czasami jest to pożądany kompromis, ponieważ na wolno działający serwer można się zalogować i przeprowadzić naprawę, podczas gdy w przypadku ubitej bazy danych jest to niemożliwe. Czasami jednak jest to rozwiązanie gorsze, ponieważ wolny serwer nie przechodzi testów sprawności (health checks), utrzymując jednocześnie otwarte wszystkie połączenia. Decyzję o dodaniu swapu należy podjąć przed wystąpieniem problemów.
Dlaczego obrazy chmurowe są dostarczane bez partycji swap?
Jest to świadomy wybór. Jeden obraz musi uruchamiać się na każdym planie oferowanym przez dostawcę, więc stała partycja swap marnowałaby miejsce na dysku w małych planach i byłaby bezużyteczna w dużych. Szybkość działania swap zależy również od wydajności pamięci masowej przypisanej do instancji, czego obraz nie jest w stanie przewidzieć. Twórcy obrazów optymalizują je pod kątem przewidywalnego zachowania, ponieważ proces, który natychmiast kończy działanie, jest łatwiejszy do zdiagnozowania w całej flocie serwerów niż maszyna, która pozostaje aktywna, ale odpowiada na każde żądanie z kilkusekundowym opóźnieniem.
Te powody dotyczą maszyn tymczasowych. VPS, który jest utrzymywany długoterminowo, to inna kwestia. W takim przypadku naprawia się system zamiast go wymieniać, więc zazwyczaj lepiej jest zaakceptować kilka sekund opóźnienia wynikającego z użycia pamięci wirtualnej niż dopuścić do przerwania działania usługi. Brak partycji swap należy traktować jako ustawienie domyślne przygotowane pod potrzeby innego użytkownika.
Plik wymiany czy partycja wymiany na VPS?
Należy użyć pliku. Partycja wymusza zmianę rozmiaru aktywnego systemu plików root na dysku, który został już podzielony na partycje, co stanowi realne ryzyko bez żadnych korzyści. Plik można utworzyć i usunąć za pomocą standardowych poleceń, a jego rozmiar można zmienić w późniejszym czasie bez ingerencji w tablicę partycji.
Szybkość nie jest czynnikiem decydującym. W czasie swapon jądro odczytuje mapę ekstentów pliku tylko raz, a następnie przesyła operacje I/O bezpośrednio do urządzenia blokowego, więc system plików nie znajduje się na ścieżce zapisu i odczytu każdej strony. Na tym samym dysku plik wymiany i partycja wymiany działają z taką samą wydajnością.
Warto znać dwa ograniczenia. Nie należy umieszczać pliku wymiany na sieciowym systemie plików, takim jak NFS (network file system). W przypadku btrfs dla pliku musi być wyłączona funkcja copy on write oraz kompresja, dlatego btrfs dostarcza własne narzędzie pomocnicze do jego tworzenia.
Jak dodać plik wymiany (swap) w systemie Ubuntu lub Debian
Przed wprowadzeniem jakichkolwiek zmian sprawdź bieżącą konfigurację.
swapon --show
free -h
findmnt -no FSTYPE /Pusty wynik polecenia swapon --show oznacza brak skonfigurowanego obszaru wymiany, co jest typowe dla świeżych obrazów chmurowych. Polecenie findmnt wyświetla typ głównego systemu plików, co determinuje sposób tworzenia pliku. W przypadku ext4, stosowanego w większości obrazów chmurowych, użycie fallocate jest bezpieczne.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfilePolecenie chmod poprzedza mkswap celowo. Pominięcie tego kroku spowoduje wyświetlenie przez mkswap komunikatu: mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. Plik wymiany z uprawnieniami do odczytu dla wszystkich użytkowników udostępnia każdemu użytkownikowi w systemie pamięć, do której inne procesy zrzuciły dane. Poprawne wykonanie mkswap potwierdza rozmiar pliku, wyświetlając wiersz podobny do Setting up swapspace version 1, size = 2 GiB (2147479552 bytes).
W systemach xfs lub btrfs ostatnie polecenie może zakończyć się błędem swapon: /swapfile: swapon failed: Invalid argument. W systemie XFS wynika to z faktu, że fallocate pozostawia niezapisane fragmenty (extents), dlatego należy w tym przypadku zapisać bajty bezpośrednio.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressW systemie btrfs przyczyną jest mechanizm copy-on-write, a bieżące polecenie btrfs-progs automatycznie ustawia odpowiednie flagi.
sudo btrfs filesystem mkswapfile --size 2g /swapfileNiezależnie od metody, zakończ operację za pomocą chmod 600, mkswap (jeśli dotyczy) oraz swapon, a następnie zweryfikuj wynik.
swapon --show
free -hPolecenie swapon --show powinno wyświetlić /swapfile z typem file oraz zadeklarowanym rozmiarem, a free -h powinno pokazać wiersz Swap z niemal zerowym wykorzystaniem. Zerowe wykorzystanie swapu w świeżej konfiguracji jest prawidłowe. Jądro przenosi strony do pliku wymiany tylko wtedy, gdy jest to konieczne.
Skonfiguruj trwałość ustawień po restarcie, a następnie natychmiast przetestuj wpis.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --showPolecenie swapon -a odczytuje plik /etc/fstab, więc błędny wpis zostanie wykryty natychmiast. Literówka, której nie przetestujesz, ujawni się podczas nieplanowanego restartu, gdy system uruchomi się bez swapu, który miał być dostępny.
Aby usunąć swap w przyszłości, wykonaj sudo swapoff /swapfile, usuń wpis z pliku fstab, a następnie sudo rm /swapfile. Polecenie swapoff musi najpierw wczytać każdą zrzuconą stronę z powrotem do pamięci RAM, więc na mocno obciążonym serwerze może zakończyć się błędem swapoff: /swapfile: swapoff failed: Cannot allocate memory. Zwolnij część pamięci i spróbuj ponownie.
Jaki powinien być rozmiar pliku wymiany (swap)?
Zadanie polega na przechowywaniu nieaktywnych stron anonimowych, dlatego istotny jest rozmiar pamięci, która jest faktycznie bezczynna, a nie całkowita ilość pamięci RAM przydzielona do planu. Ilość bezczynnej pamięci nie rośnie proporcjonalnie do rozmiaru planu, więc mnożnik maleje wraz ze wzrostem planów. Jest to zasada stosowana w tym przewodniku.
The data behind this chart
[
{
"label": "1 GB plan",
"swap_gb": 2,
"swap_x_ram": 2
},
{
"label": "2 GB plan",
"swap_gb": 2,
"swap_x_ram": 1
},
{
"label": "4 GB plan",
"swap_gb": 2,
"swap_x_ram": 0.5
},
{
"label": "8 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.5
},
{
"label": "16 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.25
}
]W przypadku najmniejszego planu jest to 2 GB przestrzeni swap, co stanowi 2 krotność pamięci RAM, ponieważ serwer z 1 GB pamięci ma tak mały margines bezpieczeństwa, że pojedynczy skok obciążenia aktywuje mechanizm OOM killer. Na górnym końcu skali rozmiar pliku kończy się na 4 GB, czyli 0.25 krotności pamięci RAM, ponieważ stronicowanie tak dużej ilości danych na współdzielonej pamięci masowej trwa na tyle długo, że serwer w tym czasie jest praktycznie niedostępny. Wartości te można zmniejszyć, jeśli limit miejsca na dysku jest ograniczony, ponieważ plik zajmuje realną przestrzeń dyskową.
Jedynym klasycznym powodem ustawiania rozmiaru swap równego lub większego od pamięci RAM jest hibernacja, która zapisuje cały obraz pamięci do pliku wymiany. Serwer VPS nie korzysta z hibernacji, więc ta zasada nie ma w tym przypadku zastosowania.
Co tak naprawdę zmienia parametr vm.swappiness?
vm.swappiness nie jest wartością procentową pamięci RAM ani progiem. Określa on względny koszt, jaki jądro przypisuje odzyskiwaniu stron anonimowych w porównaniu ze stronami plików. Wartość domyślna to 60. Obniżenie jej sprawia, że jądro preferuje usuwanie pamięci podręcznej plików (page cache). Podniesienie jej powoduje, że jądro chętniej przenosi pamięć anonimową do przestrzeni wymiany (swap).
Jest to kompromis działający w obie strony. Przy vm.swappiness = 10 baza danych utrzymuje więcej swoich alokacji w pamięci operacyjnej, płacąc za to koniecznością ponownego odczytu plików, które właśnie usunięto z pamięci podręcznej. Na serwerze, którego głównym zadaniem jest serwowanie plików, jest to podejście błędne, ponieważ to właśnie page cache wykonuje tam użyteczną pracę.
Ustawienie wartości 0 nie wyłącza mechanizmu swap. Nakazuje ono jądru unikanie odzyskiwania pamięci anonimowej, dopóki system nie znajdzie się niemal całkowicie bez wolnej pamięci, co przyspiesza działanie mechanizmu OOM killer, zamiast je opóźniać. Jeśli chcesz całkowicie zrezygnować ze swapu, usuń plik wymiany.
sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappinessSama komenda sysctl -w działa tylko do następnego restartu, po czym przestaje obowiązywać, dlatego należy zapisać plik w /etc/sysctl.d/. Jądra od wersji 5.8 akceptują wartości od 0 do 200. Wartości powyżej 100 mają sens tylko wtedy, gdy swap jest tak samo szybki jak pamięć RAM, co oznacza użycie zram.
zram: swap wykorzystujący procesor zamiast dysku
zram to skompresowane urządzenie blokowe działające w pamięci RAM. Wykorzystanie go jako swap sprawia, że strony pamięci, które trafiłyby na dysk, są kompresowane i pozostają w pamięci operacyjnej. Eliminuje to operacje wejścia/wyjścia na dysku i nie zużywa limitu zapisu na nośniku. Kosztem jest czas procesora potrzebny na każdą operację zapisu i odczytu strony oraz pamięć RAM zajęta przez skompresowane dane, która nie jest już dostępna dla aplikacji.
Współczynniki kompresji od 2:1 do 3:1 to wartości typowo podawane dla stron anonimowych. Własny wynik można sprawdzić za pomocą zramctl w kolumnach DATA oraz COMPR. Należy dokonywać pomiarów zamiast opierać się na wartościach teoretycznych, ponieważ niektóre obciążenia zawierają dane, które niemal nie poddają się kompresji.
sudo apt install zram-toolsNależy ustawić ALGO=zstd oraz PERCENT=25 w pliku /etc/default/zramswap, a następnie zrestartować usługę i sprawdzić wynik.
sudo systemctl restart zramswap
zramctl
swapon --showPERCENT stanowi udział w całkowitej pamięci RAM, więc wartość 25 na maszynie z 4 GB pamięci zarezerwuje do 1 GB na skompresowane strony. Warto zacząć od niskiej wartości i zwiększać ją tylko wtedy, gdy zramctl wykazuje zapełnianie urządzenia. Ustawienie PRIORITY w tym samym pliku decyduje, który swap jądro wypełnia w pierwszej kolejności: wyższa wartość wygrywa. Plik wymiany dodany za pomocą standardowego swapon otrzymuje ujemny priorytet, dzięki czemu zram jest używany jako pierwszy, a plik przejmuje nadmiar danych. swapon --show wyświetla oba parametry w kolumnie PRIO. W dystrybucjach używających systemd-zram-generator zamiast zram-tools, te same ustawienia znajdują się w /etc/systemd/zram-generator.conf.
zram sprawdza się w systemach z zapasem mocy procesora i ograniczoną ilością miejsca na dysku. Jest to niewłaściwy wybór, jeśli zasoby procesora są już wyczerpane, ponieważ operacje kompresji konkurują z aplikacjami o ten sam czas obliczeniowy.
Dwie pułapki związane ze swapem, które dotyczą tylko VPS
Pierwszą pułapką jest dysk. Plik swap o rozmiarze 2 GB zajmuje 2 GB przestrzeni dyskowej w ramach posiadanego planu w momencie jego utworzenia, ponieważ miejsce to musi zostać zarezerwowane z wyprzedzeniem. df -h / zmniejsza się natychmiast o pełną wartość i nie odzyskuje miejsca, dopóki plik nie zostanie usunięty. W przypadku małych planów jest to zauważalna część zasobów, a zapełnienie głównego systemu plików powoduje znacznie więcej awarii niż swap kiedykolwiek naprawił. Plik ten jest również uwzględniany w danych wyjściowych du, o czym warto pamiętać podczas poszukiwania wolnego miejsca oraz gdy df i du wskazują różne wartości zajętości dysku.
Drugą pułapką jest opóźnienie. Operacje wejścia/wyjścia (I/O) swapu trafiają do pamięci masowej współdzielonej przez hosta z innymi gośćmi, a ich obciążenia nie można monitorować z wnętrza własnej instancji. Widoczny jest jedynie efekt: operacja wczytywania strony, która zazwyczaj jest szybka, czasami trwa znacznie dłużej, a proces oczekujący na nią zostaje wstrzymany do momentu jej zakończenia. Jest to ta sama logika, co w przypadku CPU steal time na współdzielonym hoście, zastosowana jednak do kolejki dyskowej zamiast kolejki procesów gotowych do wykonania. Należy mierzyć to samodzielnie, ponieważ wszelkie opublikowane wartości opóźnień opisują sytuację sąsiadów kogoś innego.
Jak rozpoznać, że swap negatywnie wpływa na wydajność?
Wykorzystanie partycji swap nie stanowi problemu. Problemem jest ruch związany z wymianą stron. Serwer, który przechowuje kilkaset megabajtów w swapie bez aktywności stronicowania, po prostu przeniósł dane, do których nikt nie odwoływał się od godzin – jest to pożądany stan.
Należy monitorować wskaźniki szybkości, a nie wartości całkowite.
vmstat 1 5si oraz so oznaczają liczbę kibibajtów na sekundę zapisywanych do swapu i odczytywanych z niego. W poprawnie działającym systemie wartości te powinny oscylować wokół zera, niezależnie od tego, co wskazuje kolumna swpd. Utrzymujący się wysoki poziom so przy jednoczesnym wzroście si oznacza, że strony są zapisywane i natychmiast odczytywane, co świadczy o zjawisku thrashingu.
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 3 1048572 38210 4096 61440 912 1180 2210 1290 1402 2890 9 7 12 72 0Powyższy przykład przedstawia system w stanie awaryjnym, a najczytelniejszy sygnał nie znajduje się w kolumnach dotyczących swapu. Jest to wa na poziomie 72, co oznacza, że procesor spędził większość czasu w stanie oczekiwania na operacje I/O, oraz b na poziomie 3, co oznacza, że trzy procesy są zablokowane.
PSI (pressure stall information) pozwala na bardziej bezpośrednią ocenę sytuacji.
cat /proc/pressure/memorysome avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210some avg10=8.42 oznacza, że w ciągu ostatnich 10 sekund co najmniej jedno zadanie było wstrzymane z powodu oczekiwania na pamięć przez 8.42 procent czasu. full zlicza czas, w którym wszystkie zadania niebędące w stanie bezczynności były wstrzymane, więc utrzymująca się wysoka wartość full oznacza mierzalny spadek wydajności, a nie tylko ostrzeżenie. Jeśli plik nie istnieje, oznacza to, że jądro ma domyślnie wyłączone PSI i wymaga dodania psi=1 do linii poleceń jądra.
Aby sprawdzić, które procesy przechowują strony w swapie:
sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | headAby sprawdzić, czy mechanizm OOM killer podjął już interwencję:
sudo journalctl -k --grep "Out of memory"Zdarzenie jest zapisywane jako Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0, a dziennik usługi w tej samej sekundzie zawiera wpis Main process exited, code=killed, status=9/KILL. Jeśli takie komunikaty pojawiły się na serwerze bez skonfigurowanego swapu, najtańszym rozwiązaniem jest utworzenie pliku wymiany.
Kiedy swap jest niewłaściwym rozwiązaniem
Swap pozwala zyskać czas w przypadku tymczasowego lub nieistotnego obciążenia pamięci. Nie rozwiązuje on problemu procesu, który rośnie aż do momentu zakończenia, a dodatkowo utrudnia monitorowanie takiej awarii, ponieważ maszyna traci dodatkowe minuty na stronicowanie zamiast szybko przerwać działanie i zrestartować usługę.
Zamiast tego należy nałożyć limity na proces. Usługa systemd akceptuje MemoryMax= oraz MemorySwapMax= w pliku typu drop-in, co stanowi sposób na ograniczenie pamięci i procesora dla usługi w systemd bez modyfikowania samej aplikacji. Kontenery posiadają analogiczne mechanizmy kontroli na wyższym poziomie, a ich konfiguracja pozwala zapobiec sytuacji, w której jedna usługa Compose zużywa zasoby całego serwera. Oba rozwiązania zapewniają zakończenie procesu z czytelnym komunikatem w dzienniku, zamiast pozwalać jądru systemu na wybór ofiary na podstawie punktacji.
Działania te należy podjąć, gdy serwer jest nowy i nieobciążony. Utworzenie pliku swap oraz ustawienie limitu pamięci zajmuje kilka minut i powinno stanowić część prac wykonywanych w trakcie pierwszych dziesięciu minut na nowym VPS.
FAQ
Czy dodanie swap sprawi, że VPS z 1 GB RAM będzie działał jak VPS z 2 GB RAM?
Nie. Swap jest znacznie wolniejszy od pamięci RAM, a jądro przenosi tam tylko te strony pamięci, które uznaje za nieaktywne. Swap zapewnia jedynie margines bezpieczeństwa na nagłe skoki obciążenia oraz miejsce na dane, które zostały zaalokowane, ale nie są używane. Jeśli obciążenie aktywnie odczytuje i zapisuje więcej pamięci, niż posiada maszyna, swap zamienia błąd braku pamięci (OOM) w ciągłe stronicowanie. Serwer pozostaje uruchomiony, ale odpowiada zbyt wolno, by nadawał się do użytku. W takim przypadku należy zwiększyć ilość pamięci RAM lub ograniczyć proces, który zużywa jej zbyt wiele.
Ile swap potrzebuje VPS z 1 GB lub 2 GB RAM?
2 GB wystarcza dla obu tych konfiguracji i nie ma potrzeby skalowania tej wartości wraz z ilością pamięci RAM. Swap przechowuje nieaktywne strony anonimowe, a ilość faktycznie nieaktywnej pamięci na serwerze nie rośnie proporcjonalnie do całkowitej ilości RAM. Stara zasada mówiąca o dwukrotności pamięci RAM wywodzi się z hibernacji, która zapisuje cały obraz pamięci na dysk, a VPS nigdy nie przechodzi w stan hibernacji. Ustawienie wartości powyżej 4 GB zazwyczaj skutkuje jedynie dłuższym i wolniejszym procesem awarii na pamięci masowej współdzielonej z innymi użytkownikami.
Czy ustawienie vm.swappiness na 0 to właściwy sposób na wyłączenie swapowania?
Nie, a działanie tego parametru jest inne, niż sugeruje nazwa. vm.swappiness = 0 nie wyłącza swapu. Nakazuje jądru unikanie zwalniania stron anonimowych, dopóki pamięć nie jest niemal całkowicie wyczerpana, co zwiększa prawdopodobieństwo wystąpienia błędu OOM, zamiast je zmniejszać. Powoduje to również przeniesienie całego ciężaru zwalniania pamięci na cache stron, przez co odczyty plików częściej wymagają dostępu do dysku. Aby całkowicie zrezygnować ze swapu, należy wykonać sudo swapoff -a i usunąć odpowiedni wpis z fstab. Aby ograniczyć swapowanie, należy wypróbować vm.swappiness = 10 i porównać kolumny si oraz so w vmstat przed i po zmianie.
Czy powinienem używać zram zamiast pliku swap?
Zram należy stosować, gdy dostępna jest nadwyżka mocy procesora przy ograniczonej przestrzeni dyskowej, natomiast plik swap sprawdza się w sytuacji odwrotnej. zram kompresuje strony i przechowuje je w pamięci RAM, eliminując operacje wejścia/wyjścia na dysku kosztem użycia procesora przy każdej operacji zapisu i odczytu strony. Zajęta przestrzeń to pamięć RAM, której nie mogą już używać aplikacje. Na VPS z ograniczonym limitem procesora, koszt ten obciąża zasób, którego już brakuje. Stosowanie obu rozwiązań jednocześnie jest dopuszczalne: należy nadać zram wyższy priorytet za pomocą PRIORITY w /etc/default/zramswap i zachować plik swap na dysku jako rozwiązanie awaryjne.
Dlaczego mechanizm OOM killer zadziałał, skoro polecenie free pokazywało wolną pamięć?
free raportuje stan w jednej chwili, a alokacja pamięci następuje natychmiastowo. Proces żądający dużego bloku pamięci szybciej, niż mechanizm zwalniania jest w stanie ją odzyskać, zostaje zabity, nawet jeśli średnie zużycie wydawało się bezpieczne. Należy sprawdzić dziennik jądra za pomocą sudo journalctl -k --grep "Out of memory", który wskazuje zabity proces oraz jego rozmiar w pamięci rezydentnej w momencie zdarzenia. Następnie należy zweryfikować, czy przerwanie procesu wynikało z limitu cgroup, a nie z wyczerpania pamięci całej maszyny, ponieważ kontener lub jednostka systemd z ustawionym MemoryMax= jest zabijana po osiągnięciu własnego limitu, nawet gdy host nadal posiada wolną pamięć.