Propozycja włączenia trybu TCP_NODELAY domyślnie

Marc Brooker, inżynier z Amazon Web Services (AWS), wyjaśnił nieporozumienia związane z poprawą efektywności przesyłania małych wiadomości, przy użyciu algorytmu Nagle'a, który jest domyślnie stosowany w stosie TCP/IP. Rekomendacje skupiają się na wyłączeniu algorytmu Nagle'a, co w kontekście poszczególnych aplikacji można osiągnąć poprzez ustawienie opcji TCP_NODELAY dla gniazd sieciowych za pomocą wywołania setsockopt, co od dawna praktykowane jest w takich projektach jak Node.js i curl.

Algorytm Nagle'a pozwala na agregację małych wiadomości w celu zmniejszenia ruchu - wstrzymuje wysyłanie nowych segmentów TCP do momentu otrzymania potwierdzenia odbioru wcześniej wysłanych danych. Na przykład, bez zastosowania agregacji przy wysyłaniu 1 bajta, dodatkowo wysyłane są 40 bajtów z nagłówkami TCP i IP pakietu. W dzisiejszych czasach używanie algorytmu Nagle'a prowadzi do zauważalnego wzrostu opóźnień, co jest nieakceptowalne dla aplikacji interaktywnych i rozproszonych.

Przedstawione są trzy główne argumenty na rzecz domyślnego użycia opcji TCP_NODELAY, wyłączającej algorytm Nagle'a:

  • Niekompatybilność algorytmu Nagle'a z optymalizacją "opóźnionego ACK", w której odpowiedź ACK jest wysyłana nie od razu, lecz po otrzymaniu odpowiednich danych. Problem polega na tym, że w algorytmie Nagle'a przyjmowanie pakietu ACK jest sygnałem do wysyłania danych zagregowanych, a jeśli pakiet ACK nie dotarł, wysyłka odbywa się dopiero po upływie czasu oczekiwania. Powstaje więc błędne koło: pakiet ACK jako sygnał nie działa, ponieważ druga strona nie otrzymuje danych z powodu ich kumulacji po stronie nadawcy, a nadawca nie wysyła ich przed upływem czasu oczekiwania, ponieważ nie otrzymał pakietu ACK.
  • RFC dla algorytmu Nagle'a przyjęto w 1984 roku i nie jest on dostosowany do parametrów współczesnych sieci o wysokiej prędkości oraz serwerów w centrach danych, co prowadzi do problemów z responsywnością. Opóźnienie między wysyłaniem żądania a otrzymywaniem odpowiedzi (RTT) w nowoczesnych sieciach wynosi 0,5 ms + kilka milisekund przy wymianie danych między centrami danych w jednym regionie + do stu milisekund przy transmisji w skali globalnej. W ciągu tych milisekund nowoczesny serwer jest w stanie wykonać ogromną ilość zadań.
  • Nowoczesne aplikacje rozproszone nie przesyłają pojedynczych bajtów danych, a agregacja drobnych danych zazwyczaj odbywa się na poziomie aplikacji. Nawet jeśli rozmiar użytecznych danych wynosi zaledwie kilka bajtów, to zazwyczaj rzeczywisty rozmiar przesyłanych informacji znacznie wzrasta po zastosowaniu serializacji, wykorzystaniu API opakowań w JSON oraz przesyłaniu z użyciem szyfrowania TLS. Oszczędność 40 bajtów staje się mniej istotna.

Źródło: opennet.ru

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster