¿Cuántos recursos del sistema se guardarán para mantener abierto 1,000,000 websocket? [cerrado]

122

Websocket es bueno, pero ¿podría manejar 1,000,000 de conexiones concurrentes?
¿Cuántos recursos del sistema se guardarán para mantener abierto 1,000,000 websocket?

kk lou
fuente

Respuestas:

65

Respuesta actualizada

Respuesta corta : sí, pero es caro.

Respuesta larga :

Esta pregunta no es exclusiva de WebSockets, ya que los WebSockets son básicamente sockets TCP de larga duración con un protocolo de enlace similar a HTTP y un encuadre mínimo para los mensajes.

La verdadera pregunta es: ¿podría un solo servidor manejar 1,000,000 de conexiones de socket simultáneas y qué recursos del servidor consumiría esto? La respuesta es complicada por varios factores, pero 1,000,000 de conexiones de socket activas simultáneas son posibles para un sistema de tamaño adecuado (mucha CPU, RAM y redes rápidas) y con un sistema de servidor sintonizado y software de servidor optimizado.

El número de conexiones no es el problema principal (que es principalmente una cuestión de ajuste del kernel y suficiente memoria), es el procesamiento y envío / recepción de datos hacia / desde cada una de esas conexiones. Si las conexiones entrantes se extienden durante un período prolongado, y en su mayoría están inactivas o envían con poca frecuencia pequeños fragmentos de datos estáticos, probablemente podría obtener mucho más que incluso 1,000,000 de conexiones simultáneas. Sin embargo, incluso en esas condiciones (conexiones lentas que en su mayoría están inactivas), aún tendrá problemas con las redes, los sistemas de servidor y las bibliotecas de servidor que no están configurados y diseñados para manejar un gran número de conexiones.

Consulte la respuesta de Alessandro Alinone sobre el uso aproximado de recursos para 500.000 conexiones.

Aquí hay algunos recursos más antiguos pero aún aplicables para leer sobre cómo configuraría su servidor y escribiría su software de servidor para admitir un gran número de conexiones:

canaca
fuente
1
Aparentemente, son posibles 12 millones de conexiones de socket en una sola JVM. Vea cómo lo hicieron mrotaru.wordpress.com/2013/10/10/…
Jacques Koorts
@JacquesKoorts thx
BG BRUNO
159

En los sistemas actuales, manejar 1 millón de conexiones TCP simultáneas no es un problema.

Puedo afirmar eso en base a nuestras propias pruebas (divulgación completa: soy el CTO en Lightstreamer).

Tuvimos que demostrar varias veces, a algunos de nuestros clientes, que se puede alcanzar 1 millón de conexiones en una sola caja (y no necesariamente en una máquina super-monstruo). Pero permítanme recapitular la configuración en la que probamos 500K conexiones simultáneas, ya que esta es una prueba mucho más reciente realizada en Amazon EC2.

Instalamos Lightstreamer Server (que es un servidor WebSocket, entre otras cosas) en una instancia m2.4xlarge. Esto significa 8 núcleos y 68,4 GiB de memoria.

Lanzamos 11 máquinas cliente para crear 500.000 conexiones simultáneas al servidor Lightstreamer. La prueba se configuró para que el rendimiento de salida total del servidor fuera de 90.000 actualizaciones / s, lo que resultó en picos de ancho de banda de salida de 450 Mbit / s.

El servidor nunca usó más de 13 GiB de RAM y la CPU se mantuvo estable alrededor del 60%.

Con al menos 30 GiB de RAM, puede manejar 1 millón de sockets simultáneos. La CPU necesaria depende del rendimiento de datos que necesite.

Alessandro Alinone
fuente
7
Supongo que esto fue un poco de Linux. ¿Podría compartir información adicional sobre cómo se ajustó el kernel? Descriptores de archivo máximo / tamaños de ventana tcp, etc.
quixver
14
Era Amazon Linux de vainilla. Se aumentaron los descriptores de archivos máximos. El búfer de envío de TCP se redujo a 1600 bytes (hecho por defecto por Lightstreamer, aunque se puede ajustar manualmente). MSS estaba predeterminado.
Alessandro Alinone
¿Este software es completamente gratuito o necesita una tarifa para usarlo?
Avtandil Kavrelishvili
@AvtandilKavrelishvili: Hay una edición gratuita y una edición de pago.
Alessandro Alinone
¿Sería más fácil para el servidor si en lugar de websockets usara un sondeo regular?
mFeinstein