Usa TCP_QUICKACK, non TCP_NODELAY
L'attivazione di TCP_NODELAY ha effetti simili, ma può aumentare il throughput per piccole scritture. Se scrivi un ciclo che invia solo pochi byte (caso peggiore, un byte) a un socket con "write()", e l'algoritmo Nagle è disabilitato con TCP_NODELAY, ogni scrittura diventa un pacchetto IP. Questo aumenta il traffico di un fattore 40, con IP e TCPheader per ogni payload. La prevenzione di Tinygram non ti consentirà di inviare un secondo pacchetto se ne hai uno in volo, a meno che tu non abbia dati sufficienti per riempire il pacchetto di dimensioni massime. Accumula byte per un tempo di andata e ritorno, quindi invia tutto nella coda. È quasi sempre quello che vuoi. Se hai impostato TCP_NODELAY, devi essere molto più consapevole dei problemi di buffering e flushing. Niente di tutto ciò ha importanza per i trasferimenti bulk unidirezionali, che oggi sono la maggior parte degli HTTP. (Non ho mai esaminato l'impatto di questo sull'handshake SSL, dove potrebbe avere importanza.) Versione abbreviata:set TCP_QUICKACK. Se trovi un caso in cui questo peggiora le cose, fammelo sapere. John Nagle
https://news.ycombinator.com/item?id=10608356
Non esiste una relazione diretta tra queste due opzioni, sono solo per scopi diversi.
TCP_NODELAY ha lo scopo di disabilitare/abilitare il buffering del segmento in modo che i dati possano essere inviati al peer il più rapidamente possibile, quindi viene generalmente utilizzato per migliorare l'utilizzo della rete. TCP_QUICKACK viene utilizzato per inviare riconoscimenti il prima possibile rispetto a quelli ritardati in alcuni scambi a livello di protocollo e non è stabile/permanente, le successive transazioni TCP (che possono avvenire sotto il cofano) possono ignorare questa opzione a seconda dell'effettiva elaborazione a livello di protocollo o di eventuali disaccordi effettivi tra le impostazioni dell'utente e il comportamento dello stack.
NOTA TCP_NODELAY
è portatile mentre TCP_QUICKACK
non lo è (funziona solo con Linux 2.4.4+).
TCP_QUICKACK
e TCP_NODELAY
influenzare diverse operazioni in TCP. Il tcp(7)
la pagina man descrive quali opzioni socket per TCP interferiscono tra loro, ad es. TCP_CORK
e TCP_NODELAY
.
Risposta breve
- Per disabilitare l'algoritmo di buffering di Nagle, usa l'opzione socket TCP_NODELAY.
- Per disabilitare gli ACK ritardati, usa l'opzione socket TCP_QUICKACK.
Dettagli
-
Algoritmo di Nagle
- L'algoritmo di Nagle, che prende il nome dal suo creatore John Nagle, è un meccanismo per migliorare l'efficienza del TCP riducendo il numero di piccoli pacchetti inviati sulla rete.
- L'obiettivo era impedire a un nodo di trasmettere molti piccoli pacchetti se l'applicazione consegna i dati al socket piuttosto lentamente.
- Se un processo sta causando la trasmissione di molti piccoli pacchetti, potrebbe creare un'indebita congestione della rete. Ciò è particolarmente vero se il carico utile di un pacchetto è inferiore ai dati dell'intestazione TCP.
-
ACK ritardato
- Il riconoscimento ritardato TCP o ACK ritardato è un'altra tecnica utilizzata da alcune implementazioni del TCP nel tentativo di migliorare le prestazioni della rete e ridurre la congestione.
- L'ACK ritardato è stato inventato per ridurre il numero di ACK necessari per riconoscere i segmenti e ridurre l'overhead del protocollo.
- ACK ritardato significa che TCP non riconosce immediatamente ogni singolo segmento TCP ricevuto. Diverse risposte ACK possono essere combinate insieme in un'unica risposta, riducendo l'overhead del protocollo.
-
L'algoritmo di Nagle e l'ACK ritardato non funzionano bene insieme in una rete TCP/IP
- L'ACK ritardato tenta di inviare più dati per segmento, se possibile. Ma parte dell'algoritmo di Nagle dipende da un ACK per inviare i dati.
- L'algoritmo di Nagle e gli ACK ritardati insieme creano un problema perché gli ACK ritardati sono in attesa di inviare l'ACK mentre quello di Nagle è in attesa di ricevere l'ACK
-
Come posso risolvere i problemi causati dall'algoritmo di Nagle e dagli ACK ritardati
- Abilita TCP_NODELAY per disabilitare l'algoritmo di Nagle tramite le opzioni socket globali sui server
- Apporta modifiche al profilo su server proxy e sistemi di bilanciamento del carico:questo è particolarmente rilevante se esegui applicazioni o ambienti che solo a volte hanno traffico altamente interattivo e protocolli chiacchieroni. Attivando e disattivando dinamicamente l'algoritmo di Nagle e TCP_NODELAY a livello di bilanciamento del carico, puoi mantenere in esecuzione in modo ottimale anche mix di traffico altamente eterogenei.
- Riduci il timer ACK ritardato sui tuoi server e sistemi di bilanciamento del carico. A volte, questo tipo di ottimizzazione viene gestito nel software, a livello di applicazione, ma in caso contrario, potresti comunque essere in grado di gestire dinamicamente il timer ACK a livello di server o di bilanciamento del carico.
- Mentre apporti queste modifiche, controlla attentamente il traffico di rete e osserva come ogni modifica influisce sulla congestione.
Per maggiori dettagli, fare riferimento a questo