Marc Brooker, inxhinier nga kompania Amazon Web Services (AWS), analizoi keqkuptimet lidhur me përmirësimin e efikasitetit të transmetimit të mesazheve të vogla duke përdorur algoritmin e Nagle, i cili aplikohet si parazgjedhje në stakun TCP/IP. Rekomandimet përfshijnë çaktivizimin e algoritmit të Nagle si parazgjedhje, që në kontekstin e aplikacioneve të veçanta mund të bëhet përmes vendosjes së opsionit TCP_NODELAY për soketat rrjetërore përmes thirrjes setsockopt, një praktikë që është përdorur prej kohësh në projekte si Node.js dhe curl.
Algoritmi i Nagle lejon agregimin e mesazheve të vogla për të zvogëluar trafikun - ndalon dërgimin e segmenteve të rinj TCP deri sa të merret konfirmimi për pranimin e të dhënave të dërguara më parë. Për shembull, pa përdorur agregimin, kur dërgohet 1 byte, dërgohen gjithashtu 40 byte me header-a TCP dhe IP. Në kushtet moderne, përdorimi i algoritmit të Nagle çon në rritje të dukshme të vonesave, të papranueshme për aplikacione interaktive dhe të shpërndara.
Tri argumente kryesore janë dhënë për përdorimin si parazgjedhje të opsionit TCP_NODELAY, i cili çaktivizon algoritmin e Nagle:
- Inkompatibiliteti i algoritmit të Nagle me optimizimin 'delayed ACK', ku përgjigja ACK dërgohet jo menjëherë, por pasi merret të dhëna të përgjigjes. Problemi është se në algoritmin e Nagle, marrja e paketës ACK është një sinjal për dërgimin e të dhënave të agreguara, dhe nëse paketa ACK nuk arrin, dërgimi realizohet vetëm pas një kohë të kaluar. Kështu, krijohet një cikël vicioz dhe paketa ACK si sinjal nuk funksionon, pasi ana tjetër nuk merr të dhëna për shkak të akumulimit në anën dërguese, dhe dërguesi nuk dërgon deri sa të kalojë koha, pasi nuk merr paketën ACK.
- RFC për algoritmin e Nagle u miratua në 1984 dhe ai nuk është i optimizuar për parametrat e rrjeteve të shpejta moderne dhe servera në qendrat e të dhënave, çka shkakton probleme me reagimin. Vonesa midis dërgimit të një kërkese dhe marrjes së një përgjigje (RTT) në rrjetet moderne është 0.5 ms + disa milisekonda gjatë shkëmbimit të të dhënave midis qendrave të të dhënave në një rajon + deri në njëqind milisekonda kur dërgohet në mbarë botën. Në këto milisekonda, serverët modernë janë në gjendje të kryejnë një sasi të madhe pune.
- Aplikacionet moderne të shpërndara prej kohësh nuk dërgojnë byte të vetme të dhënash, dhe agregimi i të dhënave të vogla zakonisht realizohet në nivelin e aplikacionit. Edhe nëse madhësia e të dhënave të dobishme është disa byte, zakonisht madhësia reale e informacionit të dërguar rritet në mënyrë të konsiderueshme pas aplikimit të serializimit, përdorimit të API-ve në JSON dhe dërgimit me enkriptim TLS. Kursimi i 40 byte nuk bëhet aq i rëndësishëm.
Burimi: opennet.ru
