Tengo un cliente node.js (10.177.62.7) que solicita algunos datos del servicio http rest del servidor (10.177.0.1). El cliente simplemente está utilizando node.js http.request() method (agent = false). El cliente está en la caja de Ubuntu 11.10.El cliente envía el ACUSE FINAL retrasado (~ 500ms) al servidor
¿Por qué el cliente envía FIN ACK después de 475ms? ¿Por qué es tan lenta? Debería enviar FIN ACK inmediatamente. Tengo muchas situaciones como esta. Alrededor del 1% del tráfico total se solicita con FIN ACK retrasada.
La CPU inactiva en el cliente es de aproximadamente el 99%, por lo que nada está agotando la CPU.
¿Cómo se soluciona esto? ¿Qué podría ser? ¿Hay alguna opción sysctl que necesite sintonizar?
En la captura de pantalla segunda columna es el tiempo transcurrido entre los paquetes.
Suprimí mi respuesta sobre HTTP keep-alive ya que fue definitivamente descartada. Sin embargo, no puedo pensar en ninguna otra respuesta. El FIN debería apagarse tan pronto como el socket esté cerrado. –
@AlanCurry Pero el * FIN/ACK * solo se apagará cuando el cliente haya leído el FIN entrante y haya decidido cerrar el socket, lo que podría tomar cualquier cantidad de tiempo. Este es un comportamiento de node.js, no de la pila TCP/IP. – EJP
Claro, pero si está en medio de una llamada a una biblioteca de cliente http, no está haciendo keep-alive, y la carga de la CPU es del 1%, ¿por qué tarda tanto en cerrar el socket después de leer EOF? –