Marc Brooker, ingenjör pÄ Amazon Web Services (AWS), har avfÀrdat missuppfattningar om hur man förbÀttrar effektiviteten i överföringen av smÄ meddelanden med algoritmen Nagle, som anvÀnds som standard i TCP/IP-stacken. Rekommendationerna gÄr ut pÄ att stÀnga av den standardmÀssiga Nagle-algoritmen, vilket i vissa applikationer kan göras genom att stÀlla in TCP_NODELAY-optionen för nÀtverks-sockets via anropet setsockopt, vilket redan görs i projekt som Node.js och curl.
Nagle-algoritmen gör det möjligt att aggregera smĂ„ meddelanden för att minska trafiken â den stoppar sĂ€ndningen av nya TCP-segment tills bekrĂ€ftelse pĂ„ mottagande av tidigare skickade data har erhĂ„llits. Till exempel, utan aggregering, skickas 40 byte TCP- och IP-headerinformation nĂ€r 1 byte skickas. I dagens lĂ€ge leder anvĂ€ndningen av Nagle-algoritmen till mĂ€rkbara fördröjningar, som Ă€r oacceptabla för interaktiva och distribuerade applikationer.
Tre huvudargument för att anvÀnda TCP_NODELAY som standard, vilket stÀnger av Nagle-algoritmen:
- Inkompatibilitet mellan Nagle-algoritmen och optimeringen 'delayed ACK', dÀr ACK-svar inte skickas omedelbart utan efter mottagande av svarande data. Problemet Àr att i Nagle-algoritmen Àr mottagandet av ACK-paketet en signal för att skicka aggregerade data, och om ACK-paketet inte har kommit in, sker sÀndningen vid tidouts. Detta skapar en ond cirkel dÀr ACK-paketet som signal inte fungerar, eftersom den andra parten inte fÄr data pÄ grund av ackumulering pÄ avsÀndarens sida, och avsÀndaren skickar dem inte förrÀn timeouten intrÀffar eftersom ACK-paketet inte har mottagits.
- RFC för Nagle-algoritmen antogs 1984, och den Àr inte anpassad till parametrarna i dagens högpresterande nÀtverk och servrar i datacenter, vilket leder till problem med responsivitet. Fördröjningen mellan att skicka en förfrÄgan och erhÄlla ett svar (RTT) i moderna nÀtverk Àr 0,5 ms + nÄgra millisekunder vid datacenterutbyte inom samma region + upp till hundra millisekunder vid global överföring. Under dessa millisekunder kan en modern server utföra en enorm mÀngd arbete.
- Moderna distribuerade applikationer skickar inte lĂ€ngre enskilda databyte, utan aggregationen av smĂ„ data genomförs vanligtvis pĂ„ applikationsnivĂ„. Ăven om storleken pĂ„ de anvĂ€ndbara data Ă€r nĂ„gra fĂ„ byte, ökar den faktiska storleken pĂ„ den skickade informationen avsevĂ€rt efter att serialisering, anvĂ€ndning av API-omslag i JSON och sĂ€ndning med TLS-kryptering har tillĂ€mpats. Besparingen av 40 byte blir mindre relevant.
KĂ€lla: opennet.ru
