Recientemente me encontré con un problema de rendimiento de TCP interesante mientras ejecutaba algunas pruebas de rendimiento que comparaban el rendimiento de la red con el rendimiento del bucle invertido. En mi caso, el rendimiento de la red excedió el rendimiento del bucle invertido (red 1Gig, misma subred). En el caso que estoy tratando, las latencias son cruciales, entonces TCP_NODELAY está habilitado. La mejor teoría que hemos encontrado es que el control de congestión TCP está reteniendo paquetes. Hicimos algunos análisis de paquetes y definitivamente podemos ver que los paquetes se están reteniendo, pero la razón no es obvia. Ahora las preguntas ...Rendimiento del bucle de retorno de Linux con TCP_NODELAY habilitado
1) ¿En qué casos, y por qué, la comunicación a través del loopback sería más lenta que en la red?
2) Al enviar lo más rápido posible, ¿por qué alternar TCP_NODELAY tiene un impacto mucho mayor en el rendimiento máximo sobre el bucle invertido que en la red?
3) ¿Cómo podemos detectar y analizar el control de congestión TCP como una posible explicación del bajo rendimiento?
4) ¿Alguien tiene alguna otra teoría sobre el motivo de este fenómeno? Si es así, ¿algún método para probar la teoría?
Aquí es algunos datos de muestra generados por un simple punto a punto C++ aplicación:
Transport Message Size (bytes) TCP NoDelay Send Buffer (bytes) Sender Host Receiver Host Throughput (bytes/sec) Message Rate (msgs/sec) TCP 128 On 16777216 HostA HostB 118085994 922546 TCP 128 Off 16777216 HostA HostB 118072006 922437 TCP 128 On 4096 HostA HostB 11097417 86698 TCP 128 Off 4096 HostA HostB 62441935 487827 TCP 128 On 16777216 HostA HostA 20606417 160987 TCP 128 Off 16777216 HostA HostA 239580949 1871726 TCP 128 On 4096 HostA HostA 18053364 141041 TCP 128 Off 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 UnixDatagram 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
Éstos son algunos más piezas de información útil:
- única que veo este problema con una pequeña mensajes
- HostA y HostB tienen el mismo kit de hardware (Xeon [email protected], 32 núcleos en total/128 Gig Mem/1Gig Nics)
- OS es RHEL 5.4 kernel 2.6.18-164.2.1.el5)
Gracias
Si las latencias son cruciales, cambiaría a sockets de dominio UNIX (muy similares a los sockets TCP) o pipes (más rápido, pero más complicado, necesita dos pipes para una conexión bidireccional). Cargan menos equipaje que las tomas TCP y ofrecen latencias más bajas. –
Estas pueden no ser preguntas pertinentes, pero tengo curiosidad. ¿Cuáles son los resultados reales que está viendo en los dos escenarios? ¿Cuál es el rendimiento y el tiempo? Además, ¿la prueba se envía principalmente en una dirección, o es más una prueba de estilo de eco en la que se envía la misma cantidad de datos en una respuesta? –
@ Mark Agregué los resultados de nuestras pruebas a la publicación principal. También agregué un par de otros detalles pertinentes. Las pruebas están enviando en una dirección. – rns