Marc Brooker, Ingenieur bei Amazon Web Services (AWS), hat MissverstĂ€ndnisse ĂŒber die Effizienzsteigerung der Ăbertragung kleiner Nachrichten mit dem Nagle-Algorithmus, der standardmĂ€Ăig im TCP/IP-Stack verwendet wird, aufgeklĂ€rt. Die Empfehlungen zielen darauf ab, den Nagle-Algorithmus standardmĂ€Ăig zu deaktivieren, was im Kontext bestimmter Anwendungen durch das Setzen der TCP_NODELAY-Option fĂŒr Netzwerksockets mittels des Aufrufs von setsockopt erreicht werden kann, wie es bereits in Projekten wie Node.js und curl seit langem praktiziert wird.
Der Nagle-Algorithmus ermöglicht die Aggregation kleiner Nachrichten zur Reduzierung des Datenverkehrs â er pausiert das Senden neuer TCP-Segmente, bis eine BestĂ€tigung fĂŒr den Empfang zuvor gesendeter Daten vorliegt. Beispielsweise werden bei der Ăbertragung von 1 Byte ohne Aggregation zusĂ€tzlich 40 Bytes mit TCP- und IP-Headern des Pakets gesendet. Unter modernen Bedingungen fĂŒhrt die Verwendung des Nagle-Algorithmus zu einer spĂŒrbaren Erhöhung der Latenz, die fĂŒr interaktive und verteilte Anwendungen inakzeptabel ist.
Es gibt drei Hauptargumente fĂŒr die standardmĂ€Ăige Verwendung der TCP_NODELAY-Option, die den Nagle-Algorithmus deaktiviert:
- InkompatibilitĂ€t des Nagle-Algorithmus mit der Optimierung âdelayed ACKâ, bei der die ACK-Antwort nicht sofort, sondern erst nach Erhalt von Antwortdaten gesendet wird. Das Problem besteht darin, dass im Nagle-Algorithmus der Eingang eines ACK-Pakets ein Signal zum Senden aggregierter Daten ist, und wenn das ACK-Paket nicht eintrifft, erfolgt das Senden bei Ablauf eines Timeouts. Somit entsteht ein Teufelskreis, und das ACK-Paket funktioniert nicht als Signal, da die andere Seite die Daten aufgrund der Ansammlung auf der Senderseite nicht erhĂ€lt, und der Sender sie nicht sendet, bevor der Timeout eintritt, da er kein ACK-Paket erhĂ€lt.
- Der RFC fĂŒr den Nagle-Algorithmus wurde 1984 angenommen und ist nicht auf die Parameter moderner Hochgeschwindigkeitsnetze angepasst und Server in Rechenzentren, was zu Problemen mit der ReaktionsfĂ€higkeit fĂŒhrt. Die Verzögerung zwischen dem Senden einer Anfrage und dem Erhalten einer Antwort (RTT) in modernen Netzwerken betrĂ€gt 0,5 ms + einige Millisekunden beim Datenaustausch zwischen Rechenzentren in derselben Region + bis zu hundert Millisekunden beim globalen Versand. In diesen Millisekunden kann ein moderner Server eine enorme Menge an Arbeit verrichten.
- Moderne verteilte Anwendungen senden lĂ€ngst keine einzelnen Bytes mehr, und die Aggregation kleiner Daten wird normalerweise auf der Anwendungsebene realisiert. Selbst wenn die GröĂe der nĂŒtzlichen Daten nur einige Bytes betrĂ€gt, steigt in der Regel die tatsĂ€chlich gesendete InformationsgröĂe erheblich an, nachdem die Serialisierung, die Verwendung von API-Wrappern in JSON und die Ăbertragung mit TLS-VerschlĂŒsselung angewendet wurden. Eine Einsparung von 40 Byte wird weniger relevant.
Quelle: opennet.ru
