Escalado de una aplicación Node.js a 10s de 1000 de conexiones simultáneas

Trabajamos en una aplicación que permite a las personas disparar pelotas de béisbol a través de Internet.

Vive completamente dentro del ecosistema AWS de Amazon, y lo estamos construyendo para un nuevo proyecto. La stack incluye:

– Servidores dedicados de MongoDB y Redis – tres grupos diferentes de servidores de nodejs – además, estamos utilizando la API de Amazon para la configuración del servidor y la autoescala

El problema al que nos enfrentamos es que no hemos podido simular más de aproximadamente 15000 usuarios simultáneos (conexiones websocket) por instancia. Deberíamos estar recibiendo considerablemente más; Pensamos 10s de miles. El uso de la CPU del servidor es solo del 40%.

¿Alguna idea sobre cómo escalar una aplicación node.js para permitirle tener muchas más conexiones simultáneas a un solo servidor?

Cada conexión TCP tiene un descriptor de archivo abierto en el sistema operativo de archivos. Es importante establecer el límite a un número por encima de lo que necesita.

Por ejemplo, en ubuntu puedes ver este límite por comandos:

$ulimit -a $ulimit -n 

Para establecer este límite de forma permanente en Ubuntu, debe cambiar el archivo /etc/security/limits.conf y agregar estas líneas con el número que desee:

 * soft nofile 100000 * hard nofile 100000 

Y luego reinicie:

 $sudo reboot 

Un websocket es una conexión TCP, ¿no? ¿Y por cuánto tiempo sus clientes mantienen abiertas sus conexiones?

Un servidor tendrá un límite en el número de conexiones TCP abiertas que puede tener. Su sistema operativo también tendrá un límite en el número de manejadores de archivos abiertos que un proceso puede tener en cualquier momento.

Asi que:

  • ¿Cuál es el límite de socket abierto TCP en su servidor, y
  • ¿Cuál es el límite de manejo de archivos abiertos en su servidor?

?

Supongo que está comenzando a alcanzar algunos de los límites predeterminados del núcleo en los descriptores de stack / archivo de TCP. ¿Has probado alguna optimización de nivel de sistema? Si es así, ¿cuál?

  1. ¿Redis se está ejecutando replicado? El problema puede ser con Redis – es de un solo hilo. Cita de sus documentos: Redis utiliza un diseño mayormente de un solo hilo. Esto significa que un solo proceso sirve a todas las solicitudes de los clientes, utilizando una técnica llamada multiplexación. Esto significa que Redis puede atender una única solicitud en cada momento dado, por lo que todas las solicitudes se sirven de forma secuencial . Así que los procesos pueden estar en la cola de Redis esperando su turno.

  2. ¿Se utilizan cerraduras en el lado mongodb? He observado este tipo de problemas de rendimiento con el código que utiliza los lockings mysql: los procesos están esperando el locking.

Intereting Posts