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