2012/1/10 Emiliano Romero <[email protected]>

> Buenas! cuando deja de abrir workers... cuantos descriptors tenes
> abiertos???
> cat /proc/sys/fs/file-nr
>
> El primer dato es la cantidad de descriptors abiertos y el ultimo dato es
> el maximo.
>
> Igualmente por mas que puedas abrir x conexiones no quiere decir que
> funcione ;)
>
> Saludos!
>
>
> On 01/10/2012 07:52 AM, Leonardo Ivars wrote:
>
>> 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.
>>
>>
Con respecto al comando cat /proc/sys/fs/file-nr lo acabo de ejecutar, y
antes de arrancar apache está en estos números:
480    0    781903

Luego de arrancar Apache, los números se mantienen exactamente iguales,
aunque apache está configurado para abrir automáticamente 70000 hilos en
espera, de los cuales solo abre ~60000. Por lo tanto descartaría la
cantidad de descriptores... además de que esa cantidad es generosamente
grande porque la sobreescribí a mano en limits.conf (781903, aunque yo le
di 1 millon....  :-)


Gracias por la ayuda!
Federico.

Responder a