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 |
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 |