El uso continuo de la opción TCP_NODELAY
(brooker.co.za)La importancia de configurar TCP_NODELAY
- Al depurar problemas de latencia en sistemas distribuidos, lo primero que hay que revisar es si la opción TCP_NODELAY está activada
- Muchos desarrolladores de sistemas distribuidos han resuelto rápidamente problemas de latencia simplemente activando esta opción de socket
- Esto sugiere que el comportamiento predeterminado podría estar equivocado o que todo el concepto podría estar obsoleto
Antecedentes y problemas del algoritmo de Nagle
- El algoritmo de Nagle, propuesto por primera vez en 1984 en el RFC896 de John Nagle, tenía como objetivo obtener un mejor rendimiento de la red amortizando mejor el costo de los encabezados TCP
- El algoritmo de Nagle funciona suprimiendo el envío de nuevos segmentos TCP si todavía no se ha recibido el acuse de recibo de los datos enviados anteriormente
- Sin embargo, esto causa problemas al interactuar con delayed ACK
- El algoritmo de Nagle bloquea el envío de más datos hasta que se recibe un ACK, mientras que delayed ACK retrasa el ACK hasta que haya una respuesta lista
- Esto es bueno para llenar paquetes, pero no para aplicaciones en pipeline sensibles a la latencia
La necesidad del algoritmo de Nagle en sistemas modernos
- Los servidores modernos pueden realizar una enorme cantidad de trabajo en unos pocos cientos de microsegundos, por lo que retrasar la transmisión de datos incluso por un solo RTT puede no ofrecer una ventaja clara
- La mayoría de las bases de datos distribuidas y sistemas no envían paquetes de un solo byte
- Esto se debe a que hay más datos por transmitir y a la sobrecarga de protocolos como TLS, además de la sobrecarga de codificación y serialización
- Sigue siendo importante no enviar mensajes pequeños, pero esto ya se está manejando de forma efectiva en la capa de aplicación
Opinión sobre el uso de TCP_NODELAY
- Al construir sistemas distribuidos sensibles a la latencia, se puede activar TCP_NODELAY sin preocupación alguna, es decir, desactivar el algoritmo de Nagle
- En los sistemas modernos, considerando el tráfico, la mezcla de aplicaciones y el rendimiento del hardware, puede que el algoritmo de Nagle ya no sea necesario
- Es decir, TCP_NODELAY debería ser el valor predeterminado
- Esto podría hacer más lento cierto código que escribe byte por byte, pero si la eficiencia importa, esa aplicación de todos modos debería corregirse
La opinión de GN⁺
-
El problema de la interacción entre el algoritmo de Nagle y delayed ACK es un buen ejemplo de lo difícil que es diseñar protocolos. Los diseñadores de sistemas reconocerán esta situación en la que dos funciones razonables generan un comportamiento no intencional.
-
Optimizar el envío de mensajes pequeños en la capa de aplicación es una tendencia general. Es importante minimizar la sobrecarga innecesaria mediante una codificación y serialización eficientes.
-
Si el objetivo del algoritmo de Nagle era optimizar el ancho de banda de la red, hoy en día minimizar la latencia es un requisito más importante. En situaciones donde la capacidad de respuesta de la aplicación impacta directamente la experiencia del usuario, debe evitarse cualquier retraso innecesario.
-
Aun así, hacer de TCP_NODELAY el valor predeterminado puede no ser ideal en todos los casos. En entornos con ancho de banda limitado, o en sistemas donde la eficiencia de transmisión es mucho más importante que la latencia, puede ser necesario usar el algoritmo de Nagle de forma selectiva.
-
Al diseñar protocolos de red, es importante equilibrar distintos requisitos. Cambiar el comportamiento predeterminado de un protocolo de propósito general requiere cautela, pero también parece necesaria la flexibilidad para elegir las opciones adecuadas según las necesidades de la aplicación.
1 comentarios
Opinión de Hacker News
Resumen:
/proc/sys/net/ipv4/tcp_delack_miny/proc/sys/net/ipv4/tcp_ato_min