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
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:
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.
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.
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?
- max_connections: Define el número máximo de conexiones simultáneas permitidas.
- 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.
- 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.
- 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.
7.-Configura una partición SWAP
Si tu sistema lo permite, configura una partición SWAP en tu sistema Linux.
#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: