Ottimizzazione della latenza delle applicazioni con il bilanciamento del carico

Questo documento descrive le opzioni di bilanciamento del carico e mostra in che modo la tua scelta di un bilanciatore del carico specifico su Google Cloud influisce sulla latenza end-to-end.

Opzioni per il bilanciamento del carico

A seconda del tipo di traffico inviato alla tua applicazione, hai diverse opzioni per il bilanciamento del carico esterno. La seguente tabella riassume le opzioni a tua disposizione:

Opzione Descrizione Flusso di traffico Ambito
Bilanciatore del carico delle applicazioni esterno Supporta il traffico HTTP(S) e funzionalità avanzate, come la mappatura degli URL e l'offload SSL
Utilizza un bilanciatore del carico di rete proxy esterno per il traffico non HTTP su porte specifiche.
La sessione TCP o SSL (TLS) viene terminata nei Google Front End (GFE), al limite della rete di Google, e il traffico viene inviato tramite proxy ai backend. Globale
Bilanciatore del carico di rete passthrough esterno Consente il passaggio del traffico TCP/UDP tramite qualsiasi porta attraverso il bilanciatore del carico. Distribuito utilizzando la tecnologia Maglev di Google per distribuire il traffico ai backend. Regionale

Poiché i bilanciatori del carico interni e Cloud Service Mesh non supportano il traffico rivolto agli utenti, non rientrano nell'ambito di questo articolo.

Le misurazioni di questo articolo utilizzano il livello Premium in Network Service Tiers perché il bilanciamento del carico globale richiede questo livello di servizio.

Misurare la latenza

Quando accede a un sito web ospitato in us-central1, un utente in Germania utilizza i seguenti metodi per testare la latenza:

Quando confronti i risultati, tieni presente che la latenza sui collegamenti in fibra è limitata dalla distanza e dalla velocità della luce nella fibra, che è di circa 200.000 km al secondo (o 124.724 miglia al secondo).

La distanza tra Francoforte, in Germania, e Council Bluffs, in Iowa (la regione us-central1), è di circa 7500 km. Con la fibra diretta tra le località, la latenza di andata e ritorno è la seguente:

7,500 km * 2 / 200,000 km/s * 1000 ms/s = 75 milliseconds (ms)

Il cavo in fibra ottica non segue un percorso rettilineo tra l'utente e il data center. La luce sul cavo in fibra passa attraverso apparecchiature attive e passive lungo il suo percorso. Una latenza osservata di circa 1,5 volte quella ideale, ovvero 112,5 ms, indica una configurazione quasi ideale.

Confronto della latenza

Questa sezione confronta il bilanciamento del carico nelle seguenti configurazioni:

  • Nessun bilanciamento del carico
  • Bilanciatore del carico di rete passthrough esterno
  • Bilanciatore del carico delle applicazioni esterno o bilanciatore del carico di rete proxy esterno

In questo scenario, l'applicazione è costituita da un gruppo di istanze gestite a livello di regione di server web HTTP. Poiché l'applicazione si basa su chiamate a bassa latenza a un database centrale, i server web devono essere ospitati in un'unica posizione. L'applicazione viene implementata nella regione us-central1 e gli utenti sono distribuiti in tutto il mondo. La latenza osservata dall'utente in Germania in questo scenario illustra ciò che gli utenti di tutto il mondo potrebbero sperimentare.

Scenario di latenza.
Scenario di latenza (fai clic per ingrandire).

Nessun bilanciamento del carico

Quando un utente effettua una richiesta HTTP, a meno che non sia configurato il bilanciamento del carico, il traffico scorre direttamente dalla rete dell'utente alla macchina virtuale (VM) ospitata su Compute Engine. Per il livello Premium, il traffico entra nella rete di Google in un punto di presenza (PoP) edge vicino alla posizione dell'utente. Per il livello Standard, il traffico utente entra nella rete di Google in un POP vicino alla regione di destinazione. Per saperne di più, consulta la documentazione di Network Service Tiers.

Architettura senza bilanciamento del carico.
Architettura senza bilanciamento del carico (fai clic per ingrandire).

La tabella seguente mostra i risultati ottenuti quando l'utente in Germania ha testato la latenza di un sistema senza bilanciamento del carico:

Metodo Risultato Latenza minima
Invia un ping all'indirizzo IP della VM (la risposta proviene direttamente dal server web)
  ping -c 5 compute-engine-vm
  
  PING compute-engine-vm (xxx.xxx.xxx.xxx) 56(84) bytes of data.
  64 bytes from compute-engine-vm (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=56 time=111 ms
  64 bytes from compute-engine-vm (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=56 time=110 ms
  [...]
  --- compute-engine-vm ping statistics ---
  5 packets transmitted, 5 received, 0% packet loss, time 4004ms
  rtt min/avg/max/mdev = 110.818/110.944/111.265/0.451 ms
  
110 ms
TTFB
  for ((i=0; i < 500; i++)); do curl -w  /
  "%{time_starttransfer}\n" -o /dev/null -s compute-engine-vm; done
  
  0.230
  0.230
  0.231
  0.231
  0.230
  [...]
  0.232
  0.231
  0.231
  
230 ms

La latenza TTFB è stabile, come mostrato nel seguente grafico delle prime 500 richieste:

Grafico della latenza alla VM in ms.
Grafico della latenza alla VM in ms (fai clic per ingrandire).

Quando esegui il ping dell'indirizzo IP della VM, la risposta proviene direttamente dal server web. Il tempo di risposta del server web è minimo rispetto alla latenza di rete (TTFB). Questo perché viene aperta una nuova connessione TCP per ogni richiesta HTTP. Prima dell'invio della risposta HTTP è necessario un handshake iniziale a tre vie, come mostrato nel diagramma seguente. Pertanto, la latenza osservata è quasi il doppio della latenza ping.

Richiesta HTTP client/server.
Richiesta HTTP client/server (fai clic per ingrandire).

Bilanciatore del carico di rete passthrough esterno

Con i bilanciatori del carico di rete passthrough esterni, le richieste degli utenti entrano comunque nella rete Google nel PoP perimetrale più vicino (nel livello Premium). Nella regione in cui si trovano le VM del progetto, il traffico passa prima attraverso un bilanciatore del carico di rete passthrough esterno. Viene quindi inoltrato senza modifiche alla VM di backend di destinazione. Il bilanciatore del carico di rete passthrough esterno distribuisce il traffico in base a un algoritmo di hashing stabile. L'algoritmo utilizza una combinazione di porta di origine e di destinazione, indirizzo IP e protocollo. Le VM ascoltano l'IP del bilanciatore del carico e accettano il traffico senza modifiche.

Architettura con un bilanciatore del carico di rete passthrough esterno.
Architettura con un bilanciatore del carico di rete passthrough esterno (fai clic per ingrandire).

La seguente tabella mostra i risultati quando l'utente in Germania ha testato la latenza per l'opzione di bilanciamento del carico di rete.

Metodo Risultato Latenza minima
Esegui il ping del bilanciatore del carico di rete passthrough esterno
  ping -c 5 net-lb
  
  PING net-lb (xxx.xxx.xxx.xxx) 56(84) bytes of data.
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=44 time=110 ms
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=44 time=110 ms
  [...]
  64 bytes from net-lb (xxx.xxx.xxx.xxx): icmp_seq=5 ttl=44 time=110 ms
  --- net-lb ping statistics ---
  5 packets transmitted, 5 received, 0% packet loss, time 4007ms
  rtt min/avg/max/mdev = 110.658/110.705/110.756/0.299 ms
  
110 ms
TTFB
 for ((i=0; i < 500; i++)); do curl -w /
    "%{time_starttransfer}\n" -o /dev/null -s net-lb
 
 0.231
 0.232
 0.230
 0.230
 0.232
 [...]
 0.232
 0.231
 
230 ms

Poiché il bilanciamento del carico avviene all'interno di una regione e il traffico viene solo inoltrato, non si verifica un impatto significativo sulla latenza rispetto a quando non è presente un bilanciatore del carico.

Bilanciamento del carico esterno

Con i bilanciatori del carico delle applicazioni esterni, i GFE fungono da proxy per il traffico. Questi GFE si trovano sul perimetro della rete globale di Google. GFE termina la sessione TCP e si connette a un backend nella regione più vicina in grado di gestire il traffico.

Scenario del bilanciatore del carico delle applicazioni esterno.
Scenario del bilanciatore del carico delle applicazioni esterno (fai clic per ingrandire).

La tabella seguente mostra i risultati quando l'utente in Germania ha testato la latenza per l'opzione di bilanciamento del carico HTTP.

Metodo Risultato Latenza minima
Esegui il ping del bilanciatore del carico delle applicazioni esterno
 ping -c 5 http-lb
 
 PING http-lb (xxx.xxx.xxx.xxx) 56(84) bytes of data.
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=1 ttl=56 time=1.22 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=2 ttl=56 time=1.20 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=3 ttl=56 time=1.16 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=4 ttl=56 time=1.17 ms
 64 bytes from http-lb (xxx.xxx.xxx.xxx): icmp_seq=5 ttl=56 time=1.20 ms
 --- http-lb ping statistics ---
 5 packets transmitted, 5 received, 0% packet loss, time 4005ms
 rtt min/avg/max/mdev = 1.163/1.195/1.229/0.039 ms
 
1 ms
TTFB
 for ((i=0; i < 500; i++)); do curl -w /
    "%{time_starttransfer}\n" -o /dev/null -s http-lb; done
 
 0.309
 0.230
 0.229
 0.233
 0.230
 [...]
 0.123
 0.124
 0.126
 
123 ms

I risultati per il bilanciatore del carico delle applicazioni esterno sono significativamente diversi. Quando esegui il ping del bilanciatore del carico delle applicazioni esterno, la latenza nel tempo di round trip è leggermente superiore a 1 ms. Questo risultato rappresenta la latenza del GFE più vicino, che si trova nella stessa città dell'utente. Questo risultato non riflette la latenza effettiva che l'utente riscontra quando tenta di accedere all'applicazione ospitata nella regione us-central1. Gli esperimenti che utilizzano protocolli (ICMP) diversi dal protocollo di comunicazione dell'applicazione (HTTP) possono essere fuorvianti.

Quando si misura il TTFB, le richieste iniziali mostrano una latenza di risposta simile. Alcune richieste raggiungono la latenza minima inferiore di 123 ms, come mostrato nel grafico seguente:

Latenza al bilanciatore del carico delle applicazioni esterno nel grafico ms.
Grafico della latenza del bilanciatore del carico delle applicazioni esterno in ms (fai clic per ingrandire).

Due round trip tra il client e la VM richiedono più di 123 ms anche con fibra diretta. La latenza è inferiore perché i GFE fungono da proxy per il traffico. I GFE mantengono connessioni permanenti alle VM di backend. Pertanto, solo la prima richiesta da un GFE specifico a un backend specifico richiede un handshake a tre vie.

Ogni località ha più GFE. Il grafico della latenza mostra più picchi fluttuanti la prima volta che il traffico raggiunge ogni coppia GFE-backend. Il GFE deve quindi stabilire una nuova connessione a questo backend. Questi picchi riflettono hash delle richieste diversi. Le richieste successive mostrano una latenza inferiore.

Richiesta HTTP osservata per la prima volta rispetto alla successiva tramite GFE.
Richiesta HTTP osservata per la prima volta rispetto a quella osservata successivamente tramite GFE (fai clic per ingrandire).

Questi scenari dimostrano la latenza ridotta che gli utenti possono riscontrare in un ambiente di produzione. La seguente tabella riassume i risultati:

Opzione Dindin TTFB
Nessun bilanciamento del carico 110 ms al server web 230 ms
Bilanciatore del carico di rete passthrough esterno 110 ms al bilanciatore del carico di rete passthrough esterno nella regione 230 ms
Bilanciatore del carico delle applicazioni esterno 1 ms alla GFE più vicina 123 ms

Quando un'applicazione integra gli utenti in una regione specifica, i GFE in quella regione mantengono aperta una connessione persistente a tutti i backend di servizio. Per questo motivo, gli utenti di questa regione notano una latenza ridotta nella loro prima richiesta HTTP se si trovano lontano dal backend dell'applicazione. Se gli utenti si trovano vicino al backend dell'applicazione, non notano un miglioramento della latenza.

Per le richieste successive, ad esempio quando si fa clic su un link di una pagina, non si verifica alcun miglioramento della latenza perché i browser moderni mantengono una connessione permanente al servizio. Questo comando è diverso da un comando curl emesso dalla riga di comando.

Effetti di latenza aggiuntivi del bilanciatore del carico delle applicazioni esterno

Gli effetti osservabili aggiuntivi con il bilanciatore del carico delle applicazioni esterno dipendono dai pattern di traffico.

  • Il bilanciatore del carico delle applicazioni esterno ha una latenza inferiore per gli asset complessi rispetto al bilanciatore del carico di rete passthrough esterno perché sono necessari meno round trip prima che una risposta venga completata. Ad esempio, quando l'utente in Germania misura la latenza sulla stessa connessione scaricando ripetutamente un file di 10 MB, la latenza media per il bilanciatore del carico di rete passthrough esterno è di 1911 ms. Con il bilanciatore del carico delle applicazioni esterno, la latenza media è di 1341 ms. In questo modo si risparmiano circa 5 round trip per richiesta. Le connessioni permanenti tra i GFE e i backend di pubblicazione riducono gli effetti di TCP Slow Start.

  • Il bilanciatore del carico delle applicazioni esterno riduce significativamente la latenza aggiuntiva per un handshake TLS (in genere 1-2 round trip aggiuntivi). Questo perché il bilanciatore del carico delle applicazioni esterno utilizza l'offload SSL e solo la latenza al PoP edge è pertinente. Per l'utente in Germania, la latenza minima osservata è 201 ms utilizzando il bilanciatore del carico delle applicazioni esterno, rispetto a 525 ms utilizzando HTTP(S) tramite il bilanciatore del carico di rete passthrough esterno.

  • Il bilanciatore del carico delle applicazioni esterno consente l'upgrade automatico della sessione rivolta all'utente a HTTP/2. HTTP/2 può ridurre il numero di pacchetti necessari utilizzando miglioramenti nel protocollo binario, nella compressione delle intestazioni e nel multiplexing delle connessioni. Questi miglioramenti possono ridurre la latenza osservata ancora di più rispetto a quella osservata passando al bilanciatore del carico delle applicazioni esterno. HTTP/2 è supportato dai browser attuali che utilizzano SSL/TLS. Per l'utente in Germania, la latenza minima è diminuita ulteriormente da 201 ms a 145 ms quando si utilizza HTTP/2 anziché HTTPS.

Ottimizzazione dei bilanciatori del carico delle applicazioni esterni

Puoi ottimizzare la latenza per la tua applicazione utilizzando il bilanciatore del carico delle applicazioni esterno nel seguente modo:

  • Se parte del traffico che gestisci è memorizzabile nella cache, puoi eseguire l'integrazione con Cloud CDN. Cloud CDN riduce la latenza pubblicando gli asset direttamente all'edge della rete di Google. Cloud CDN utilizza anche le ottimizzazioni TCP e HTTP di HTTP/2 menzionate nella sezione Effetti aggiuntivi della latenza del bilanciatore del carico delle applicazioni esterno.

  • Puoi utilizzare qualsiasi partner CDN con Google Cloud. Se utilizzi uno dei partner CDN Interconnect di Google, benefici di costi di trasferimento dati scontati.

  • Se i contenuti sono statici, puoi ridurre il carico sui server web pubblicandoli direttamente da Cloud Storage tramite il bilanciatore del carico delle applicazioni esterno. Questa opzione viene combinata con Cloud CDN.

  • Il deployment dei server web in più regioni vicine agli utenti può ridurre la latenza perché il bilanciatore del carico indirizza automaticamente gli utenti alla regione più vicina. Tuttavia, se la tua applicazione è parzialmente centralizzata, progettala in modo da ridurre il numero di round trip tra regioni.

  • Per ridurre la latenza all'interno delle applicazioni, esamina le chiamate di procedura remota (RPC) che comunicano tra le VM. Questa latenza si verifica in genere quando le applicazioni comunicano tra livelli o servizi. Strumenti come Cloud Trace possono aiutarti a ridurre la latenza causata dalle richieste di pubblicazione delle applicazioni.

  • Poiché i bilanciatori del carico di rete proxy esterni si basano sui GFE, l'effetto sulla latenza è lo stesso osservato con il bilanciatore del carico delle applicazioni esterno. Poiché il bilanciatore del carico delle applicazioni esterno ha più funzionalità rispetto al bilanciatore del carico di rete proxy esterno, consigliamo di utilizzare i bilanciatori del carico delle applicazioni esterni per il traffico HTTP(S).

Passaggi successivi

Ti consigliamo di eseguire il deployment dell'applicazione vicino alla maggior parte dei tuoi utenti. Per ulteriori informazioni sulle diverse opzioni di bilanciamento del carico in Google Cloud, consulta i seguenti documenti: