Forslag om at aktivere TCP_NODELAY som standardindstilling

Marc Brooker, ingeniør hos Amazon Web Services (AWS), har opklaret misforståelserne omkring effektiv overførsel af små meddelelser ved brug af Nagle-algoritmen, der anvendes som standard i TCP/IP-stacken. Anbefalingerne går ud på at deaktivere Nagle-algoritmen som standard, hvilket kan gøres i forbindelse med specifikke applikationer ved at indstille TCP_NODELAY for netværkssokler gennem kaldet til setsockopt, som længe har været brugt i projekter som Node.js og curl.

Nagle-algoritmen gør det muligt at aggregere små meddelelser for at reducere trafik — den udsætter afsendelsen af nye TCP-segmenter, indtil der modtages bekræftelse på, at tidligere sendte data er modtaget. For eksempel, uden anvendelse af aggregering, vil der ved afsendelse af 1 byte blive sendt yderligere 40 bytes med TCP- og IP-headerne. I moderne sammenhænge fører brugen af Nagle-algoritmen til en mærkbar stigning i forsinkelser, hvilket er uacceptabelt for interaktive og distribuerede applikationer.

Der gives tre hovedargumenter for at bruge TCP_NODELAY som standard, som deaktiverer Nagle-algoritmen:

  • Nagle-algoritmens inkompatibilitet med 'delayed ACK'-optimering, hvor ACK-svaret ikke sendes med det samme, men først efter modtagelse af svardata. Problemet er, at modtagelsen af ACK-pakken i Nagle-algoritmen er et signal til at sende de aggregrede data, og hvis ACK-pakken ikke er modtaget, udføres afsendelsen ved timeout. Dermed opstår der en ond cirkel, og ACK-pakken fungerer ikke som signal, fordi den anden part ikke modtager dataene, da de ophobes hos afsenderen, og afsenderen sender dem ikke, før timeouten indtræffer, da de ikke modtager ACK-pakken.
  • RFC for Nagle-algoritmen blev vedtaget i 1984, og den er ikke designet til de parametre, der gælder for moderne højhastighedsnetværk og servere datacentre, hvilket fører til problemer med responsivitet. Forsinkelsen mellem sendingen af en anmodning og modtagelsen af et svar (RTT) i moderne netværk er 0,5 ms + et par millisekunder ved dataudveksling mellem datacentre i samme region + op til hundrede millisekunder ved global afsendelse. I løbet af disse millisekunder kan en moderne server udføre en enorm mængde arbejde.
  • Moderne distribuerede applikationer sender sjældent enkelt-byte data, og aggregering af små data implementeres som regel på applikationsniveau. Selv hvis størrelsen på de nyttige data kun er få bytes, så stiger den faktiske størrelse af de sendte informationer betydeligt efter anvendelse af serialisering, brug af API-wrapper i JSON og sending via TLS-kryptering. Besparelsen på 40 bytes bliver derfor ikke så relevant.

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster