Proposta di abilitare la modalità TCP_NODELAY per impostazione predefinita

Marc Brooker, ingegnere presso Amazon Web Services (AWS), ha chiarito alcune idee sbagliate relative al miglioramento dell'efficienza nella trasmissione di piccoli messaggi utilizzando l'algoritmo di Nagle, impiegato di default nel stack TCP/IP. Le raccomandazioni si riducono a disabilitare di default l'algoritmo di Nagle, cosa che, nel contesto di applicazioni specifiche, può essere realizzata impostando l'opzione TCP_NODELAY per i socket di rete tramite la chiamata setsockopt, una pratica già adottata in progetti come Node.js e curl.

L'algoritmo di Nagle consente di aggregare piccoli messaggi per ridurre il traffico: sospende l'invio di nuovi segmenti TCP fino a ricevere conferma della ricezione dei dati precedentemente inviati. Ad esempio, senza aggregazione, l'invio di 1 byte comporta l'invio aggiuntivo di 40 byte con le intestazioni dei pacchetti TCP e IP. In condizioni moderne, l'uso dell'algoritmo di Nagle porta a un aumento significativo delle latenze, inaccettabili per applicazioni interattive e distribuite.

Vengono forniti tre principali argomenti a favore dell'utilizzo di default dell'opzione TCP_NODELAY, che disabilita l'algoritmo di Nagle:

  • Incompatibilità dell'algoritmo di Nagle con l'ottimizzazione 'delayed ACK', in base alla quale l'ACK viene inviato non immediatamente, ma dopo la ricezione dei dati di risposta. Il problema è che, nell'algoritmo di Nagle, la ricezione del pacchetto ACK è un segnale per inviare i dati aggregati. Se il pacchetto ACK non viene ricevuto, l'invio avviene soltanto al verificarsi di un timeout. Così si crea un circolo vizioso e il pacchetto ACK come segnale non funziona, poiché l'altra parte non riceve i dati a causa della loro accumulo lato mittente, mentre il mittente non li invia fino al timeout, poiché non riceve il pacchetto ACK.
  • Il RFC per l'algoritmo di Nagle è stato adottato nel 1984 e non è stato progettato per le caratteristiche delle moderne reti ad alta velocità e server nei data center, il che porta a problemi di reattività. Il ritardo tra l'invio della richiesta e la ricezione della risposta (RTT) nelle reti moderne è di 0,5 ms + alcuni millisecondi per lo scambio di dati tra i data center in una stessa regione + fino a cento millisecondi per le comunicazioni in tutto il mondo. Durante questi millisecondi, un server moderno è in grado di svolgere un enorme volume di lavoro.
  • Le moderne applicazioni distribuite non inviano più singoli byte di dati, e l'aggregazione di piccoli dati è solitamente realizzata a livello di applicazione. Anche se la dimensione dei dati utili è di pochi byte, di norma, la dimensione effettiva delle informazioni inviate aumenta notevolmente dopo l'applicazione della serializzazione, l'uso di API in JSON e la trasmissione con crittografia TLS. Risparmiare 40 byte non è più così rilevante.

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster