2012/1/10 Leonardo Ivars <[email protected]>

> On 09/01/12 21:41, Federico Budassi wrote:
>
>> Gente,
>>
>> después de unos cuatro años sin postear en esta lista en particular,
>> vuelvo
>> a hacerlo con un problema que me tiene a mal traer.
>>
>> Esta es la situación, para mi tesis de grado, investigando acerca de Event
>> Driven Web Servers, intento sacar una comparativa de cantidad máxima de
>> conexiones keep alive atendidas por distintos Http servers. En particular,
>> estoy intentando generar la mayor cantidad de conexiones keep-alive con
>> Apache 2.2.20, corriendo en un Ubuntu Server x64 11.10 virtualizado en un
>> Vmware (que corre sobre otro Ubuntu Desktop x64 11.04). Qué significa
>> esto?
>> que con un benchmark (programado por mi en Java, por no servir
>> ApacheBenchmark, ni httpref, ni JMeter entre otros) genero miles de
>> requests GET hacia ese Apache y las dejo abiertas, viendo cual es el
>> límite
>> al que puedo llegar con los 8GB de memoria que tengo asignados a esa
>> máquina virtual. Obviamente el benchmark no genera esas conexiones
>> generando un thread por cada una, sino que las genera por medio de un
>> framework que maneja eventos (Netty), y por lo tanto solo necesita un par
>> de docenas de threads para generar algo asi como 500000 conexiones con
>> otros 8GB de ram en otra máquina virtual.
>>
>> La cuestión es que Apache, con su módulo de multiprocesamiento Worker
>> (mpm_worker_module), el que trae por defecto en ubuntu, genera un hilo por
>> cada conexión (situación que es querida por mi en este caso, para probar
>> el
>> límite de conexiones al cual puedo llegar con la memoria antes dicha).
>> Ahora, llegado cierto punto, el sistema operativo no le permite a apache
>> seguir generando hilos, y en /var/log/apache2/errors.log, apache comienza
>> a
>> quejarse con logs como este:
>>
>> [Sun Jan 08 22:00:32 2012] [alert] (11)Resource temporarily unavailable:
>> apr_thread_create: unable to create worker thread
>>
>> Lo cual deja casi obvio que el kernel le está impidiendo seguir abriendo
>> threads.
>>
>> Acá van algunas configuraciones que he estado teniendo que realizar para
>> lograr agrandar otros límites (antes solo podía llegar a ~32000
>> conexiones):
>>
>>
>>    - /etc/security/limits.conf (ayuda para cambiar algunos límites
>> visibles
>>
>>    con ulimit que impedían crear más procesos entre otras cosas):
>>
>> * soft  nofile   1000000
>> * hard  nofile   1000000
>> * soft stack 1024
>> * hard stack 1024
>> * soft nproc 1000000
>> * hard nproc 1000000
>> * soft sigpending 1000000
>> * hard sigpending 1000000
>>
>>
>>    - /etc/apache2/apache2.conf
>>
>>
>> Timeout 86400
>>
>> KeepAlive On
>>
>> MaxKeepAliveRequests 0
>>
>> KeepAliveTimeout 86400
>>
>> <IfModule mpm_worker_module>
>>     ServerLimit         100
>>     StartServers         30
>>     MinSpareThreads   70000
>>     MaxSpareThreads   90000
>>     ThreadLimit        4000
>>     ThreadsPerChild    4000
>>     ThreadStackSize  262144
>>     MaxClients       200000
>>     MaxRequestsPerChild   0
>> </IfModule>
>>
>>
>>    - Otras configuraciones y comandos (la primera linea genera varios
>> alias
>>
>>    a una interfaz para tener más de 65530 puertos y poder atender muchas
>> más
>>    conexiones):
>>
>> for i in `seq 20 35`; do ifconfig eth0:$i 192.168.1.$i up ; done
>> echo "1024 65535">  /proc/sys/net/ipv4/ip_local_**port_range
>> swapoff -a
>> sysctl vm.max_map_count=1000000
>> sysctl kernel.threads-max=1000000
>> sysctl kernel.pid_max=1000000
>>
>>
>> En todo lo anterior pueden ver modificaciones a límites del sistema
>> operativo, una parte de la configuración de apache (la parte que importa),
>> y algunos comandos que corro cada vez que arranco el sistema para
>> incrementar límites o crear muchos aliases para una misma interfaces para
>> poder recibir más de 65536 conexiones por interfaz.
>>
>> Las conexiones que se generan son simples peticiones estáticas del
>> index.html con HTTP/1.1 con el header Connection: keep-alive, de tal forma
>> que las conexiones queden abiertas (y como hay un timeout de 1 día, o
>> 86400
>> segundos, no se cierran).
>>
>> La cuestión es simple, como podrán ver, la configuración del worker_mpm de
>> apache acepta un máximo de 200000 conexiones, y abre al arranque 70000
>> conexiones, aunque debido a alguna limitación del kernel que estoy pasando
>> por algo, o que no conozco, apache no es capaz de crear más de
>> aproximadamente 60000 conexiones (o hilos, dicho de otra forma). Necesito
>> al menos duplicar ese valor para poder llenar la memoria de mi computadora
>> de conexiones.
>>
>> Espero que todo esto se haya entendido bien y comprendan mi punto, si no
>> se
>> entiende, pregunten.
>>
>> Muchas gracias por su ayuda, la cual sera muy bien recibida!
>>
>> Federico Budassi.
>>
> Esto sobrepasa ampliamente mis conocimientos pero de caradura te sugiero
> ver los socket y cosas relacionadas con iptables (connection tracking etc)
>
> Saludos.
>

Estoy medianamente seguro de que no tiene nada que ver con sockets o
iptables. De hecho, y con técnicas de programación asincrónica (eventos),
en esta misma máquina virtual he llegado a atender 520.000 conexiones
abiertas a la vez.... un lindo número (con suficiente ram, claro).

Gracias!

Federico.

Responder a