Passa al contenuto principale

L'impatto della latenza del livello di comunicazione viene solitamente sottovalutato quando si cerca di risolvere i problemi di prestazioni delle applicazioni, ma una corretta comprensione è fondamentale se si desidera orientare i propri sforzi verso soluzioni pratiche.

Innanzitutto, per latenza del livello di comunicazione intendo il tempo impiegato da un pacchetto per arrivare dal sistema locale al sistema remoto e tornare indietro. Il fattore più importante nella latenza del livello di comunicazione è la distanza, almeno per gli host geograficamente separati. L'altra componente importante è il numero di dispositivi tra gli host locali e remoti che elaborano i pacchetti, inclusi router e firewall. La larghezza di banda dei collegamenti ha un ruolo importante, ma non così rilevante come molti pensano. La larghezza di banda influisce sul ritardo di inserimento, ovvero il tempo necessario per inviare un pacchetto sulla linea, ma il segnale sulla linea viaggia a una velocità basata sul mezzo di trasmissione e non sulla larghezza di banda. Nel resto di questa discussione userò semplicemente il termine "latenza" quando mi riferisco alla latenza del livello di comunicazione.

Per dimostrare come la latenza influisca sulla tua applicazione, supponiamo che tu inserisca alcuni dati in un'applicazione client e premi Invio. L'applicazione client invia un messaggio a un'applicazione server, attende una risposta e quindi invia un altro messaggio, attende una risposta e così via per un certo numero N di "turni". Al termine dei N turni, l'applicazione client ti presenta i risultati.

Supponiamo che siano necessari 10 turni e che l'applicazione server impieghi 1 ms per elaborare il messaggio del client e inviare una risposta. Con una latenza di 1 ms, il tempo di risposta è pari a 10 * (1 ms + 1 ms) ovvero 20 ms. Ora prendiamo un aereo e voliamo a Chicago: il server rimane a Boston, quindi la latenza è pari a circa 50 ms e il tempo di risposta è pari a 10 * (50 ms + 1 ms) ovvero 550 ms. Si tratta di un tempo sufficiente per essere percepito, ma non fastidioso. Aumenta il numero di turni a 100 e ora avrai un tempo di risposta fastidioso di 5,5 secondi. Potresti pensare che 100 turni siano eccessivi, ma alcune query di database complesse o applicazioni che compilano moduli complessi possono fare proprio questo. Sapete quanti turni richiedono le vostre applicazioni?
Anche l'esecuzione di un copy_file tramite OSL mostra questo comportamento. OSL invierà un file in transazioni da 4K. Ogni transazione richiede una risposta, quindi un file da 1.000.000 byte richiederà 1.000.000 / 4.096 = 245 transazioni o turni, per usare la nomenclatura del paragrafo precedente. Ancora una volta, ipotizzando 1 ms per elaborare la transazione e una latenza di 1 ms, il comando copy_file richiederà 490 ms. Se aumentiamo la latenza a 50 ms, saranno necessari 12,495 secondi. Se aumentiamo il file a 1.000.000.000 byte, saranno necessarie 244.141 transazioni, con tempi corrispondenti di 488,282 secondi per una latenza di 1 ms e 12.451,191 secondi, ovvero quasi 3,5 ore, per una latenza di 50 ms.

Il modo più semplice per misurare la latenza è con il ping.

ping 192.168.200.197
Pinging host 192.168.200.197 : 192.168.200.197
ICMP Echo Reply:TTL 53 time = 84 ms
ICMP Echo Reply:TTL 53 time = 80 ms
ICMP Echo Reply:TTL 53 time = 81 ms
ICMP Echo Reply:TTL 53 time = 96 ms
Host 192.168.200.197 replied to all 4 of the 4 pings

 

Purtroppo sta diventando sempre più comune che le reti blocchino i pacchetti ping o che gli host li ignorino; è anche possibile impostare STCP in modo che li ignori (a partire dalle versioni 15.3, 16.2 e 17x). Se non è possibile utilizzare ping, è possibile utilizzare packet_monitor per misurare il tempo necessario per ottenere una risposta a una richiesta di connessione. Ad esempio, avviare packet_monitor con il comando "start_process 'packet_monitor -numeric -time_stamp -filter -host A.B.C.D -port NNN' -privileged”. Quindi digitare il comando “telnet A.B.C.D NNN”. È necessario effettuare diverse connessioni e calcolare una media. Si noti che mi sto connettendo a una porta inutilizzata sull'host remoto. Ciò riduce il numero di pacchetti nella traccia, ma se un firewall blocca la porta potrebbe essere necessario utilizzare una porta attiva.

 

start_process 'packet_monitor -numeric -time_stamp -filter -host 192.168.200.197
+ -port 6666' -privileged
ready 09:12:42
telnet 192.168.200.197 6666
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 09:12:53
telnet 192.168.200.197 6666
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 09:12:56
telnet 192.168.200.197 6666
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 09:12:58
telnet 192.168.200.197 6666
Trying...
telnet: Unable to connect to remote host: The connection was refused.
ready 09:12:58
stop_process packet_monitor -no_ask
Stopping Noah_Davids.CAC (packet_monitor).
ready 09:13:07
d packet_monitor.out
%phx_vos#m16_mas>SysAdmin>Noah_Davids>packet_monitor.out 09-11-13 09:13:17 mst
Noah_Davids.CAC logged in on %phx_vos#m16 at 09-11-13 09:12:42 mst.
packet_monitor -numeric -time_stamp -filter -host 192.168.200.197 -port 6666
***********************************************************
WARNING: failure to specify a specific interface will cause
packet_monitor to bind to ALL interfaces on the module,
greatly increasing the amount of Streams memory used!!!
***********************************************************
dir                                                 icmp type
+     tcp
hh:mm:ss.ttt    len proto source             destination         src port dst p
+ort type
9:12:52.984 T 0004 TCP 172.16.77.128       192.168.200.197           62515
+ 6666 S
9:12:53.067 R 0000 TCP 192.168.200.197     172.16.77.128              6666
+ 62515 RA
9:12:56.643 T 0004 TCP 172.16.77.128       192.168.200.197           62516
+ 6666 S
9:12:56.724 R 0000 TCP 192.168.200.197     172.16.77.128              6666
+ 62516 RA
9:12:58.003 T 0004 TCP 172.16.77.128       192.168.200.197           62517
+ 6666 S
9:12:58.086 R 0000 TCP 192.168.200.197     172.16.77.128              6666
+ 62517 RA
9:12:58.805 T 0004 TCP 172.16.77.128       192.168.200.197           62518
+ 6666 S
9:12:58.887 R 0000 TCP 192.168.200.197     172.16.77.128              6666
+ 62518 RA
ready 09:13:07
Process finished.
Terminating Noah_Davids.CAC (packet_monitor). Process stopped by Noah_Davids.CA
+C.

 

Latency times:   58.887 - 58.805 = 0.082 == 82ms
58.086 - 58.003 = 0.083 == 83ms
56.724 - 56.643 = 0.081 == 81ms
53.067 - 52.984 = 0.083 == 83ms

È anche possibile utilizzare un programma che ho scritto che misura i tempi delle connessioni senza bisogno di usare packet_monitor. Vedere http://members.cox.net/ndav1/self_published/stcp_tping.doc. Il comando stcp_tping richiede che ci si connetta a una porta attiva sull'host remoto. In questo caso sto usando la porta 23 (telnet), ma qualsiasi porta attiva funzionerà. Il numero 1 alla fine del comando indica che verrà inviata una richiesta al secondo.

stcp_tping 192.168.200.197 23 1
tping 192.168.200.197 23 1
Success/Tries=Percent    min/average/max success times
1/1=100.000%             83.284/83.284/83.284     Connection in 83.284 ms
2/2=100.000%             81.697/82.490/83.284     Connection in 81.697 ms
3/3=100.000%             80.858/81.946/83.284     Connection in 80.858 ms
4/4=100.000%             80.858/81.895/83.284     Connection in 81.743 ms
^C

 

Come è possibile stimare la latenza se non si dispone già dei sistemi necessari per misurarla? Il modo più semplice è trovare un sistema nella stessa area geografica e misurare la latenza rispetto ad esso. In questo modo si otterrà una stima molto approssimativa. Mi piace utilizzare college e università poiché so dove si trovano e probabilmente ospitano i propri sistemi nel campus e, almeno le università più grandi, dispongono probabilmente di connessioni Internet ad alta larghezza di banda. Il sito web http://www.utexas.edu/world/univ/state/ elenca i siti web di molte università per stato. Il sito web http://www.bulter.nl/universities/ elenca i siti web delle università di tutto il mondo per paese. Tieni presente che potrebbe esserci una differenza significativa tra la comunicazione tramite una VPN aziendale e quella tramite Internet.

 

Come risolvere il problema? Probabilmente non è possibile. È possibile avere un certo controllo sulla larghezza di banda di alcuni collegamenti e forse su alcuni dispositivi di rete, ma sicuramente non è possibile controllare la distanza. Ciò che si può fare è modificare l'applicazione in modo che sia meno sensibile alla latenza, riducendo il numero di turni richiesti.

 

Se stai usando OSL per spostare file di grandi dimensioni su lunghe distanze, ti consiglio di non farlo. A seconda del tipo di file, potresti usare FTP, SFTP o SCP. In caso contrario, il sito Stratus dispone di un'applicazione chiamata tcp_save (stratus) che consente di copiare efficacemente un file tramite TCP senza utilizzare OSL. Richiede una certa configurazione, ma può ridurre significativamente il tempo di copia dei file di grandi dimensioni.