Pamięć to zasób, który najczęściej decyduje o rozmiarze serwera: kończy się jako pierwsza, a gdy jej zabraknie, serwer nie zwalnia, tylko zatrzymuje usługi. Ten poradnik podaje zasadę obliczania, zużycie każdego elementu aplikacji, typowe profile i sposób pomiaru na serwerze, który już działa.
available polecenia free -h, a nie kolumnę free.Serwer nie zużywa pamięci „ogólnie”: każdy działający program zajmuje jej część tak długo, jak działa. Obliczenie zaczyna się więc od listy procesów obecnych na stałe, a następnie dodaje szczyt i zapas:
Potrzebna pamięć = (system + stałe usługi + szczyt zadań okresowych) × 1,25
Poniższe rzędy wielkości dotyczą aplikacji typowej wielkości, zmierzonej na produkcji. Są punktem wyjścia; ostatnie słowo zawsze należy do pomiaru własnej aplikacji, opisanego niżej.
| Element | Typowe zużycie pamięci | Od czego zależy |
|---|---|---|
| Nginx, Caddy (serwer WWW, proxy) | Od 10 do 50 MB | Prawie stałe: liczba połączeń ma niewielki wpływ. |
| PHP-FPM (WordPress, Laravel, Symfony) | Od 40 do 80 MB na proces | Liczba procesów, ograniczona przez pm.max_children: 10 procesów to od 400 do 800 MB. |
| Node.js (API, Next.js, NestJS) | Od 60 do 300 MB na proces | Liczba procesów (tryb cluster, PM2) i rozmiar sterty, ograniczony przez --max-old-space-size. |
| Python (Django, FastAPI, Flask) | Od 80 do 200 MB na proces | Liczba workerów Gunicorn lub Uvicorn oraz załadowane biblioteki: pandas czy model uczenia maszynowego dodają setki MB. |
| Java (Spring Boot) | Od 300 MB do 1 GB na aplikację | Maksymalny rozmiar sterty: domyślnie JVM przydziela sobie ćwierć pamięci, którą widzi. |
| Go, Rust | Od 10 do 100 MB | Dane, które aplikacja sama przechowuje w pamięci. |
| PostgreSQL | 25 % pamięci na shared_buffers, plus kilka MB na połączenie | Ilość często odczytywanych danych, liczba połączeń, work_mem. |
| MySQL, MariaDB | innodb_buffer_pool_size, domyślnie 128 MB | Na serwerze przeznaczonym wyłącznie dla bazy ten bufor zajmuje często do 80 % pamięci. |
| Redis | Rozmiar danych plus jego struktury | Podczas zapisu na dysk zmodyfikowane strony są duplikowane: w najgorszym przypadku nawet dwukrotność. |
| Elasticsearch, OpenSearch | Co najmniej 2 GB na stertę | Sterta nie przekracza połowy pamięci: reszta służy jako pamięć podręczna plików. |
W aplikacjach JavaScript często powraca jeden szczyt: kompilacja. npm run build w projekcie Next.js, Nuxt lub Angular potrzebuje zwykle sam od 1 do 2 GB przez kilka minut, ponad to, co już działa. Kompilacja na serwerze oznacza dobór rozmiaru do tego szczytu; kompilacja na własnym komputerze lub w ciągłej integracji (CI) i wgrywanie tylko wyniku pozwala go uniknąć.
To samo rozumowanie dotyczy kontenerów Docker: każdy kontener to zestaw zwykłych procesów, a demon Dockera dodaje własne zużycie. docker stats pokazuje, ile zajmuje każdy z nich.
Te profile sumują powyższe elementy, łącznie ze szczytem i zapasem. Zakładają aplikację typowej wielkości i ruch z okresu uruchomienia; duża baza lub stały ruch przesuwają wynik w górę.
| Co działa na serwerze | Potrzebna pamięć |
|---|---|
| Strona statyczna, proxy, mały bot lub zaplanowany skrypt | Od 1 do 2 GB |
| Jedna strona WordPress z MariaDB i pamięcią podręczną stron | 2 GB |
| Sklep WooCommerce lub kilka stron WordPress | 4 GB |
| API w Node.js lub Pythonie z PostgreSQL, pierwsi użytkownicy | 4 GB |
| Aplikacja Next.js kompilowana na serwerze, jej API i baza PostgreSQL | Od 6 do 8 GB |
| Kilka aplikacji w kontenerach, środowisko testowe i produkcyjne | 8 GB |
| Baza danych o rozmiarze kilkudziesięciu GB, intensywnie odpytywana | 16 GB i więcej |
| Model językowy o 7 do 8 miliardach parametrów uruchamiany na serwerze | 16 GB |
Aplikację, która wywołuje model AI przez API (OpenAI, Anthropic, Mistral), dobiera się jak każdą aplikację webową: model działa u swojego dostawcy, a Państwa serwer czeka na odpowiedź. Skalę zmienia dopiero uruchomienie modelu na samym serwerze.
Na działającym serwerze pomiar zastępuje szacunki. Trzy polecenia pokazują, jak wygląda sytuacja:
free -h
ps aux --sort=-rss | head -n 15
vmstat 5 5
free -h: proszę czytać kolumnę available, czyli pamięć faktycznie dostępną do uruchomienia nowych programów. Kolumna free prawie zawsze pokazuje niską wartość i jest to normalne: Linux wypełnia nieużywaną pamięć pamięcią podręczną plików (buff/cache), którą oddaje, gdy tylko program jej potrzebuje.ps aux --sort=-rss: procesy uszeregowane według zajmowanej pamięci (kolumna RSS, w kilobajtach). Tu widać, ile waży każdy worker PHP lub Node.js.vmstat 5 5: pięć odczytów w odstępach pięciosekundowych. Wartości niezerowe w kolumnach si i so, odczyt po odczycie, oznaczają serwer, który korzysta z przestrzeni wymiany (swap): brakuje mu pamięci.Proszę mierzyć w najbardziej obciążonej porze dnia oraz podczas zadań okresowych: kompilacji, kopii zapasowej, importu. Liczy się szczyt.
Serwer, któremu kończy się pamięć, nie zwalnia stopniowo. Gdy nie ma już czego zwolnić, jądro Linuksa uruchamia OOM killer (out of memory): wybiera proces, zwykle ten, który zajmuje najwięcej pamięci, i natychmiast go zatrzymuje. Na serwerze aplikacji często jest to baza danych.
Objawy: sporadyczne błędy 502 lub 503, usługa, która restartuje się bez widocznego powodu, kompilacja przerwana komunikatem Killed. Potwierdzają to logi:
journalctl -k | grep -i "out of memory"
systemctl status nazwa-uslugi
W wyniku systemctl status wpis Failed with result 'oom-kill' oznacza usługę zatrzymaną z powodu braku pamięci.
Swap, jeśli serwer go ma, opóźnia ten moment, przenosząc na dysk najrzadziej używaną pamięć. To siatka bezpieczeństwa, a nie dodatkowa pojemność: serwer, który stale korzysta ze swapu, odpowiada kilkakrotnie wolniej, nawet na SSD NVMe.
Rozwiązania, od najprostszego do najtrwalszego: zmniejszyć liczbę procesów aplikacji (pm.max_children, workery Gunicorn), kompilować poza serwerem, ograniczyć pamięć bazy danych, a następnie przejść na większy rozmiar.
Pamięć to nie jedyny zasób: procesor liczy się przy tym, co wykonuje obliczenia (kompilacja, przetwarzanie obrazów, uruchamianie modelu AI), a dysk przy bazie danych i plikach. W przypadku aplikacji webowej to jednak prawie zawsze pamięć wyznacza rozmiar.
VPS Pro jest dostępny w sześciu rozmiarach, na procesorach Intel Xeon, pamięci ECC i SSD NVMe w konfiguracji lustrzanej, i przechodzi na większy rozmiar w dowolnej chwili, bez ponownej instalacji. Kompleksowe wsparcie jest w cenie: proszę opisać, co będzie działać na Państwa serwerze, a doradzimy rozmiar, potem zaś przy każdym pytaniu diagnozujemy i wskazujemy, co zrobić, od systemu po kod Państwa aplikacji.
Strona statyczna, proxy lub mały skrypt działają w 1 do 2 GB. Gdy tylko serwer dzielą baza danych i aplikacja (PHP, Node.js, Python), należy liczyć 2 GB dla strony WordPress i 4 GB dla aplikacji na zamówienie z PostgreSQL.
2 GB dla strony z MariaDB i pamięcią podręczną stron, 4 GB dla sklepu WooCommerce lub kilku stron. Pierwszym ustawieniem do sprawdzenia jest liczba procesów PHP-FPM: każdy zajmuje od 40 do 80 MB.
Nie. Swap zapobiega nagłemu zatrzymaniu, gdy pamięć jest pełna, ale serwer, który stale z niego korzysta, odpowiada kilkakrotnie wolniej, nawet na SSD NVMe. To siatka bezpieczeństwa; rozmiar dobiera się według pamięci.
Ponieważ Linux wykorzystuje nieużywaną pamięć jako pamięć podręczną plików. Ta pamięć podręczna zwalnia się, gdy tylko program potrzebuje pamięci. Należy czytać kolumnę available, która podaje pamięć faktycznie dostępną.
Od 1 do 2 GB na samą kompilację, ponad to, co już działa na serwerze. Kompilacja na własnym komputerze lub w ciągłej integracji i wgrywanie tylko wyniku pozwala uniknąć tego szczytu.
Simafri
Porozmawiajmy o Państwa projekcie
Proszę powiedzieć nam w kilku słowach, czego Państwo potrzebują: odpowiemy szybko.
Dziękujemy! Państwa zapytanie zostało wysłane. Wkrótce się odezwiemy.
Wolą Państwo e-mail? Proszę napisać do nas na support@simafri.com.