Przejdź do treści

Zarządzanie pamięcią RAM i SWAP

Wprowadzenie

W poprzednim artykule omówiłem temat zarządzania pamięcią SWAP.
🧠 Czy potrzebujesz pamięci swap?
W tym artykule chciałbym wyjaśnić, jak możemy zarządzać operacjami RAM i SWAP w naszym systemie.

Parametry związane z pamięcią RAM

vm.min_free_kbytes 📊

Opis:
Określa minimalną ilość wolnej pamięci (w kilobajtach), którą jądro będzie próbowało utrzymać.

Znaczenie:

  • Zapobiega całkowitemu wyczerpaniu pamięci RAM
  • Pozwala jądru utrzymać rezerwę pamięci dla procesów o wysokim priorytecie
  • Zbyt wysoka wartość może powodować niepotrzebne przenoszenie danych do pamięci SWAP
  • Zbyt niska wartość może prowadzić do problemów z wydajnością przy niskim stanie pamięci

Sprawdzanie i zmiana:

# Sprawdź aktualną wartość
sysctl vm.min_free_kbytes
# Ustaw nową wartość (np. 100MB)
sysctl -w vm.min_free_kbytes=102400

Notka

Domyślna wartość jest obliczana przez jądro na podstawie całkowitej pamięci. Dla systemów z niską ilością pamięci RAM (< 4GB), odpowiednie są wartości od 16MB do 64MB. Dla systemów z większą ilością pamięci (> 32GB), można rozważyć wartości 256MB-1GB.

vm.overcommit_memory

Opis:
Kontroluje politykę przydzielania pamięci przez jądro, gdy procesy żądają więcej pamięci niż jest fizycznie dostępna.

Wartości:

  • 0: (domyślnie) heurystyczne przydzielanie pamięci. Jądro ocenia każde żądanie i odmawia tylko wtedy, gdy pamięć jest krytycznie niska.
  • 1: zawsze przydzielaj pamięć, niezależnie od aktualnej dostępności (przydatne dla aplikacji używających fork()).
  • 2: odmów przydzielenia pamięci, gdy żądanie przekracza sumę dostępnej pamięci fizycznej RAM i przestrzeni SWAP.
# Sprawdź aktualną wartość
sysctl vm.overcommit_memory
# Włącz ścisłą politykę przydzielania pamięci
sysctl -w vm.overcommit_memory=2
🔧 vm.overcommit_memory = 1

Zalecane gdy:

  • 🧠 używasz aplikacji, które przydzielają dużo pamięci, ale nie używają jej od razu (np. Redis, PostgreSQL).
  • ✅ chcesz uniknąć błędów alokacji (malloc() może nie powieść się przy ustawieniu 2).
  • 🛡️ masz system z dobrze skonfigurowanym mechanizmem OOM killer lub pamięcią swap.

⚠️ Ryzyko:

  • możliwość przeciążenia pamięci i aktywacji OOM killera
🛑 vm.overcommit_memory = 2 (tryb ścisły)

Zalecane gdy:

  • 🎯 Potrzebujesz przewidywalnego zarządzania pamięcią (np. środowiska z wieloma aplikacjami).
  • 🚫 Chcesz uniknąć ryzyka przeciążenia RAM i aktywacji OOM killera.

❌ Wady:

  • Niektóre aplikacje mogą nie działać poprawnie, jeśli rezerwują duże bloki pamięci przy uruchamianiu (np. Redis, PostgreSQL).

⚙️ Wymaga ustawienia vm.overcommit_ratio:

  • Domyślnie: 50 (% fizycznej pamięci RAM, która może być przydzielona).
  • Może być zwiększona, np.:
    sysctl -w vm.overcommit_ratio=80
    

vm.overcommit_ratio 📈

Opis:
Określa procent pamięci fizycznej, który może być przydzielony, gdy vm.overcommit_memory jest ustawiony na 2.

Znaczenie:

  • Wyższa wartość umożliwia bardziej agresywne przydzielanie pamięci
  • Domyślna wartość to zwykle 50 (50%)

Wzór obliczeniowy dla trybu 2:

\[ CommitLimit = \left( RAM \times \frac{overcommit\_ratio}{100} \right) + SWAP \]
# Sprawdź aktualną wartość
sysctl vm.overcommit_ratio
# Zwiększ limit do 80%
sysctl -w vm.overcommit_ratio=80

Notka

Dla systemów z dużą ilością pamięci i małą przestrzenią SWAP, rozważ zwiększenie tej wartości do 80-90%. Dla systemów krytycznych, gdzie stabilność jest ważniejsza niż efektywne wykorzystanie pamięci, niższe wartości (30-50%) mogą być bezpieczniejsze.

vm.dirty_ratio ⚠️

Opis:
Maksymalny procent całkowitej pamięci systemowej, który może zawierać dirty pages (zmodyfikowane, ale jeszcze nie zapisane na dysk) przed rozpoczęciem synchronicznego zapisu na dysk.

Znaczenie:

  • Gdy limit ten zostanie osiągnięty, procesy zapisujące dane będą zmuszone czekać na zakończenie zapisu na dysk
  • Może powodować zauważalne zawieszenia aplikacji, jeśli wartość jest zbyt wysoka
  • Domyślna wartość wynosi zwykle między 10% a 20%
# Sprawdź aktualną wartość
sysctl vm.dirty_ratio
# Ustaw nową wartość
sysctl -w vm.dirty_ratio=15

Notka

Dla systemów stacjonarnych(PC, laptop), gdzie priorytetem jest płynne działanie, rozważ niższe wartości (5-10%). Dla serwerów z dużą ilością operacji I/O i dobrej jakości pamięcią masową, można rozważyć wartości 20-30%.

vm.dirty_background_ratio 🔄

Opis:
Procent całkowitej pamięci systemowej, który może zawierać dirty pages, zanim rozpocznie się zapisywanie tych danych w tle (sorry nie pasuje mi brudne strony dla dirty pages :) ).

Znaczenie:

  • Niższy niż vm.dirty_ratio
  • Jądro zaczyna zapisywać dane w tle bez blokowania procesów
  • Umożliwia płynniejsze działanie systemu
  • Domyślna wartość wynosi zwykle między 5% a 10%
# Sprawdź aktualną wartość
sysctl vm.dirty_background_ratio
# Ustaw nową wartość
sysctl -w vm.dirty_background_ratio=5

Note

Ta wartość powinna być zawsze niższa niż vm.dirty_ratio. Dla systemów ogólnego przeznaczenia odpowiednie są wartości 5-10%. Dla systemów z szybkimi dyskami (SSD/NVMe) można rozważyć niższe wartości (3-5%).

vm.vfs_cache_pressure 🔍

Opis:
Kontroluje tendencję jądra do odzyskiwania pamięci używanej przez pamięć podręczną systemu plików (dentry i inode).

Znaczenie:

  • Wyższa wartość zwiększa agresywność odzyskiwania
  • Niższa wartość zmniejsza agresywność odzyskiwania
  • Domyślna wartość to zwykle 100
# Sprawdź aktualną wartość
sysctl vm.vfs_cache_pressure
# Zmniejsz nacisk na usuwanie pamięci podręcznej
sysctl -w vm.vfs_cache_pressure=50

Przykład

Masz aplikację (np. serwer Nginx lub system kopii zapasowych), która: - często przeszukuje duże katalogi, - często odczytuje metadane plików (rozmiar, typ, uprawnienia), - ale nie używa dużo RAM.

📉 Wtedy możesz zmniejszyć vm.vfs_cache_pressure np. do 50, dzięki czemu jądro dłużej przechowuje pamięć podręczną dentry/inode, co przyspiesza dostęp do katalogów i plików.


Parametry związane z pamięcią SWAP

vm.swappiness 🔄

Opis:
Określa tendencję jądra do przenoszenia danych z RAM do przestrzeni SWAP.

Wartości:

  • 0: Minimalne wykorzystanie SWAP (tylko w ostateczności)
  • 1-10: Bardzo niskie wykorzystanie SWAP
  • 60: Wartość domyślna w większości dystrybucji
  • 100: Maksymalne wykorzystanie SWAP (agresywne)
# Sprawdź aktualną wartość
sysctl vm.swappiness
# Zmniejsz tendencję do używania SWAP
sysctl -w vm.swappiness=10

vm.page-cluster 📚

Opis:
Określa liczbę stron pamięci przenoszonych jednocześnie do przestrzeni SWAP podczas operacji swapout.

Znaczenie:

  • Wyższa wartość zwiększa wydajność zapisu SWAP
  • Może zwiększać opóźnienia w pojedynczych operacjach wymiany
  • Domyślna wartość to zwykle 3 (oznacza 2³ = 8 stron)
# Sprawdź aktualną wartość
sysctl vm.page-cluster
# Zmniejsz liczbę stron przenoszonych jednocześnie
sysctl -w vm.page-cluster=2

Note

Dla systemów z dyskami SSD/NVME używających SWAP, odpowiednie są wartości 2-3. Dla systemów z wolniejszymi dyskami HDD, które intensywnie wykorzystują SWAP, można rozważyć wyższe wartości (4-5) dla lepszej przepustowości.

vm.min_slab_ratio 🧱

Opis:
Określa minimalny procent pamięci jądra, który powinien pozostać przydzielony dla obiektów slab przed rozpoczęciem odzyskiwania pamięci.

Znaczenie:

  • Niższa wartość może zwiększyć agresywność odzyskiwania pamięci z pamięci podręcznej obiektów jądra
  • Domyślna wartość to zwykle 5%
# Sprawdź aktualną wartość (jeśli dostępna)
sysctl vm.min_slab_ratio
# Ustaw nową wartość
sysctl -w vm.min_slab_ratio=3
🧱 vm.min_slab_ratio – co to jest SLAB?

SLAB to mechanizm zarządzania pamięcią w jądrze Linuksa używany do efektywnego przechowywania i zarządzania małymi, często używanymi strukturami danych (np. inode, dentry, task_struct).

🗂️ Jak to działa?
Wyobraź sobie SLAB jako zestaw szufladek (pamięć podręczna), z których każda przechowuje tylko jeden typ obiektów - np. inody. Gdy system potrzebuje nowego inoda, sięga do tej szuflady zamiast tworzyć go od podstaw, co zwiększa wydajność.


📈 Przykład:

Masz system z 16 GB RAM działający jako serwer NFS obsługujący tysiące małych plików. Ustawienie:

sysctl -w vm.min_slab_ratio=5

zapewnia, że co najmniej 5% RAM (około 800 MB) będzie zarezerwowane dla pamięci podręcznej slab, zapobiegając spowolnieniu systemu plików.


📌 Wartość domyślna zależy od wersji jądra, ale zwykle wynosi między 5–10%.

👀 Aby sprawdzić wykorzystanie pamięci podręcznej slab:

cat /proc/meminfo | grep -i slab

vm.watermark_scale_factor ⚖️

Opis:
Wpływa na obliczanie progów znaku wodnego pamięci, które określają, kiedy system zaczyna odzyskiwać pamięć.

Znaczenie:

  • Wyższa wartość zwiększa bufor bezpieczeństwa
  • Może wpływać na częstotliwość wywoływania kswapd (daemon odpowiedzialny za swap)
  • Domyślna wartość to zwykle 10 (10%)
# Sprawdź aktualną wartość
sysctl vm.watermark_scale_factor
# Zwiększ margines bezpieczeństwa
sysctl -w vm.watermark_scale_factor=15

Note

Dla systemów krytycznych, które nie mogą sobie pozwolić na problemy z pamięcią, rozważ zwiększenie tej wartości do 15-20%. Dla większości systemów odpowiednia jest wartość domyślna.


Monitorowanie i testowanie 📊

Wbudowane narzędzia 🛠️

  1. free - podstawowe informacje o wykorzystaniu RAM i SWAP

    free -h
    

  2. vmstat - statystyki pamięci wirtualnej, w tym aktywność swap

    vmstat 5
    

  3. slabtop - wykorzystanie obiektów slab jądra

    slabtop
    

  4. cat /proc/meminfo - szczegółowe informacje o stanie pamięci

    cat /proc/meminfo
    

Trwałe ustawienia parametrów 📝

Aby zachować ustawienia parametrów jądra, utwórz nowy plik w katalogu /etc/sysctl.d/ i dodaj je tam.

Tip

Możesz dodać bezpośrednio do `/etc/sysctl.conf`, ale po aktualizacji systemu dodatkowe ustawienia znikną.
# /etc/sysctl.d/99-memory-parameters.conf
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.min_free_kbytes = 102400
vm.vfs_cache_pressure = 50

Po utworzeniu lub edycji pliku, załaduj nowe ustawienia:

sysctl -p /etc/sysctl.d/99-memory-parameters.conf

Danger

**Kontekst** - Nie ma uniwersalnych "najlepszych" ustawień - optymalne wartości zależą od specyfiki systemu, sprzętu i charakteru obciążenia.
**Monitorowanie** - Po zmianie parametrów monitoruj system pod kątem potencjalnych problemów z wydajnością.
**Aktualizacje jądra** - Niektóre parametry mogą działać inaczej lub zostać usunięte w nowszych wersjach jądra.
**Interakcje** - Parametry mogą oddziaływać na siebie nawzajem, więc zmieniaj je stopniowo i obserwuj wyniki.

Podsumowanie 📚

Właściwe dostosowanie parametrów jądra związanych z RAM i SWAP może znacząco poprawić wydajność systemu. Wartości odpowiednie dla jednego systemu mogą być nieoptymalne dla innego, w zależności od charakterystyki obciążenia i dostępnego sprzętu.