2012-04-13 19 views
5

He creado un servidor de mensajes personalizado en Java que toma una secuencia de mensajes y entrega cada mensaje a su cliente (1: 1, soltar mensaje si no está conectado, muy simple). Estoy ejecutando Tomcat 7 en Win7x64 & Java 7 y estoy usando el conector NIO (implementado un servlet Comet). Funciona muy bien, pero ahora estoy buscando escalar esa bestia y actualmente estoy viendo unos 85 kb de RAM asignados para cada cliente conectado. 10.000 clientes @ por debajo de 900MB y escalado linealmente. (No estoy haciendo otra cosa más que mantener la conexión aún). Eso es bastante en mi opinión, por lo que me pregunto si hay algunos ajustes para hacer que Tomcat o Java guarden más memoria con su impl de NIO. Todas las configuraciones de Tomcat que probé hasta ahora no afectaron esto en absoluto.minimizar la huella de memoria "por conexión" de Tomcat

¿Alguien tiene experiencia en cómo poner a Java o Tomcat en una dieta de memoria con respecto a las conexiones de socket?

ACTUALIZACIÓN: Ahora tengo menos de 70kb/conexión al recortar los buffers de socket y algunas otras partes internas de tomcat. No estoy seguro de cómo esto ahora influye en el rendimiento. También lo probé en 32 bits/64 bits con el mismo resultado.

+0

¿Cómo midió 85kb por cliente? – dash1e

+0

Hice una pequeña prueba de carga y conecté 10.000 clientes. En el código del servidor, hice después de cada 100 clientes un System.gc() y luego imprimí Runtime.totalMemory() - Runtime.freeMemory() en la consola. – Daniel

+0

Hola. ¿Puedes compartir tus mejores configuraciones de Tomcat/JVM? Además, ¿usaste el conector NIO? 10x – JRun

Respuesta

1

Después de investigar un poco, llegué a la conclusión de que simplemente no es posible con Tomcat manejar una gran cantidad de conexiones simultáneas con una cantidad razonable de memoria. (Todavía estaría feliz de estar equivocado aquí por cierto)

Sin embargo, hay un Salvador:

Netty: http://www.jboss.org/netty/downloads

Es un marco de Java IO que se basa en la nueva arquitectura NIO de Java y parece muy bien diseñado y escrito. Puede apilar algunos módulos livianos y crear un mini servidor web o simplemente manejar las conexiones TCP usted mismo de una manera asincrónica.

Realicé una prueba de carga en EC2 y llegué a una increíble cifra de 7 MILLONES de conexiones @ ¡solo 1.5 GB de RAM! (como con la prueba de Tomcat, no hice más que almacenar las conexiones, por lo que una aplicación real consumirá un poco más de memoria, ¡pero 200 bytes/conexión "por encima" no es nada!) Y solo se detuvo allí porque limité la máquina virtual Java a 1,5 GB, estoy seguro de que una prueba C10M sería fácilmente factible.

Grandes felicitaciones a Netty y Java VM chicos! Estoy impresionado.

Cuestiones relacionadas