En general la forma de calcular cuanta gente puede acceder de manera concurrente a mi servidor web ( MaxClients ) es sencilla pero bastante manual. Encontré un script en la web de referencia que me puede ayudar a hacerlo de manera más práctica así que lo comparto.
Hace algunos años desarrollando un sistema de regalos corporativos fue la primera vez que me encontré con este problema, si está mal definida la cantidad máxima de usuarios que pueden acceder al apache este consume mucha memoria y en el caso de que tengas el servidor MySQL en el mismo lugar este puede caerse sin ningún aviso.
La idea es que podamos definir bien la cantidad de usuario que puede manejar apache.
Este es el procedimiento que seguiremos.
- Definir cantidad de usuarios que pueden acceder concurrentemente al sistema.
- Modificar apache para que pueda soportar esta nueva cantidad de usuarios.
Definiendo cantidad de usuarios que pueden acceder
Antes que todo debemos saber cuanta Memoria Ram ( no Swap ! ) tiene nuestro sistema. Eso lo podemos lograr con el comando «free -m«.
ubuntu@ip-10-10-10-69:~$ free -m total used free shared buffers cached Mem: 7983 6620 1363 63 183 5584 -/+ buffers/cache: 852 7131 Swap: 0 0 0
En mi caso mi servidor tiene 8Gigas de memoria. Ahora debemos revisar cuanto ocupa Apache ( Ojo, pestaña y ceja, la idea es que apache ocupe la menor cantidad de recursos posibles, para ello puedes optimizar tu sitio con herramientas para el cache).
Para definir la cantidad de memoria que ocupa Apache usaremos un script que nos dice la cantidad de memoria utilizada por proceso llamado ps_mem.py.
Antes de ejecutar esta herramienta simularemos tráfico con BlazeMeter ( ¡La versión gratuita deberá ser suficiente por ahora !), que para mi es la forma más sencilla de simular el tráfico.
Una vez simulado el tráfico, o durante el utilizamos el script.
ubuntu@ip-10-10-10-69:~$ sudo python ps_mem.py Private + Shared = RAM used Program 172.0 KiB + 28.5 KiB = 200.5 KiB acpid 188.0 KiB + 17.5 KiB = 205.5 KiB sh 188.0 KiB + 27.5 KiB = 215.5 KiB atd 256.0 KiB + 54.0 KiB = 310.0 KiB upstart-file-bridge 256.0 KiB + 54.5 KiB = 310.5 KiB upstart-socket-bridge 288.0 KiB + 54.0 KiB = 342.0 KiB cron 288.0 KiB + 79.5 KiB = 367.5 KiB upstart-udev-bridge 484.0 KiB + 180.0 KiB = 664.0 KiB su 560.0 KiB + 127.5 KiB = 687.5 KiB systemd-logind 760.0 KiB + 48.5 KiB = 808.5 KiB dbus-daemon 788.0 KiB + 67.5 KiB = 855.5 KiB systemd-udevd 1.1 MiB + 264.0 KiB = 1.3 MiB getty (7) 1.5 MiB + 58.5 KiB = 1.6 MiB rsyslogd 1.0 MiB + 659.0 KiB = 1.6 MiB sudo (2) 1.6 MiB + 106.5 KiB = 1.7 MiB init 1.7 MiB + 49.0 KiB = 1.8 MiB screen 2.1 MiB + 128.0 KiB = 2.2 MiB sendmail-mta 2.6 MiB + 17.0 KiB = 2.6 MiB dhclient 1.3 MiB + 2.1 MiB = 3.4 MiB sshd (3) 9.0 MiB + 1.2 MiB = 10.1 MiB bash (6) 23.8 MiB + 93.5 KiB = 23.9 MiB miniserv.pl 102.7 MiB + 1.6 MiB = 104.3 MiB ajenti-panel 129.6 MiB + 242.5 KiB = 129.8 MiB mysqld 1.6 GiB + 59.7 MiB = 1.7 GiB apache2 (61) --------------------------------- 2.0 GiB =================================
En este caso tenemos que el sistema está usando 2G en total de memoria en donde apache lidera el consumo con 1.7G y 61 usuarios concurrentes.
Para calcular la memoria de apache2 tomaremos las siguientes consideraciones.
- Cuanta memoria reservaremos para el sistema.
- Cuanta memoria usaremos para mysql.
- Cuanta memoria usa en promedio un cliente conectado.
- La diferencia entre la memoria disponible y la usada por los otros servicios es la que usaremos para apache.
Por ahora asumiré que ningún otro proceso correrá en el servidor, por lo que 256 megas será suficiente para el sistema.
Mysql usa menos del 10% de apache para 61 usuarios. Es razonable asumir que no pasaremos del uso de 1GB, por lo que usaremos esa cantidad.
Con 61 usuarios conectados el sistema usa 1.7GB de ram, lo que es aproximadamente 28 Megas por cliente conectado. ( En el peor caso. )
La memoria aproximada disponible son los 8Gigas menos 1GB de Mysql menos 256 megas en ram menos 256 megas en ram para tener un margen de error considerable. Esto nos da 6.5GB de ram aproximados disponibles.
6.5*1024/28 = 237
Lo anterior nos da 237 usuarios concurrentes. En mi caso lo dejaré en 250 debido a que la ram ocupada por usuario en general sera menor que los 28 megas y estoy usando un buen sistema de cache para mi sitio.
Configurando el servidor con los nuevos datos.
En general puedes encontrar el archivo de configuración en /etc/apache2/apache2.conf o /etc/httpd/httpd.conf. En mi caso usando Ubuntu Server 14.04 la dirección para configurar el prefork aparece en la carpeta de configuraciones /etc/apache2/mods-enabled/mpm_prefork.conf .
# prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # MaxRequestWorkers: maximum number of server processes allowed to start # MaxConnectionsPerChild: maximum number of requests a server process serves <IfModule mpm_prefork_module> StartServers 15 MinSpareServers 15 MaxSpareServers 20 ServerLimit 250 MaxClients 250 MaxRequestsPerChild 4000 </IfModule>
Ok, ahora tenemos un servidor configurado para alojar 250 usuarios de manera concurrente. ¡Al mejorar el rendimiento de apache en el consumo de memoria pueden ser mucho más !
Origen: Fuscata Consulting :: Knowledge Base :: How To Set MaxClients in Apache/prefork