Swap i RAM na VPS — konfiguracja i optymalizacja pamięci
Opublikowano: 8 kwietnia 2026 · Kategoria: VPS i serwery
Mały VPS (1-2 GB RAM) to najczęstszy wybór dla stron WordPress i małych aplikacji. Problem pojawia się, gdy MySQL, PHP-FPM i nginx jednocześnie potrzebują więcej pamięci niż dostępne RAM — Linux uruchamia OOM Killer, który losowo zabija procesy. Prawidłowo skonfigurowany swap i optymalizacja pamięci zapobiegają temu scenariuszowi.
Sprawdzenie aktualnego stanu pamięci
# Przegląd RAM i swap free -h # Szczegółowy widok swap swapon --show # Top 10 procesów według zużycia RAM ps aux --sort=-%mem | head -11 # Zużycie RAM w czasie rzeczywistym top -o %MEM # Czy OOM Killer działał? (sprawdź logi) sudo dmesg | grep -i "killed process" sudo grep -i "out of memory" /var/log/syslog | tail -20
Dodanie pliku swap
Rekomendowany rozmiar swap: 2x RAM dla serwerów <4 GB RAM, lub stałe 4 GB dla większych.
# Utwórz plik swap (2 GB) sudo fallocate -l 2G /swapfile # Jeśli fallocate nie działa (niektóre systemy plików): # sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 # Zabezpiecz plik (tylko root może czytać) sudo chmod 600 /swapfile # Sformatuj jako przestrzeń swap sudo mkswap /swapfile # Aktywuj swap sudo swapon /swapfile # Sprawdź czy działa free -h swapon --show
Aby swap był trwały po restarcie, dodaj do /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Konfiguracja swappiness
vm.swappiness (0-100) kontroluje jak agresywnie kernel używa swap. Domyślna wartość
60 jest zbyt wysoka dla serwerów web.
# Sprawdź aktualną wartość cat /proc/sys/vm/swappiness # Zmień tymczasowo (bez restartu) sudo sysctl vm.swappiness=10 # Zmień trwale echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
| Zastosowanie | swappiness | Opis |
|---|---|---|
| Serwer web (nginx + PHP) | 10 | Preferuj RAM, swap tylko w awaryjności |
| Baza danych (MySQL/MariaDB) | 1 | Maksymalizuj RAM dla buforów DB |
| Desktop Ubuntu | 60 | Domyślna wartość (zbyt wysoka dla serwera) |
| Serwer Redis/cache | 0-10 | Cache w RAM, swap szkodzi wydajności |
Optymalizacja MySQL/MariaDB — limit pamięci
MySQL jest głównym konsumentem RAM na VPS. Kluczowy parametr to
innodb_buffer_pool_size — powinien być ok. 50-70% dostępnego RAM:
# /etc/mysql/mysql.conf.d/mysqld.cnf lub /etc/my.cnf [mysqld] # 1 GB RAM na VPS — ustaw na 256-512 MB innodb_buffer_pool_size = 256M # 2 GB RAM na VPS — ustaw na 512 MB - 1 GB # innodb_buffer_pool_size = 512M # Ogranicz pamięć dla tabel tymczasowych tmp_table_size = 64M max_heap_table_size = 64M # Sprawdzenie aktualnego użycia po restarcie: # SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
Optymalizacja PHP-FPM — liczba procesów
# /etc/php/8.2/fpm/pool.d/www.conf
[www]
# Tryb dynamiczny — dostosowuje liczbę procesów
pm = dynamic
# Ile RAM zajmuje jeden proces PHP?
# Sprawdź: ps -o rss= -C php-fpm8.2 | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'
# Typowy WordPress: 30-60 MB / proces
# Dla 1 GB RAM (po odjęciu nginx + MySQL ~400 MB zostaje ~600 MB dla PHP):
# 600 MB / 40 MB (avg) = max 15 procesów
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
# Ograniczenie pamięci na request
php_admin_value[memory_limit] = 128M Orientacyjne wymagania RAM
| Konfiguracja | Min. RAM | Komfortowe RAM |
|---|---|---|
| nginx + PHP-FPM + WordPress (1 strona) | 512 MB | 1 GB |
| nginx + PHP-FPM + MySQL + WordPress | 1 GB | 2 GB |
| WooCommerce + duży katalog produktów | 2 GB | 4 GB |
| WordPress Multisite (5+ stron) | 2 GB | 4 GB |
| nginx + PHP + Redis + MySQL | 1.5 GB | 3 GB |