Trucos y consejos para optimizar la memoria RAM en un servidor VPS con Virtualmin

Actualizada:

Ya he comentado alguna vez que si tienes poca memoria RAM en tu servidor Web es una locura instalar WHM/cPanel y que una mejor opción es utilizar Virtualmin/Webmin, pero ¿Podemos configurar Virtualmin y nuestro servidor para utilizar menos RAM? Sí.

Si tienes un sistema con 2 GB de RAM o menos, puedes mejorar el rendimiento del servidor con algunos sencillos trucos.

¡Ojo! Lo primero que tienes que tener bien configurado es una buena memoria SWAP para que Linux envíe procesos a esa memoria. Te puede salvar en caso de picos de tráfico en tu web.

Podemos conseguir que Virtualmin use menos de 50 MB de RAM, pero también hay que prestar atención a los procesos de Apache (200- 250 MB) si tenemos activos todos los módulos, MySQL o MariaDB (400 MB o más), BIND (100 MB) o PHP (100 MB o más).

Te puede interesar: ¿Cuál es el mejor panel de control gratuito para un servidor linux?, o Cómo cambiar la IP de un servidor con Virtualmin, Webmin. O como instalarlo: Cómo instalar Virtualmin en tu servidor Linux.

Trucos para optimizar el consumo de memoria RAM en un servidor VPS con Virtualmin

1.-Desactivamos la pre-carga de librerías de Virtualmin

Desactivamos la pre-carga de librerias de Virtualmin

Vamos a System Settings > Virtualmin Configuration y cambiamos «Preload Virtualmin libraries at startup» a No.

Reduciremos el consumo de unos 120 MB en un sistema de 64bit hasta solo unos 10 MB de RAM.

2.-Reducir uso de memoria de SpamAssassin y ClamAV

Si no los necesitas, desactívalos. Tienes que ir a Virtualmin > Email Settings > Spam and Virus Scanning:

Desactivar SpamAssassin y ClamAV en Virtualmin si no los necesitas.

Pero si quieres reducir su uso de RAM puedes hacer lo siguiente en Virtualmin:

Vamos a Virtualmin > Email Settings > Spam and Virus Scanning y elegimos:

  • Ponemos SpamAssassin a spamassassin (Standalone program)
  • Ponemos Virus scanning program a Standalone scanner (clamscan)

Te puede interesar: Cómo proteger un servidor Linux de Malware con Maldet y ClamAV

3.-Reducir el uso de memoria de Apache

Aquí depende mucho de cuanta RAM dispongas, así que lo mejor es ir probando. Puedes tomar unos valores de referencia e ir modificándolos con el paso del tiempo. Puedes usar el programa Apache2Buddy, para que te vaya dando referencias.

Salida de apachebuddy

Te he contado todos los trucos en: Cómo optimizar Apache en función de la memoria RAM de tu servidor

Puedes usar un script como ps_mem.py para ajustar muchos de estos parámetros teniendo en cuenta la memoria que usan tus procesos PHP, Apache, MySQL y demás. Puedes calcular fácilmente la memoria de cada proceso httpd con:

  • ps -ylC httpd –sort:rss

También puedes tener en cuenta estas fórmulas:

  • MaxRequestWorkers = Memoria disponible para Apache / Memoria por proceso de Apache
  • ServerLimit = MaxRequestWorkers / ThreadsPerChild (Debe ser mayor o igual que MaxRequestWorkers)
    • También se usa: ServerLimit x 25 = MaxRequestWorkers
    • Pero mucha gente lo optimiza a MaxRequestWorkers = ServerLimit especialmente cuando se utiliza MPM event. Esto asegura que la cantidad máxima de procesos hijos permitidos coincide con la capacidad de manejo de solicitudes simultáneas, simplificando la configuración y evitando inconsistencias.
  • ThreadsPerChild, ThreadLimit, StartServers, MinSpareThreads, MaxSpareThreads: Ajustados para balancear la carga y optimizar el uso de recursos.
  • MaxConnectionsPerChild: Para reciclar procesos y evitar fugas de memoria.

¿Algo por donde empezar para sistemas con poca RAM? Editamos el archivo de configuración de Apache:

  • RHEL y Rocky Linux: vi /etc/httpd/conf/httpd.conf
  • Debian/Ubuntu: vi /etc/apache2/apache2.conf

y cambiamos lo siguiente. Si tienes activo Prefork MPM:

<IfModule prefork.c>
    StartServers            2
    MinSpareServers         2
    MaxSpareServers         5
    MaxRequestWorkers       50
    MaxConnectionsPerChild  500
</IfModule>

Si tienes activo Worker MPM:

<IfModule worker.c>
    StartServers            2
    MinSpareThreads         8
    MaxSpareThreads         16
    ThreadLimit             64
    ThreadsPerChild         12
    MaxRequestWorkers       50
    MaxConnectionsPerChild  500
</IfModule>

Si tienes activo Event MPM:

<IfModule event.c>
    StartServers            1
    MinSpareThreads         10
    MaxSpareThreads         25
    ThreadLimit             64
    ThreadsPerChild         10
    MaxRequestWorkers       50
    MaxConnectionsPerChild  500
</IfModule>

También podemos desactivar los modulos de Apache que no necesitemos.

4.-La memoria de PHP

En Virtualmin puedes ir a Web Configuration > PHP-FPM Configuration > Resource Limits y poner unos límites razonables a tus valores de PHP. Esto es muy importante sobre todo si usas WordPress. Puedes empezar con los valores de la imagen.

Web Configuration > PHP-FPM Configuration > Resource Limits en Virtualmin con valores de ejemplo.

En Web Configuration > PHP Options tienes más opciones que puedes cambiar, como por ejemplo usar FPM y elegir el modo de administrador de procesos en dinámico: Este modo genera procesos secundarios basados en la demanda, proporcionando un buen equilibrio entre el rendimiento y el uso de la memoria. También puedes limitar el número de subprocesos.

¿Ejemplo si usas PHP-FPM? Tenemos que conocer cuanta memoria está usando cada proceso de PHP-FPM con este comando:

while true; do ps --no-headers -o "rss,cmd" -C php-fpm | grep "pool www" | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }' >> avg_php_proc; sleep 60; done

Imagínate que te sale que cada proceso ocupa 120 MB de memoria, y tienes 8 GB de RAM en tu servidor, de los cuales 1 GB lo usa tu sistema, 1 GB Opcache. Te quedan 6 a repartir. Haces esta operación: 6 * 1024 / 120= 51. Tu servidor puede manejar unos 50 hilos por lo que puedes poner una configuración de este estilo:

pm = dynamic
pm.max_children = 50
pm.start_servers = 12
pm.min_spare_servers = 12
pm.max_spare_servers = 36
pm.max_requests = 500

con:

  • pm.start_servers = 25% de max_children
  • pm.min_spare_servers = 25% de max_children
  • pm.max_spare_servers = 75% de max_children

Tienes que ir probando y ajustando. Fíjate muy bien en cuanta memoria usa MariaDB, Memcached o Apache. Te lo cuento todo en detalle en: Cómo configurar diferentes versiones de PHP en Rocky Linux 9 con repositorio de Remi.

5.-La memoria de MariaDB o MySQL

Para optimizar la memoria que usa tu base de datos, te he dado unos cuantos trucos en: Optimiza y tunea my.cnf (Mysql o MariaDB) en tu servidor VPS y en Cómo optimizar el valor de innodb_buffer_pool_size en MySQL o MariaDB.

  • Te puedes encontrar los archivos de configuración en varios sitios: /etc/mysql, /etc/my.cnf.d o dentro de /etc/mysql/mariadb.conf.d.
  • Hay varios programas que nos pueden ayudar a optimizar el archivo my.cnf de MySQL, como por ejemplo MySQLTuner.

Tienes que añadir o cambiar algunos parámetros dentro de la directiva [mysqld]:

innodb_buffer_pool_size         = 32M
innodb_log_buffer_size          = 4M
innodb_flush_log_at_trx_commit  = 2
query_cache_type                = 0
query_cache_size                = 0
max_connections                 = 50
max_user_connections            = 50
key_buffer_size                 = 4M
max_allowed_packet              = 2M
table_open_cache                = 16
sort_buffer_size                = 64K
read_buffer_size                = 32K
read_rnd_buffer_size            = 128K
net_buffer_length               = 2K
thread_stack                    = 256K

¿Valores más importantes a tunear?

  1. max_connections: Define el número máximo de conexiones simultáneas permitidas.
  2. innodb_buffer_pool_size: Tamaño del pool de buffers de InnoDB. Este es probablemente el parámetro más importante para el rendimiento de InnoDB, ya que almacena los datos y los índices en memoria.
  3. innodb_log_file_size: Tamaño de los archivos de log de InnoDB. Un tamaño mayor puede mejorar el rendimiento de las operaciones de escritura, pero debes asegurarte de que sea coherente con el tamaño del pool de buffers.
  4. innodb_flush_method: Define el método de escritura de datos a disco. O_DIRECT puede ser una buena opción para evitar la doble caché entre MySQL y el sistema operativo.

6.-Desactivamos servicios no necesarios

Si no usas PostgreSQL, proftpd, Mailman, etc. puedes desactivarlos y ahorrar unos MB de RAM. En Virtualmin puedes ir a Webmin > System > Bootup and Shutdown. Ojo con para servicios que realmente necesites.

Desactivamos servicios no necesarios en tu servidor VPS con Virtuamin

7.-Configura una partición SWAP

Si tu sistema lo permite, configura una partición SWAP en tu sistema Linux.

Partición SWAP en mi VPS en Linode
#Verificamos que SWAP tenemos. En mi caso tenia una partición SWAP de solo 512 MB
sudo swapon --show
     
NAME     TYPE      SIZE USED PRIO
/dev/sda  partition    512M 256K   -2

#Creamos una SWAP de 8 GB y le asignamos los permisos correctos.
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile

#Comprobamos el tamaño y la asignación de permisos
ls -lh /swapfile

-rw------- 1 root root 8.0G May 28 17:06 /swapfile

#Le decimos al sistema que esa zona es SWAP
sudo mkswap /swapfile

Setting up swapspace version 1, size = 8 GiB (8589930496 bytes) no label, UUID=

#Activamos la meoria SWAP en el sistema y comprobamos que esta activada
sudo swapon /swapfile
sudo swapon --show

NAME      TYPE      SIZE USED PRIO
/dev/sda  partition     512M 256K   -2
/swapfile file              8G     0B       -3

#Comprobamos la amoria del sistema
free -h
               total        used        free      shared  buff/cache   available
Mem:      15Gi       8.2Gi       2.0Gi       1.1Gi       8.2Gi       7.2Gi
Swap:      8.5Gi      0.0Ki       8.5Gi

#Hacemos el cambio permanente despues de reinicios editando /etc/fstab con la linea /swapfile none swap sw 0 0

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

8.-Usa algún sistema de caché

Tienes que usar algún sistema de caché en tu servidor como el que te pueden proporcionar Memcached, Opcache, Varnish, Redis… hay muchas opciones ahí fuera, así que valora cuál se ajusta mejor a tu sistema. Yo utilizo Memcached y Opcache en mis páginas con WordPress.

9.-Aloja tus páginas web en un buen hosting

Realmente importante. Un buen hosting VPS puede marcar la diferencia. Yo ahora mismo estoy usando Linode (Akamai). Si te suscribes con este link, recibirás un crédito de 100 $ cuando agregues un método de pago válido a tu nueva cuenta.

Conclusión

Cómo puedes ver, hay una cuantas cosas que hacer para conseguir reducir el uso de memoria RAM en tu servidor VPS. Lo más importante es que configures bien Apache, MySQL y PHP, si estás usando WordPress para crear tu web.

Si tienes preguntas o dudas, deja un comentario y te intento ayudar.

Referencias:


Descubre más desde algoentremanos.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la lectura y los viajes, experto en tecnología e informática y fan de la privacidad online. Desde el año 2007 me he dedicado al SEO, a escribir y a crear páginas web con WordPress sobre todo tipo de temáticas. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si tienes preguntas, quieres que hagamos una review de una app, programa o producto, simplemente mándanos un e-mail mediante nuestro formulario de contacto. Te contestaremos en el menor tiempo posible. ¡Muchas gracias y salU2! Algoentremanos realiza reviews de manera profesional y en muchas ocasiones recibimos compensación de las compañías cuyos productos revisamos. Probamos cada producto a fondo y otorgamos altas calificaciones solo a los mejores. La propiedad de Algoentremanos.com es independiente y las opiniones expresadas aquí son solo nuestras. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a algoentremanos.com. Saber más.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.