La memoria es el recurso que con más frecuencia fija el tamaño de un servidor: es la primera que falta y, cuando falta, el servidor no se ralentiza, sino que detiene servicios. Esta guía da la regla de cálculo, lo que consume cada componente de una aplicación, perfiles tipo y la forma de medir en un servidor que ya está en funcionamiento.
available de free -h, no la columna free.Un servidor no consume memoria «en general»: cada programa en ejecución reserva una parte mientras funciona. El cálculo parte, por tanto, de la lista de procesos presentes de forma permanente, y después añade el pico y un margen:
Memoria que prever = (sistema + servicios permanentes + pico de las tareas puntuales) × 1,25
Los órdenes de magnitud siguientes valen para una aplicación de tamaño habitual, medida en producción. Son un punto de partida; la medición sobre su propia aplicación, descrita más abajo, tiene siempre la última palabra.
| Componente | Memoria típica | Qué la hace variar |
|---|---|---|
| Nginx, Caddy (servidor web, proxy) | 10 a 50 MB | Casi fija: el número de conexiones pesa poco. |
| PHP-FPM (WordPress, Laravel, Symfony) | 40 a 80 MB por proceso | El número de procesos, limitado por pm.max_children: 10 procesos, de 400 a 800 MB. |
| Node.js (API, Next.js, NestJS) | 60 a 300 MB por proceso | El número de procesos (modo clúster, PM2) y el tamaño del heap, limitado por --max-old-space-size. |
| Python (Django, FastAPI, Flask) | 80 a 200 MB por proceso | El número de workers de Gunicorn o Uvicorn, y las bibliotecas cargadas: pandas o un modelo de aprendizaje automático añaden cientos de MB. |
| Java (Spring Boot) | 300 MB a 1 GB por aplicación | El tamaño máximo del heap: por defecto, la JVM se asigna la cuarta parte de la memoria que ve. |
| Go, Rust | 10 a 100 MB | Los datos que la propia aplicación mantiene en memoria. |
| PostgreSQL | El 25 % de la memoria para shared_buffers, más unos pocos MB por conexión | El volumen de datos consultados con frecuencia, el número de conexiones, work_mem. |
| MySQL, MariaDB | innodb_buffer_pool_size, 128 MB por defecto | En un servidor dedicado a la base de datos, este búfer ocupa habitualmente hasta el 80 % de la memoria. |
| Redis | El tamaño de los datos, más sus estructuras | Durante un guardado en disco, las páginas modificadas se duplican: hasta el doble en el peor caso. |
| Elasticsearch, OpenSearch | Al menos 2 GB para el heap | El heap se queda por debajo de la mitad de la memoria: el resto sirve de caché de archivos. |
Hay un pico que se repite a menudo con las aplicaciones JavaScript: la compilación. npm run build en un proyecto Next.js, Nuxt o Angular pide habitualmente de 1 a 2 GB por sí solo, durante unos minutos, además de lo que ya está en marcha. Compilar en el servidor obliga a dimensionar para ese pico; compilar en su equipo o en su integración continua y subir solo el resultado lo evita.
El mismo razonamiento vale para los contenedores Docker: cada contenedor es un conjunto de procesos como los demás, y el demonio de Docker añade su propio consumo. docker stats muestra lo que ocupa cada uno.
Estos perfiles suman los componentes anteriores, pico y margen incluidos. Suponen una aplicación de tamaño habitual y el tráfico de un lanzamiento; una base de datos voluminosa o un tráfico sostenido desplazan la cifra hacia arriba.
| Lo que se ejecuta en el servidor | Memoria que prever |
|---|---|
| Sitio estático, proxy, pequeño bot o script programado | 1 a 2 GB |
| Un sitio WordPress con MariaDB y una caché de páginas | 2 GB |
| Una tienda WooCommerce, o varios sitios WordPress | 4 GB |
| Una API Node.js o Python con PostgreSQL, primeros usuarios | 4 GB |
| Una aplicación Next.js compilada en el servidor, su API y su base PostgreSQL | 6 a 8 GB |
| Varias aplicaciones en contenedores, preproducción y producción | 8 GB |
| Una base de datos de varias decenas de GB, consultada intensivamente | 16 GB o más |
| Un modelo de lenguaje de 7 a 8 mil millones de parámetros ejecutado en el servidor | 16 GB |
Una aplicación que llama a un modelo de IA por API (OpenAI, Anthropic, Mistral) se dimensiona como cualquier aplicación web: el modelo se ejecuta en la infraestructura de su proveedor, y su servidor espera la respuesta. Es la ejecución del modelo en el propio servidor lo que cambia la escala.
En un servidor en servicio, la medición sustituye a la estimación. Tres comandos le dicen en qué punto está:
free -h
ps aux --sort=-rss | head -n 15
vmstat 5 5
free -h: lea la columna available, la memoria realmente disponible para lanzar nuevos programas. La columna free casi siempre está baja, y es normal: Linux llena la memoria no utilizada con la caché de archivos (buff/cache), que libera en cuanto un programa la necesita.ps aux --sort=-rss: los procesos ordenados por la memoria que ocupan (columna RSS, en kilobytes). Aquí se ve lo que pesa cada worker de PHP o de Node.js.vmstat 5 5: cinco lecturas a cinco segundos de intervalo. Valores distintos de cero en las columnas si y so, lectura tras lectura, indican un servidor que recurre al swap: le falta memoria.Mida en el momento de más carga del día y durante las tareas puntuales: compilación, copia de seguridad, importación. Lo que cuenta es el pico.
Un servidor sin memoria no se ralentiza de forma progresiva. Cuando ya no queda nada que liberar, el kernel de Linux activa el OOM killer (out of memory): elige un proceso, en general el que más memoria ocupa, y lo detiene en seco. En un servidor de aplicaciones, suele ser la base de datos.
Los síntomas: errores 502 o 503 intermitentes, un servicio que se reinicia sin motivo aparente, una compilación que se interrumpe con Killed. Los registros del sistema lo confirman:
journalctl -k | grep -i "out of memory"
systemctl status nombre-del-servicio
En la salida de systemctl status, la mención Failed with result 'oom-kill' señala un servicio detenido por falta de memoria.
El swap, cuando el servidor dispone de él, retrasa ese momento trasladando a disco la memoria menos utilizada. Sirve de red de seguridad, no de capacidad: un servidor que se apoya en el swap de forma continua responde varias veces más lento, incluso sobre un SSD NVMe.
Los remedios, del más sencillo al más duradero: reducir el número de procesos de la aplicación (pm.max_children, workers de Gunicorn), compilar fuera del servidor, limitar la memoria de la base de datos y, después, pasar a un tamaño superior.
La memoria no es el único recurso: el procesador cuenta para todo lo que calcula (compilación, tratamiento de imágenes, ejecución de un modelo de IA), y el disco para la base de datos y los archivos. Aun así, en una aplicación web es casi siempre la memoria la que fija el tamaño.
El VPS Pro se ofrece en seis tamaños, sobre procesadores Intel Xeon, memoria ECC y SSD NVMe en espejo, y pasa al tamaño superior en cualquier momento, sin reinstalación. La Asistencia integral está incluida: descríbanos lo que ejecutará su servidor y le aconsejamos el tamaño; después, ante cada pregunta, diagnosticamos y le indicamos qué hacer, desde el sistema hasta el código de su aplicación.
Un sitio estático, un proxy o un pequeño script funcionan con 1 a 2 GB. En cuanto una base de datos y una aplicación (PHP, Node.js, Python) comparten el servidor, cuente 2 GB para un sitio WordPress y 4 GB para una aplicación a medida con PostgreSQL.
2 GB para un sitio con MariaDB y una caché de páginas, 4 GB para una tienda WooCommerce o varios sitios. El número de procesos PHP-FPM es el primer ajuste: cada uno ocupa de 40 a 80 MB.
No. El swap evita una parada brusca cuando la memoria está llena, pero un servidor que lo usa de forma continua responde varias veces más lento, incluso sobre un SSD NVMe. Es una red de seguridad; el tamaño se elige según la memoria.
Porque Linux usa la memoria no utilizada como caché de archivos. Esa caché se libera en cuanto un programa necesita memoria. La columna que hay que leer es available, que indica la memoria realmente disponible.
Cuente de 1 a 2 GB solo para la compilación, además de lo que ya se ejecuta en el servidor. Compilar en su equipo o en su integración continua, y subir solo el resultado, evita ese pico.
Simafri
Hablemos de su proyecto
Díganos en pocas palabras lo que necesita: le respondemos rápidamente.
¡Gracias! Su solicitud ha sido enviada. Le responderemos en breve.
¿Prefiere el correo? Escríbanos a support@simafri.com.