La memoria è la risorsa che più spesso decide la taglia di un server: è la prima a mancare, e quando manca il server non rallenta, ferma dei servizi. Questa guida dà la regola di calcolo, quanto consuma ogni componente di un'applicazione, alcuni profili tipo e il modo di misurare su un server già in funzione.
available di free -h, non la colonna free.Un server non consuma memoria «in generale»: ogni programma in esecuzione ne occupa una parte, finché resta in esecuzione. Il calcolo parte quindi dall'elenco dei processi sempre presenti, poi aggiunge il picco e un margine:
Memoria da prevedere = (sistema + servizi permanenti + picco delle operazioni occasionali) × 1,25
Gli ordini di grandezza qui sotto valgono per un'applicazione di dimensioni comuni, misurata in produzione. Danno un punto di partenza; la misura sulla vostra applicazione, descritta più avanti, ha sempre l'ultima parola.
| Componente | Memoria tipica | Che cosa la fa variare |
|---|---|---|
| Nginx, Caddy (server web, proxy) | Da 10 a 50 MB | Quasi fissa: il numero di connessioni pesa poco. |
| PHP-FPM (WordPress, Laravel, Symfony) | Da 40 a 80 MB per processo | Il numero di processi, limitato da pm.max_children: 10 processi, da 400 a 800 MB. |
| Node.js (API, Next.js, NestJS) | Da 60 a 300 MB per processo | Il numero di processi (modalità cluster, PM2) e la dimensione dell'heap, limitata da --max-old-space-size. |
| Python (Django, FastAPI, Flask) | Da 80 a 200 MB per processo | Il numero di worker Gunicorn o Uvicorn, e le librerie caricate: pandas o un modello di machine learning aggiungono centinaia di MB. |
| Java (Spring Boot) | Da 300 MB a 1 GB per applicazione | La dimensione massima dell'heap: per impostazione predefinita, la JVM si riserva un quarto della memoria che vede. |
| Go, Rust | Da 10 a 100 MB | I dati che l'applicazione stessa tiene in memoria. |
| PostgreSQL | Il 25% della memoria per shared_buffers, più qualche MB per connessione | Il volume di dati letti spesso, il numero di connessioni, work_mem. |
| MySQL, MariaDB | innodb_buffer_pool_size, 128 MB per impostazione predefinita | Su un server dedicato al database, questo buffer arriva comunemente fino all'80% della memoria. |
| Redis | La dimensione dei dati, più le sue strutture | Durante un salvataggio su disco, le pagine modificate vengono duplicate: fino al doppio nel caso peggiore. |
| Elasticsearch, OpenSearch | Almeno 2 GB per l'heap | L'heap resta sotto la metà della memoria: il resto serve alla cache dei file. |
Un picco ricorre spesso con le applicazioni JavaScript: la compilazione. npm run build su un progetto Next.js, Nuxt o Angular richiede comunemente da 1 a 2 GB da solo, per qualche minuto, in aggiunta a ciò che è già in esecuzione. Compilare sul server significa dimensionare per quel picco; compilare sul vostro computer o nella vostra integrazione continua e caricare solo il risultato significa evitarlo.
Stesso ragionamento per i container Docker: ogni container è un insieme di processi come gli altri, e il demone Docker aggiunge il proprio consumo. docker stats mostra quanto occupa ciascuno.
Questi profili sommano i componenti precedenti, picco e margine compresi. Presuppongono un'applicazione di dimensioni comuni e il traffico di un lancio; un database voluminoso o un traffico sostenuto spostano l'asticella verso l'alto.
| Che cosa gira sul server | Memoria da prevedere |
|---|---|
| Sito statico, proxy, piccolo bot o script pianificato | Da 1 a 2 GB |
| Un sito WordPress con MariaDB e una cache delle pagine | 2 GB |
| Un negozio WooCommerce, o più siti WordPress | 4 GB |
| Un'API Node.js o Python con PostgreSQL, primi utenti | 4 GB |
| Un'applicazione Next.js compilata sul server, con la sua API e il suo database PostgreSQL | Da 6 a 8 GB |
| Più applicazioni in container, preproduzione e produzione | 8 GB |
| Un database di diverse decine di GB, consultato intensamente | 16 GB e oltre |
| Un modello linguistico da 7 a 8 miliardi di parametri eseguito sul server | 16 GB |
Un'applicazione che chiama un modello di IA tramite API (OpenAI, Anthropic, Mistral) si dimensiona come qualsiasi applicazione web: il modello gira presso il suo fornitore, e il vostro server attende la risposta. È l'esecuzione del modello sul server stesso a cambiare la scala.
Su un server in servizio, la misura sostituisce la stima. Tre comandi dicono a che punto siete:
free -h
ps aux --sort=-rss | head -n 15
vmstat 5 5
free -h: leggete la colonna available, la memoria realmente disponibile per avviare nuovi programmi. La colonna free è quasi sempre bassa, ed è normale: Linux riempie la memoria inutilizzata con la cache dei file (buff/cache), che restituisce appena un programma ne ha bisogno.ps aux --sort=-rss: i processi ordinati per memoria occupata (colonna RSS, in kilobyte). È qui che si vede quanto pesa ogni worker PHP o Node.js.vmstat 5 5: cinque rilevazioni a cinque secondi di distanza. Valori diversi da zero nelle colonne si e so, rilevazione dopo rilevazione, indicano un server che scambia pagine con lo swap: gli manca memoria.Misurate nel momento più carico della giornata, e durante le operazioni occasionali: compilazione, backup, importazione. È il picco che conta.
Un server a corto di memoria non rallenta in modo progressivo. Quando non c'è più nulla da liberare, il kernel Linux fa intervenire l'OOM killer (out of memory): sceglie un processo, in genere quello che occupa più memoria, e lo termina di colpo. Su un server applicativo, spesso è il database.
I sintomi: errori 502 o 503 a tratti, un servizio che si riavvia senza motivo apparente, una compilazione che si interrompe con Killed. I log lo confermano:
journalctl -k | grep -i "out of memory"
systemctl status nome-del-servizio
Nell'output di systemctl status, la dicitura Failed with result 'oom-kill' indica un servizio fermato per mancanza di memoria.
Lo swap, quando il server ne dispone, ritarda quel momento spostando su disco la memoria meno usata. Fa da rete di sicurezza, non da capacità: un server che si appoggia allo swap in continuazione risponde parecchie volte più lentamente, anche su un SSD NVMe.
I rimedi, dal più semplice al più duraturo: ridurre il numero di processi dell'applicazione (pm.max_children, worker Gunicorn), compilare fuori dal server, limitare la memoria del database, poi passare a una taglia superiore.
La memoria non è l'unica risorsa: il processore conta per ciò che calcola (compilazione, elaborazione di immagini, esecuzione di un modello di IA), il disco per il database e i file. Per un'applicazione web, però, è quasi sempre la memoria a decidere la taglia.
Il VPS Pro è disponibile in sei taglie, su processori Intel Xeon, memoria ECC e SSD NVMe in mirroring, e passa alla taglia superiore in qualsiasi momento, senza reinstallazione. L'Assistenza integrale è compresa: descriveteci che cosa farà girare il vostro server e vi consigliamo la taglia, poi a ogni domanda facciamo la diagnosi e vi indichiamo che cosa fare, dal sistema fino al codice della vostra applicazione.
Un sito statico, un proxy o un piccolo script girano con 1 o 2 GB. Appena un database e un'applicazione (PHP, Node.js, Python) condividono il server, contate 2 GB per un sito WordPress e 4 GB per un'applicazione su misura con PostgreSQL.
2 GB per un sito con MariaDB e una cache delle pagine, 4 GB per un negozio WooCommerce o più siti. Il numero di processi PHP-FPM è la prima impostazione da regolare: ognuno occupa da 40 a 80 MB.
No. Lo swap evita un arresto brusco quando la memoria è piena, ma un server che lo usa in continuazione risponde parecchie volte più lentamente, anche su un SSD NVMe. È una rete di sicurezza; la taglia si sceglie in base alla memoria.
Perché Linux usa la memoria inutilizzata come cache dei file. Questa cache si libera appena un programma ha bisogno di memoria. La colonna da leggere è available, che indica la memoria realmente disponibile.
Contate da 1 a 2 GB per la sola compilazione, in aggiunta a ciò che gira già sul server. Compilare sul vostro computer o nella vostra integrazione continua, e poi caricare solo il risultato, evita quel picco.
Simafri
Parliamo del vostro progetto
Diteci in due parole ciò che vi serve: vi rispondiamo rapidamente.
Grazie! La tua richiesta è stata inviata. Ti risponderemo a breve.
Preferite l'email? Scriveteci a support@simafri.com.