Discussion:
Más de ~60000 conexiones con Apache (httpd) o dicho de otra forma, más de aproximadamente 60000 hilos en Linux.
Federico Budassi
2012-01-10 00:41:15 UTC
Permalink
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.
MAbeeTT
2012-01-10 04:32:32 UTC
Permalink
Post by Federico Budassi
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
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
  - /etc/security/limits.conf (ayuda para cambiar algunos límites visibles
* 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
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.
mmmm, si creés que está en el kernel, mirá los logs que deja el
kernel, y eventualmente agregá verbosidad, no recuerdo exactamente
pero creo que e puede agregar bastante vervosidad sin necesidad de
recompilar, vía parámetros del kernel.
Post by Federico Budassi
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.
--
             .::MAbeeTT::.

 mabeett [at] gmail [ dot] com
Federico Budassi
2012-01-11 01:26:55 UTC
Permalink
Post by Federico Budassi
Post by Federico Budassi
Gente,
después de unos cuatro años sin postear en esta lista en particular,
vuelvo
Post by Federico Budassi
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
Post by Federico Budassi
Driven Web Servers, intento sacar una comparativa de cantidad máxima de
conexiones keep alive atendidas por distintos Http servers. En
particular,
Post by Federico Budassi
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?
Post by Federico Budassi
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
Post by Federico Budassi
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
Post by Federico Budassi
cada conexión (situación que es querida por mi en este caso, para probar
el
Post by Federico Budassi
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
Post by Federico Budassi
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
- /etc/security/limits.conf (ayuda para cambiar algunos límites
visibles
Post by Federico Budassi
* 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
Post by Federico Budassi
a una interfaz para tener más de 65530 puertos y poder atender muchas
más
Post by Federico Budassi
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),
Post by Federico Budassi
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
Post by Federico Budassi
que las conexiones queden abiertas (y como hay un timeout de 1 día, o
86400
Post by Federico Budassi
segundos, no se cierran).
La cuestión es simple, como podrán ver, la configuración del worker_mpm
de
Post by Federico Budassi
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
Post by Federico Budassi
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
Post by Federico Budassi
de conexiones.
mmmm, si creés que está en el kernel, mirá los logs que deja el
kernel, y eventualmente agregá verbosidad, no recuerdo exactamente
pero creo que e puede agregar bastante vervosidad sin necesidad de
recompilar, vía parámetros del kernel.
Post by Federico Budassi
Espero que todo esto se haya entendido bien y comprendan mi punto, si no
se
Post by Federico Budassi
entiende, pregunten.
Muchas gracias por su ayuda, la cual sera muy bien recibida!
Federico Budassi.
--
.::MAbeeTT::.
mabeett [at] gmail [ dot] com
No se si lo estaré haciendo bien, pero intenté usar dmesg y nada, y le subí
el nivel de logueo a 8 con sudo dmesg -n 8, pero no loguea nada de nada con
respecto a apache.

Es eso a lo que vos hacías referencia?

Gracias!
Federico.
MAbeeTT
2012-01-11 05:57:54 UTC
Permalink
Post by Federico Budassi
Post by Federico Budassi
Post by Federico Budassi
Gente,
después de unos cuatro años sin postear en esta lista en particular,
[...]
Post by Federico Budassi
Post by Federico Budassi
Post by Federico Budassi
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
Post by Federico Budassi
de conexiones.
mmmm, si creés que está en el kernel, mirá los logs que deja el
kernel, y eventualmente agregá verbosidad, no recuerdo exactamente
pero creo que e puede agregar bastante vervosidad sin necesidad de
recompilar, vía parámetros del kernel.
[...]
Post by Federico Budassi
No se si lo estaré haciendo bien, pero intenté usar dmesg y nada, y le subí
el nivel de logueo a 8 con sudo dmesg -n 8, pero no loguea nada de nada con
respecto a apache.
No soy un gurú del kernel, pero se puede agregar verbosidad para
depuración justamente. No sé si se puede conseguir en tiempo de
ejecución, al arrancar (agregando algún parámetro al kernel al
arrancar en grub) o solamente recompilando (que seguro, en algún
momento puse depuración de USB, porque tenía problemas con un
dispositivo que no respondía exactamente a mass-storage, fue hace
muchos años). Tal vez la verbosidad te moleste, entonces podés decir
en los parámetros de arranque que use el puerto serie para imprimir
los datos, entonces no recargas al sistema de archivos escribiendo
tanta información.

Hay opciones de depuración que se pueden activar al momento de
compilar el kernel, en cada una de las distintas secciones, algo más
sencillo, tal vez menos informativo, para pedir en tiempo de ejecución
estaría muy bueno.

Antes de eso consideraría levantar junto a apache otro webserver
(podría ser el webserver sencillo es de python, tomcat, etc) y también
exigirlo con las solicitudes, entonces.
a) levantar apache
b) pedir los GETs a apache
c) levantar webserver alternativo
d) pedir GETs a server alternativo

Si luego de esto no te da las conexiones para el 2do webserver, seguro
es algo que está fuera de apache ( una limitación vía kernel ?), sino:
no podemos afirmar lo contrario :(
Post by Federico Budassi
Es eso a lo que vos hacías referencia?
de alguna manera
Post by Federico Budassi
Gracias!
Contanos los avances!
Post by Federico Budassi
Federico.
--
             .::MAbeeTT::.

 mabeett [at] gmail [ dot] com
Leonardo Ivars
2012-01-10 10:52:03 UTC
Permalink
Post by Federico Budassi
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
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
- /etc/security/limits.conf (ayuda para cambiar algunos límites visibles
* 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
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.
Emiliano Romero
2012-01-10 11:43:20 UTC
Permalink
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!
Post by Leonardo Ivars
Post by Federico Budassi
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
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
- /etc/security/limits.conf (ayuda para cambiar algunos límites visibles
* 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
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.
Federico Budassi
2012-01-11 00:47:12 UTC
Permalink
Post by Emiliano Romero
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!
Post by Leonardo Ivars
Post by Federico Budassi
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
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
- /etc/security/limits.conf (ayuda para cambiar algunos límites visibles
* 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
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.
Federico Budassi
2012-01-11 00:58:22 UTC
Permalink
Post by Leonardo Ivars
Post by Federico Budassi
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
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
- /etc/security/limits.conf (ayuda para cambiar algunos límites visibles
* 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
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.
Loading...