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 ustawieniu2
). - 🛡️ 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.:
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:
# 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%
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:
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:
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 🛠️
-
free - podstawowe informacje o wykorzystaniu RAM i SWAP
-
vmstat - statystyki pamięci wirtualnej, w tym aktywność swap
-
slabtop - wykorzystanie obiektów slab jądra
-
cat /proc/meminfo - szczegółowe informacje o stanie pamięci
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:
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.