2012-08-18 29 views
7

Estoy trabajando en una aplicación algo inusual en la que 10k clientes están sincronizados con precisión para intentar enviar datos de una vez, cada 3 minutos más o menos. Este comando 'ab' bastante simula con precisión una andanada en el mundo real:Node.js que lucha con muchas conexiones simultáneas

ab -c 10000 -n 10000 -r "http://example.com/submit?data=foo" 

estoy usando Node.js en Ubuntu 12.4 en un Rackspace Cloud VPS ejemplo para recoger estas presentaciones, sin embargo, estoy viendo algunos muy comportamiento extraño de Node, incluso cuando elimino toda la lógica de mi negocio y convierto la solicitud http en no operativa.

Cuando la prueba se realiza aproximadamente en un 90%, se cuelga durante un largo período de tiempo. Extrañamente, esto sucede consistentemente al 90% - para c = n = 10k, en 9000; para c = n = 5k, a 4500; para c = n = 2k, a 1800. La prueba en realidad se completa finalmente, a menudo sin errores. Pero tanto los registros ab como los nodos muestran un procesamiento continuo hasta alrededor del 80-90% de la ejecución de prueba, luego una pausa larga antes de completarse.

Cuando el nodo procesa solicitudes normalmente, el uso de la CPU suele ser de alrededor del 50-70%. Durante el período de suspensión, la CPU sube al 100%. A veces se mantiene cerca de 0. Entre la respuesta errática de la CPU y el hecho de que parece no estar relacionada con la cantidad real de conexiones (solo el% completado), no sospecho que el recolector de basura.

He intentado esto ejecutando 'ab' en localhost y en un servidor remoto - mismo efecto.

Sospecho que hay algo relacionado con la pila TCP, posiblemente con el cierre de las conexiones, pero ninguno de mis cambios de configuración ha ayudado. Mis cambios:

  • ulimit -n 999999
  • Cuando escucho(), que establecen la cartera de pedidos a 10000

cambios Sysctl son:

net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216 
net.ipv4.tcp_rmem = 4096 87380 16777216 
net.ipv4.tcp_wmem = 4096 65536 16777216 
net.ipv4.tcp_max_orphans = 20000 
net.ipv4.tcp_max_syn_backlog = 10000 
net.core.somaxconn = 10000 
net.core.netdev_max_backlog = 10000 

También he notado que Tiendo a obtener este mensaje en los registros del kernel:

TCP: Possible SYN flooding on port 80. Sending cookies. Check SNMP counters. 

Estoy desconcertado por este mensaje ya que la cola de retraso de TCP debe ser lo suficientemente profunda como para no desbordarse nunca. Si deshabilito las cookies de sincronización, "Enviar cookies" va a "Eliminar conexiones".

Supongo que se trata de un problema de ajuste de la pila TCP de Linux y que he leído casi todo lo que pude encontrar en la red. Nada de lo que he probado parece importar. ¿Algún consejo?

Actualización: intentado con tcp_max_syn_backlog, SOMAXCONN, netdev_max_backlog, y el escuchar() atraso parámetro conjunto de 50k sin cambios en el comportamiento. Aún produce la advertencia de inundación SYN, también.

+1

En una nota lateral Estoy muy interesado en la solución final a este, ya que necesito nodejs con un alto número de conexiones activas además. –

+1

Por lo que vale, tan eficiente como Node puede ser, 10k conexiones haciendo algo a la vez es más carga de la que dejaría a un único SPV. – Brad

Respuesta

3

¿Está ejecutando ab en el mismo nodo que ejecuta la máquina? Si no, ¿tienes una NIC 1G o 10G? Si es así, entonces, ¿realmente no está tratando de procesar 20,000 conexiones abiertas?

Además, si está cambiando net.core.somaxconn a 10,000, ¿no tiene absolutamente ningún otro zócalo abierto en esa máquina? Si lo haces, entonces 10.000 no es lo suficientemente alto.

¿Ha intentado utilizar el clúster nodejs para separar el número de conexiones abiertas por proceso?

+0

He ejecutado ab tanto en localhost como desde otra máquina. Ambos casos muestran el mismo comportamiento de pausa, aunque las pruebas se ejecutan más rápido en localhost. El comportamiento de pausa ocurre con las pruebas 8k y 5k (y en menor medida con las pruebas 2k), pero volveré a ejecutar las pruebas con somaxconn establecido en 50k. Planeo usar un clúster de estas máquinas para redundancia y equilibrio de carga, pero esta prueba es para calcular cuántas instancias necesitaré. – stickfigure

+0

He realizado las pruebas con los parámetros establecidos en 50k y el comportamiento no ha cambiado. Lo más sorprendente para mí es la advertencia de inundación SYN; con retrasos establecidos en 50k, no esperaría desbordar la cola. – stickfigure

+0

@stickfigure Eche un vistazo a esta respuesta http://serverfault.com/questions/294209/possible-syn-flooding-in-log-despite-low-number-of-syn-recv-connections –

Cuestiones relacionadas