Ir al contenido principal

El impacto de la latencia de la capa de comunicación suele estar subestimado cuando se trata de solucionar problemas de rendimiento de las aplicaciones, pero una comprensión correcta es fundamental si se quiere dirigir los esfuerzos hacia soluciones prácticas.

Primero, por latencia de la capa de comunicación me refiero al tiempo que tarda un paquete en ir del sistema local al sistema remoto y viceversa. El mayor factor de la latencia de la capa de comunicación es la distancia, al menos para los anfitriones separados geográficamente. El otro componente principal es el número de dispositivos entre los hosts locales y remotos que procesan los paquetes; esto incluye cosas como enrutadores y cortafuegos. El ancho de banda de los enlaces juega un papel importante pero no tan grande como la mayoría de la gente piensa. El ancho de banda afecta el retardo de inserción, es decir, el tiempo que toma poner un paquete en el cable pero la señal en el cable viaja a una velocidad basada en el medio y no en el ancho de banda. Para el resto de esta discusión sólo usaré la latencia cuando me refiera a la latencia de la capa de comunicación.

Para demostrar cómo afecta la latencia a su aplicación, digamos que introduce algunos datos en una aplicación cliente y pulsa "return". La aplicación cliente envía un mensaje a una aplicación del servidor, espera una respuesta y luego envía otro mensaje, espera una respuesta, etc.; para un número N de "vueltas". Al final de N turnos la aplicación cliente presenta los resultados de vuelta a usted.

Supongamos que se requieren 10 turnos y que la aplicación del servidor tarda 1ms en procesar el mensaje del cliente y enviar una respuesta. Con una latencia de 1ms se obtiene un tiempo de respuesta de 10 * (1ms + 1ms) o 20ms. Ahora súbete a un avión y viaja a Chicago, el servidor se queda en Boston así que ahora tienes una latencia de digamos 50ms y un tiempo de respuesta de 10 * (50ms + 1ms) o 550ms. Esto es suficiente para ser notorio pero no doloroso. Aumenta el número de vueltas a 100 y ahora tienes un doloroso tiempo de respuesta de 5,5 segundos. Puedes pensar que 100 giros es excesivo pero algunas consultas a bases de datos complejas o aplicaciones que llenan formularios complejos pueden hacer precisamente eso. ¿Sabes cuántos turnos requieren tus aplicaciones?
Hacer un copy_file vía OSL también muestra este comportamiento. OSL enviará un archivo en transacciones de 4K. Cada transacción requiere una respuesta, así que un archivo de 1.000.000 de bytes requerirá 1.000.000 / 4.096 = 245 transacciones o turnos para usar la nomenclatura del párrafo anterior. De nuevo, suponiendo 1ms para procesar la transacción y una latencia de 1ms el archivo copy_file tomará 490ms. Si aumentamos la latencia a 50ms tomará 12.495 segundos. Si aumentamos el archivo a 1.000.000.000 de bytes requerirá 244.141 transacciones; con los tiempos correspondientes de 488.282 segundos para una latencia de 1ms y 12.451.191 segundos o casi 3,5 horas para una latencia de 50ms.

La forma más simple de medir la latencia es con 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

 

Desafortunadamente se está volviendo cada vez más común que las redes bloqueen los paquetes de ping, o que los hosts los ignoren, incluso se le puede decir a STCP que los ignore (comenzando en 15.3, 16.2 y 17x). Si no puede usar ping puede usar packet_monitor para cronometrar el tiempo que tarda en obtener una respuesta a una petición de conexión. Por ejemplo, inicie packet_monitor con el comando "start_process 'packet_monitor -numeric -time_stamp -filter -host A.B.C.D -port NNN' -privileged”. Entonces escriba el comando "telnet A.B.C.D NNN”. Deberías hacer varias conexiones y obtener un promedio. Fíjese que me estoy conectando a un puerto no utilizado en el host remoto. Esto reduce el número de paquetes en el rastreo pero si un cortafuegos está bloqueando el puerto puede que necesite usar un puerto activo.

 

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

También puedes usar un programa que escribí que multiplica las conexiones sin necesidad de usar packet_monitor. Ver http://members.cox.net/ndav1/self_published/stcp_tping.doc. El comando stcp_tping requiere que te conectes a un puerto activo en el host remoto. En este caso estoy usando el puerto 23 (telnet) pero cualquier puerto activo funcionará. El número 1 al final del comando indica que se enviará una petición una vez por segundo.

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

 

¿Cómo se puede estimar la latencia si no se dispone ya de los sistemas para medirla? La forma más simple es encontrar un sistema en la misma área geográfica y medirle la latencia. Esto te dará una estimación muy aproximada. Me gusta utilizar las universidades, ya que sé dónde están ubicadas y lo más probable es que alberguen sus propios sistemas en el campus y, al menos las universidades más grandes, probablemente tengan enlaces de Internet de gran ancho de banda. El sitio web http://www.utexas.edu/world/univ/state/ lista los sitios web de muchas universidades por estado. El sitio web http://www.bulter.nl/universities/ lista los sitios web de las universidades de todo el mundo por país. Tengan en cuenta que podría haber una diferencia significativa entre comunicarse a través de una VPN corporativa y a través de Internet.

 

¿Cómo puedes arreglar el problema? Probablemente no puedas. Puede que tengas algún control sobre el ancho de banda de algunos de los enlaces y tal vez sobre algunos de los dispositivos de la red, pero ciertamente no tienes control sobre la distancia. Lo que puedes hacer es cambiar la aplicación para que sea menos sensible a la latencia reduciendo el número de vueltas requeridas.

 

Si estás usando OSL para mover grandes archivos a grandes distancias todo lo que puedo decir es que no lo hagas. Dependiendo del tipo de archivo puedes usar FTP, o SFTP o SCP. Si no, el sitio ftp Stratus tiene una aplicación llamada tcp_save(ftp://ftp.stratus.com/vos/network/tcp_save.save.evf.gz) que te permite copiar efectivamente un archivo vía TCP sin usar OSL. Requiere cierta configuración, pero puede reducir el tiempo de copia de archivos grandes de manera significativa.