Ottimizzazione TCP per le prestazioni di rete


Questa pagina illustra i metodi per calcolare le impostazioni corrette per diminuire il latenza delle connessioni TCP in Google Cloud e diversi scenari. Questa pagina ti aiuta anche a capire come migliorare la latenza della connessione tra i processi in Google Cloud.

L'architettura moderna dei microservizi sostiene che gli sviluppatori debbano creare piccoli servizi con responsabilità singola. I servizi devono comunicare tramite TCP o UDP, in base alle aspettative di affidabilità del sistema. Di conseguenza, è fondamentale per consentire ai sistemi basati su microservizi di comunicare con affidabilità una latenza di pochi millisecondi.

Google Cloud offre affidabilità e bassa latenza fornendo una rete globale, il che significa che anche gli utenti della tua applicazione possono espandersi a livello globale. Avere una rete globale significa creare una rete Virtual Private Cloud (VPC) che si estenda su regioni e zone. Le applicazioni possono connettersi tra loro in regioni e zone senza mai dalla rete Google Cloud.

Applicazioni che sono state scritte per un ambiente di data center tradizionale possono presentare prestazioni lente quando passano a un cloud ibrido ovvero quando alcuni dei componenti dell'applicazione vengono eseguiti in un ambiente e altri data center vengono eseguiti nel cloud. Un rallentamento delle prestazioni può essere il risultato di da vari fattori. Questo articolo si concentra sulle latenze di round trip e su come la latenza influisce sulle prestazioni TCP nelle applicazioni che trasferiscono una notevole quantità di dati su qualsiasi parte della rete.

Il problema: latenza e comportamento TCP

TCP utilizza un meccanismo di gestione delle finestre per impedire a un mittente veloce di superare un ricevente lento. Il destinatario indica la quantità di dati che il mittente deve inviare prima di dover attendere un aggiornamento della finestra da parte del destinatario. Di conseguenza, se un l'applicazione ricevente non può ricevere dati sulla connessione, c'è un limite a la quantità di dati che possono essere messi in coda in attesa dell'applicazione.

La finestra TCP consente un uso efficiente della memoria sui sistemi operativi. Man mano che l'applicazione ricevente consuma dati, gli aggiornamenti delle finestre vengono inviati a il mittente. Il più rapido aggiornamento delle finestre è in un solo andata e ritorno, il che genera la seguente formula per uno dei limiti al trasferimento collettivo prestazioni di una connessione TCP:

Throughput <= dimensione finestra/latenza tempo di round trip (RTT)

Nella progettazione originale per TCP, questa finestra ha una dimensione massima di 65535 byte (64 KiB - 1). Si tratta della quantità massima di dati che il mittente può inviare prima che il mittente ricevesse un aggiornamento della finestra per consentire la inviate.

Modifiche al protocollo TCP dalla sua introduzione

Dall'introduzione del protocollo TCP, alcune funzionalità chiave sono cambiate:

  • Le velocità di rete tipiche sono aumentate di quattro ordini di grandezza.
  • La memoria tipica di un sistema è aumentata di quattro ordini di grandezza.

Il risultato del primo cambiamento è che le dimensioni originali delle finestre TCP portavano a un nell'uso inefficiente delle risorse di rete. Un mittente inviava una finestra del valore alla velocità massima possibile in condizioni di rete, quindi rimani inattivo per un periodo di tempo considerevole in attesa dell'aggiornamento della finestra TCP. La Il risultato della seconda modifica è che mittenti e destinatari possono utilizzare del networking al fine di risolvere il limite esposto dalla prima modifica.

Il seguente diagramma illustra questo snodo.

Il mittente invia solo 64 KB di dati e attende molto tempo dopo l&#39;invio prima di ricevere un aggiornamento della finestra

Il mittente non può utilizzare completamente la rete perché è in attesa dell'aggiornamento della finestra TCP prima di inviare dati aggiuntivi.

Invio di più dati alla volta

La soluzione è inviare più dati alla volta. Come larghezza di banda della rete, aumenta, più dati possono rientrare nella pipeline (rete) e man mano che la pipeline diventa più lungo, occorre più tempo per confermare la ricezione dei dati. Questo di larghezza di banda è nota come prodotto di ritardo della larghezza di banda (BDP). Viene calcolato come larghezza di banda moltiplicata per il tempo di round trip (RTT), ottenendo un valore che specifica il numero ottimale di bit da inviare per riempire il canale. La la formula è questa:

BDP (bit) = larghezza di banda (bit/secondo) * RTT (secondi)

Il BDP calcolato viene utilizzato come dimensione della finestra TCP per l'ottimizzazione.

Ad esempio, immagina di avere una rete da 10 Gbps con RTT di 30 millisecondi. Per la dimensione della finestra, utilizza il valore della dimensione della finestra TCP originale (65535 byte). Questo valore non assomiglia nemmeno a sfruttare la capacità di larghezza di banda. Le massime prestazioni TCP possibili su questo link sono le seguenti che segue:

(65535 byte * 8 bit/byte) = larghezza di banda * 0,030 secondi
larghezza di banda = (65535 byte * 8 bit/byte) / 0,030 secondi
larghezza di banda = 524280 bit / 0,030 secondi
larghezza di banda = 17476000 bit / secondo

Per dirlo in altro modo, questi valori generano una velocità effettiva leggermente superiore di 17 Mbit al secondo, una piccola frazione della velocità di 10 Gbit/s funzionalità.

La soluzione: ridimensionamento della finestra TCP

Risolvere i limiti delle prestazioni imposti dal design originale di TCP della finestra, sono state introdotte estensioni al protocollo TCP che consentono dimensioni della finestra da scalare a valori molto più grandi. Il ridimensionamento delle finestre supporta le finestre fino a 1.073.725.440 byte, o quasi 1 GiB. Questa funzionalità è descritta in RFC 7323 come Opzione di scalabilità delle finestre TCP.

Le estensioni di scala della finestra espandono la definizione della finestra TCP in modo da utilizzare 30 bit e poi utilizzano un fattore di scala implicito per trasportare questo valore di 30 bit nel campo della finestra di 16 bit dell'intestazione TCP. Per verificare se la funzionalità è abilitata su sistemi basati su Linux, utilizza questo comando:

sudo sysctl net.ipv4.tcp_window_scaling

Questa funzionalità è abilitata in tutte le macchine virtuali Google Cloud Linux predefinito. Se viene restituito un valore 1, significa che l'opzione è attivata. Se è disabilitata, puoi abilitarla utilizzando il seguente comando:

sudo sysctl -w net.ipv4.tcp_window_scaling=1

Throughput con una dimensione della finestra più grande

Puoi utilizzare l'esempio precedente per mostrare il vantaggio della scalabilità della finestra. Come prima, ipotizza una rete da 10 Gbps con una latenza di 30 millisecondi, quindi calcola una nuova dimensione della finestra utilizzando questa formula:

(Velocità link * latenza) / 8 bit = dimensioni della finestra

Se inserisci i numeri di esempio, ottieni quanto segue:

(10 Gbps * 30 ms/1000 sec) / 8 bit/byte = dimensione della finestra
(10.000 Mbps * 0,030 secondi) / 8 bit/byte = 37,5 MB

L'aumento della dimensione della finestra TCP a 37 MB può aumentare il limite teorico delle prestazioni del trasferimento collettivo TCP a un valore che si avvicina alla capacità della rete. Naturalmente, molti altri fattori possono limitare il rendimento, tra cui il sovraccarico del sistema, le dimensioni medie dei pacchetti e il numero di altri flussi che condividono il link, ma come puoi vedere, le dimensioni della finestra riducono notevolmente i limiti imposti dalle dimensioni della finestra limitata precedente.

Impostazione di parametri di Linux per modificare le dimensioni della finestra TCP

In Linux, la dimensione della finestra TCP è influenzata dai seguenti sysctl(8) tunables:

net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

I primi due parametri influenzano la dimensione massima della finestra TCP per le applicazioni tentare di controllare direttamente la dimensione della finestra TCP, limitando la configurazione a un massimo di questi valori. I secondi due parametri influenzano il TCP dimensioni della finestra per le applicazioni che consentono il funzionamento dell'ottimizzazione automatica di Linux.

Il valore ottimale per la dimensione della finestra dipende dalle circostanze specifiche, ma una il punto di partenza è il più grande prodotto di ritardo della larghezza di banda (BDP) per il percorso percorsi da cui prevedi che il sistema invii i dati. In questo caso, vuoi imposta i tunable seguendo questa procedura:

  1. Assicurati di disporre dei privilegi di root.
  2. Recupera le impostazioni correnti del buffer. Salva queste impostazioni nel caso in cui tu voglia eseguire il rollback di queste modifiche.

    sudo sysctl -a | grep mem
    
  3. Imposta una variabile di ambiente con la nuova dimensione della finestra TCP che vuoi utilizzare:

    MaxExpectedPathBDP=8388608
    
  4. Imposta la dimensione massima del buffer di ricezione del sistema operativo per tutti i tipi di connessioni:

    sudo sysctl -w net.core.rmem_max=$MaxExpectedPathBDP
    
  5. Imposta la dimensione massima del buffer di invio del sistema operativo per tutti i tipi di connessioni:

    sudo sysctl -w net.core.wmem_max=$MaxExpectedPathBDP
    
  6. Imposta le impostazioni del buffer della memoria di ricezione TCP (tcp_rmem):

    sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 $MaxExpectedPathBDP"
    

    L'impostazione tcp_rmem accetta tre valori:

    • La dimensione minima del buffer di ricezione che può essere allocata per un socket TCP. In questo esempio, il valore è 4096 byte.
    • La dimensione predefinita del buffer di ricezione, che sostituisce anche la dimensione Valore /proc/sys/net/core/rmem_default utilizzato da altri protocolli. Nella Ad esempio, il valore è 87380 byte.
    • La dimensione massima del buffer di ricezione che può essere allocata per un socket TCP. Nell'esempio, è impostato sul valore impostato in precedenza (8388608 byte).
  7. Configura le impostazioni del buffer di memoria di invio TCP (tcp_wmem):

    sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 $MaxExpectedPathBDP"
    

    L'impostazione tcp_wmem assume tre valori:

    • Lo spazio del buffer di invio TCP minimo disponibile per una singola socket TCP.
    • Lo spazio di buffer predefinito consentito per un singolo socket TCP.
    • Lo spazio massimo del buffer di invio TCP.
  8. Imposta i parametri di configurazione in modo che le connessioni successive utilizzino i valori specificati:

    sudo sysctl -w net.ipv4.route.flush=1
    

Per rendere queste impostazioni persistenti tra i riavvii, aggiungi i comandi che hai impostato in precedenza al file /etc/sysctl.conf:

sudo bash -c 'cat << EOF >> /etc/sysctl.conf
net.core.rmem_max=8388608
net.core.wmem_max=8388608
net.ipv4.tcp_rmem=4096 87380 8388608
net.ipv4.tcp_wmem=4096 16384 8388608
net.ipv4.route.flush=1
EOF'

Test di RTT con una dimensione della finestra aggiornata

Quando il protocollo TCP ha una dimensione della finestra sufficientemente grande da utilizzare il BDP, l'immagine cambia, come mostrato nel seguente diagramma:

Il mittente invia una grande quantità di dati alla volta e attende pochissimo tempo per l&#39;aggiornamento di una finestra

Le dimensioni della finestra TCP possono essere sempre adattate in base alle risorse disponibili per il processo interessato e all'algoritmo TCP in uso. Come mostra il diagramma, finestra consente a una connessione di andare ben oltre le dimensioni della finestra di 65 KiB definita specifica TCP originale.

Puoi verificarlo autonomamente. Innanzitutto, assicurati di aver apportato modifiche alle dimensioni della finestra TCP sul computer locale e su un computer remoto impostando i parametri di configurazione su entrambe le macchine. Poi esegui questi comandi:

dd if=/dev/urandom of=sample.txt bs=1M count=1024 iflag=fullblock
scp sample.txt your_username@remotehost.com:/some/remote/directory

Il primo comando crea un file sample.txt da 1 GB contenente dati casuali. La il secondo comando copia il file dalla tua macchina locale a una macchina remota.

Prendi nota dell'output del comando scp nella console, che mostra la larghezza di banda in Kbps. Dovresti notare una differenza significativa nei risultati prima e dopo le modifiche delle dimensioni della finestra TCP.

Passaggi successivi