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.197Pinging host 192.168.200.197 : 192.168.200.197ICMP Echo Reply:TTL 53 time = 84 msICMP Echo Reply:TTL 53 time = 80 msICMP Echo Reply:TTL 53 time = 81 msICMP Echo Reply:TTL 53 time = 96 msHost 192.168.200.197 replied to all 4 of the 4 pings |
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' -privilegedready 09:12:42telnet 192.168.200.197 6666Trying...telnet: Unable to connect to remote host: The connection was refused.ready 09:12:53telnet 192.168.200.197 6666Trying...telnet: Unable to connect to remote host: The connection was refused.ready 09:12:56telnet 192.168.200.197 6666Trying...telnet: Unable to connect to remote host: The connection was refused.ready 09:12:58telnet 192.168.200.197 6666Trying...telnet: Unable to connect to remote host: The connection was refused.ready 09:12:58stop_process packet_monitor -no_ask Stopping Noah_Davids.CAC (packet_monitor).ready 09:13:07d packet_monitor.out%phx_vos#m16_mas>SysAdmin>Noah_Davids>packet_monitor.out 09-11-13 09:13:17 mstNoah_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 causepacket_monitor to bind to ALL interfaces on the module,greatly increasing the amount of Streams memory used!!!*********************************************************** dir icmp type+ tcphh: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 RAready 09:13:07Process 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 1tping 192.168.200.197 23 1Success/Tries=Percent min/average/max success times1/1=100.000% 83.284/83.284/83.284 Connection in 83.284 ms2/2=100.000% 81.697/82.490/83.284 Connection in 81.697 ms3/3=100.000% 80.858/81.946/83.284 Connection in 80.858 ms4/4=100.000% 80.858/81.895/83.284 Connection in 81.743 ms^C |
