Databases, informatica, WebHosting

LAMP en servidores con poca memoria

Buen día lectores del blog mas inactivo del internet, hoy me he encontrado con que apache 2 y mysql ya no son los pesos livianos de hace unos 10 años, como es normal con casi todo el software cada ves se requiere que cada programa realice mas funciones o que se extienda la cantidad de conexiones que debe soportar para mantener el servicio funcionando.

El problema

Actualmente pasamos por la era dorada de la “nube” en la que cada quien puede tener su propio servidor a bajo costo, pero como se imaginarán las opciones mas baratas (o de membresía gratis) vienen tambien con enormes limitantes como el AWS EC2 cuyos servidores minimos corren con unos esqueléticos 512mb de memoria (hace poco aumentó a 1gb), no es  tan grave hasta que instalamos nuestro stack LAMP con el mysql de oracle y apache 2 estandar en debian, solo MySQL puede llegar a unos enormes (para este caso) 400mb al inicio y recién instalado, y apache en el rango de los 100mb  dejan practicamente nada para el SO, lo que hace colapsar alguno de los servicios con errores de “not enough memory”, esto también es el caso en computadoras para desarrollar páginas web donde solo se tengan 1 o 2gb de memoria y tengamos que correr un escritorio X al mismo tiempo que el stack web.

Haciendo adelgazar los servidores

Empezamos con apache que por defecto viene con el modulo mpm_worker que viene configurado para soportar miles de conexiones simultáneas generando varios threads podemos hacer que esas conexiones usen menos memoria y no causen timeout, para eso cambiamos este módulo de apache en su configuración de modulo /etc/apache2/modules-available/mpm_worker.conf

Por defecto es así:

<IfModule mpm_worker_module>
 StartServers 2
 MinSpareThreads 25
 MaxSpareThreads 75
 ThreadLimit 64
 ThreadsPerChild 25
 MaxRequestWorkers 150
 MaxConnectionsPerChild 0
</IfModule>


Y lo cambiamos de esta forma:

<IfModule mpm_worker_module>
    StartServers          1
    MinSpareThreads       5
    MaxSpareThreads      15 
    ThreadLimit          25
    ThreadsPerChild       5
    MaxRequestWorkers           25
    MaxConnectionsPerChild 200
</IfModule>


Si instalamos php7 apache automáticamente cambia de mpm_worker a mpm_prefork que se configura por defecto para el mismo principio de worker, una cantidad respetable de conexiones soportadas, este al igual que mpm_worker se configura en el directorio mods-available:

/etc/apache2/mods-available/mpm_prefork.conf

por defecto:

<IfModule mpm_prefork_module>
 StartServers 5
 MinSpareServers 2
 MaxSpareServers 25
 MaxRequestWorkers 300
 MaxConnectionsPerChild 0
</IfModule>

Cambiamos a:

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers       3
    MaxRequestWorkers          10
    MaxConnectionsPerChild 3000
</IfModule>

Y ahora reiniciamos apache para que los cambios se apliquen, lo que cambiamos es la cantidad de “servers” o “threads” que se inician para soportar cada conexión, en lugar de eso habilitamos mas clientes por cada thread para que no se colapse el servicio ni se eleve la memoria considerablemente, pasamos de un apache 2 de 90-100mb a uno de 25mb.

Ahora MySQL, hay muchas técnicas que se pueden aplicar, especialmente los cambios en caché y loggin (depende del uso que tendrá) pero hay una función específica que genera un enorme gasto, performance_schema, este es una precarga de estadísticas para MySQL y en base a esa precarga MySQL reserva la memoria que va a necesitar para sus transacciones DURANTE STARTUP, acaparando toda la memoria, por defecto usa 400mb en mi máquina de prueba.
Para deshabilitarlo vamos al archivo /etc/mysql/mysql.conf.d/mysqld.cnf y agregamos al final del archivo:

performance_schema = off

Reiniciamos el servicio y vemos una mejora sustancial en la memoria usada por mysql de 400mb a 39mb, claro hay otras técnicas que nos pueden ayudar especialmente si por alguna razón necesitamos tener performance_schema funcionando (Grandes consultas o grandes cantidades de ellas simultáneamente), les dejo la fuente donde hay mas información al respecto, mis pruebas fueron en una netbook con 1gb de ram corriendo debian stretch con mysql de los repositorios de oracle, la fuente hizo sus pruebas en el low tier de digital ocean que solo otorga 1cpu y 512mb de memoria.

Fuente:

https://www.narga.net/optimizing-apachephpmysql-low-memory-server/

Anuncios
Estándar