2010-01-24 21 views
9

¿La biblioteca erlang TCP/IP tiene algunas limitaciones? He hecho algunas búsquedas, pero no puedo encontrar ninguna respuesta definitiva.¿Número máximo de puertos abiertos simultáneos de Erlang?

He establecido la variable de entorno ERL_MAX_PORTS en 12000 y configurado Yaws para usar conexiones ilimitadas.

He escrito una sencilla aplicación de cliente que se conecta a un appmod que he escrito para Yaws y estoy probando el número de conexiones simultáneas lanzando X número de clientes, todo al mismo tiempo.

Me parece que cuando llego a alrededor de 100 clientes, el servidor pian deja de aceptar más conexiones TCP y los errores del cliente con

 
Error in process with exit value: {{badmatch,{error,socket_closed_remotely}} 

sé que debe haber un límite para el número de conexiones simultáneas abiertas , pero 100 parece realmente bajo Revisé toda la documentación del pian y eliminé cualquier límite en las conexiones.

Esto es un Intel Core 2 Duo iMac de 2.16Ghz con Snow Leopard.

Una prueba rápida en una máquina Vista muestra que tengo los mismos problemas en unas 300 conexiones.

¿Mi examen no es razonable? Es decir. ¿Es tonto abrir más de 100 conexiones simultáneamente para probar la concurrencia de Yaws?

Gracias.

+0

¿No 'socket_closed_remotely' sugiere que el problema está en el cliente? – Zed

+0

Actualicé mi respuesta después de su edición, probablemente es porque las abre todas al mismo tiempo. – stacker

+0

Zed: El mensaje de error es del lado del cliente, por lo que Yaws está cerrando el socket. No veo nada registrado en Yaws. – ckovacs

Respuesta

0

Después de probar la sugerencia de todos y revisar los documentos de Erlang, he llegado a la conclusión de que mi problema es que Yaws no puede seguir el ritmo de la carga.

En la misma máquina, un servidor web Apache Http Components (E/S no bloqueante) no tiene los mismos problemas para manejar conexiones en los mismos umbrales.

Gracias por su ayuda. Voy a pasar a otros servidores web basados ​​en erlang, como Mochiweb.

+0

Bueno, por supuesto que su respuesta no es la correcta para verificar como respuesta correcta. – Farsheed

6

Parece que golpea una limitación del sistema, trate de aumentar el número máximo de archivos abiertos utilizando

$ ulimit -n 500 

Python on Snow Leopard, how to open >255 sockets?

Erlang en sí tiene un límite de 1024:

De http://www.erlang.org/doc/man/erlang.html

El número máximo de puertos que se pueden abrir al mismo tiempo es 1024 de forma predeterminada, pero puede ser configurado por el entorno va ERL_MAX_PORTS confiable.

EDIT:

El sistema de llamada listen() tiene un atraso parámetro que determina el número de solicitudes pueden poner en cola, compruebe si un retraso entre las peticiones para establecer conexiones ayuda. Esto podría ser su problema.

+1

Si los puertos máximos se agotaron, el error sería 'enfile' y no' socket_closed_remotely'. – Zed

+0

Lo siento, olvidé mencionar que establecí ERL_MAX_PORTS a 12000 en las configuraciones OS X y Vista – ckovacs

+0

También intenté configurar ulimit con el mismo resultado – ckovacs

3

Todos los límites del sistema Erlang son reportados en la Guía de Eficiencia Erlang:

http://erlang.org/doc/efficiency_guide/advanced.html#id2265856

lectura de los puertos abiertos sección:

El número máximo de forma simultánea puertos Erlang abierto es por defecto 1024. Este límite puede elevarse hasta un máximo de 268435456 en el arranque (véase el medio ambiente ERL_MAX_PORTS variables en Erlang (3)) El límite máximo de 268435456 puertos abiertos será, al menos, en una arquitectura de 32 bits imposible alcanzar debido a la escasez de memoria.

Cuestiones relacionadas