Marc Brooker, az Amazon Web Services (AWS) mérnöke tisztázta a tévhiteket, amelyek a kis üzenetek átvitelének hatékonyságának növelésével kapcsolatosak az alapértelmezett TCP/IP veremben használt Nagle-algoritmus alkalmazása során. Az ajánlások szerint a Nagle-algoritmust alapértelmezés szerint ki kell kapcsolni, ami egyes alkalmazások esetében a TCP_NODELAY lehetőség beállításával valósítható meg a hálózati socketekhez a setsockopt hívás segítségével, amit már régóta használnak olyan projektekben, mint a Node.js és a curl.
A Nagle-algoritmus lehetővé teszi a kis üzenetek aggregálását a forgalom csökkentése érdekében – felfüggeszti az új TCP szegmensek küldését a korábban elküldött adatok átvételének visszaigazolásáig. Például aggregálás nélkül 1 bájt küldése esetén 40 bájt TCP és IP csomag fejléccel is elküldésre kerül. A modern körülmények között a Nagle-algoritmus használata jelentős késlekedéshez vezet, ami elfogadhatatlan interaktív és elosztott alkalmazások esetében.
Három fő érvet hoznak fel a TCP_NODELAY lehetőség alapértelmezett használata mellett, amely kikapcsolja a Nagle-algoritmust:
- A Nagle-algoritmus inkompatibilitása a "delayed ACK" optimalizálással, amelynél az ACK válasz azonnal nem kerül elküldésre, hanem az ismételt adatok fogadása után. A probléma az, hogy a Nagle-algoritmusban az ACK csomag megérkezése jelzés a feldolgozott adatok küldésére, és ha az ACK csomag nem érkezik meg, a küldés csak időérzékenyen történik. Így bezárul a kör, és az ACK csomag mint jelzés nem működik, mert a másik fél nem kap adatokat a küldő fél által felhalmozott miatt, míg a küldő nem küldi el őket az időmúlás miatt, mivel nem kapta meg az ACK csomagot.
- A Nagle-algoritmus RFC-jét 1984-ben fogadták el, és nem lett figyelembe véve a modern gyors hálózatok paraméterei és szerverek a adatközpontok, ami problémákat okoz a válaszidővel kapcsolatban. A kérés küldése és a válasz megérkezése közötti késlekedés (RTT) modern hálózatokban 0.5 ms + néhány milliszekundum adatközpontok közötti adatcserénél egy régión belül + akár száz milliszekundum világszerte történő küldés esetén. Ezekben a milliszekundumokban a modern szerver hatalmas munkát képes végezni.
- A modern distributed applications no longer send individual bytes of data; instead, the aggregation of small data is usually implemented at the application level. Even if the size of useful data is just a few bytes, the actual size of the information sent often considerably increases after serialization, using API wrappers in JSON, and transmission with TLS encryption. Saving 40 bytes becomes less relevant.
Forrás: opennet.ru
