Pular para o conteúdo principal

O impacto da latência da camada de comunicação é tipicamente subestimado quando se tenta corrigir problemas de desempenho da aplicação, mas a compreensão correta é crítica se você quiser direcionar seus esforços para soluções práticas.

Primeiro, por latência da camada de comunicação quero dizer o tempo que leva um pacote para ir do sistema local para o sistema remoto e voltar novamente. O maior fator na latência da camada de comunicação é a distância - pelo menos para hosts geograficamente separados. O outro componente principal é o número de dispositivos entre os hosts local e remoto que processam os pacotes; isto inclui coisas como roteadores e firewalls. A largura de banda dos links desempenha um papel, mas não tão grande quanto a maioria das pessoas pensa. A largura de banda afeta o atraso de inserção - quanto tempo leva para colocar um pacote no fio, mas o sinal no fio viaja a uma velocidade baseada no meio e não na largura de banda. Para o resto desta discussão, vou apenas usar a latência quando me refiro à latência da camada de comunicação.

Para demonstrar como a latência afeta sua aplicação, digamos que você introduza alguns dados em uma aplicação do cliente e acerte o retorno. A aplicação cliente envia uma mensagem para uma aplicação servidor, espera por uma resposta e depois envia outra mensagem, espera por uma resposta, etc.; para algum número N de "voltas". Ao final de N voltas, a aplicação cliente apresenta os resultados de volta para você.

Assumir que 10 voltas são necessárias e o aplicativo servidor leva 1ms para processar a mensagem do cliente e enviar de volta uma resposta. Com uma latência de 1ms você recebe um tempo de resposta de 10 * (1ms + 1ms) ou 20ms. Agora entre em um avião e viaje para Chicago, o servidor fica em Boston para que você tenha agora uma latência de, digamos, 50ms e um tempo de resposta de 10 * (50ms + 1ms) ou 550ms. Isto é suficiente para ser perceptível, mas não doloroso. Aumente o número de voltas para 100 e agora você tem um doloroso tempo de resposta de 5,5 segundos. Você pode pensar que 100 voltas é excessivo, mas algumas consultas complexas de banco de dados ou pedidos que preenchem formulários complexos podem fazer exatamente isso. Você sabe quantas voltas suas aplicações requerem?
Fazer um copy_file via OSL também exibe este comportamento. A OSL enviará um arquivo em transações de 4K. Cada transação requer uma resposta, portanto um arquivo de 1.000.000 bytes exigirá 1.000.000 / 4.096 = 245 transações ou turnos para usar a nomenclatura do parágrafo anterior. Novamente, assumindo 1ms para processar a transação e uma latência de 1ms o arquivo_cópia levará 490ms. Se aumentarmos a latência para 50ms, levará 12.495 segundos. Se aumentarmos o arquivo para 1.000.000.000 de bytes, serão necessárias 244.141 transações; com tempos correspondentes de 488.282 segundos para uma latência de 1ms e 12.451.191 segundos ou quase 3,5 horas para uma latência de 50ms.

A maneira mais simples de medir a latência é com 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

 

Infelizmente está se tornando cada vez mais comum as redes bloquearem pacotes de ping, ou os hosts ignorá-los, você pode até mesmo dizer à STCP para ignorá-los (começando em 15.3, 16.2 e 17x). Se você não puder usar o ping, você pode usar o packet_monitor para cronometrar o tempo que leva para obter uma resposta a uma solicitação de conexão. Por exemplo, inicie o packet_monitor com o comando "start_process 'packet_monitor -numeric -time_stamp -filter -host A.B.C.D -port NNN' -privileged”. Em seguida, digite o comando ".telnet A.B.C.D NNN”. Você deve fazer várias conexões e obter uma média. Note que estou me conectando a uma porta não utilizada no host remoto. Isto reduz o número de pacotes no traçado, mas se um firewall estiver bloqueando a porta, você pode precisar usar uma porta ativa.

 

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

Você também pode usar um programa que eu escrevi que vezes as conexões sem necessidade de usar o packet_monitor. Veja http://members.cox.net/ndav1/self_published/stcp_tping.doc. O comando stcp_tping requer que você se conecte a uma porta ativa no host remoto. Neste caso, estou usando a porta 23 (telnet), mas qualquer porta ativa funcionará. O número 1 no final do comando indica que um pedido será enviado uma 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

 

Como você pode estimar a latência se você ainda não tem os sistemas em funcionamento para medir? A maneira mais simples é encontrar um sistema na mesma área geográfica e medir a latência para ele. Isto lhe dará uma estimativa muito aproximada. Eu gosto de usar faculdades e universidades, pois sei onde elas estão localizadas e as chances são que elas hospedem seus próprios sistemas no campus e, pelo menos as universidades maiores, provavelmente têm links de Internet de alta largura de banda. O site da web http://www.utexas.edu/world/univ/state/ lista os sites de muitas universidades por estado. O site da web http://www.bulter.nl/universities/ lista os sites das universidades de todo o mundo por país. Tenha em mente que pode haver uma diferença significativa entre a comunicação através de uma VPN corporativa e pela Internet.

 

Como você pode resolver o problema? Você provavelmente não pode. Você pode ter algum controle sobre a largura de banda de alguns links e talvez sobre alguns dispositivos da rede, mas certamente não tem controle sobre a distância. O que você pode fazer é mudar a aplicação para que ela seja menos sensível à latência, reduzindo o número de voltas necessárias.

 

Se você estiver usando OSL para mover grandes arquivos a longas distâncias, tudo o que posso dizer é que não o faça. Dependendo do tipo de arquivo você pode ser capaz de usar FTP, ou SFTP ou SCP. Caso contrário, o site Stratus ftp tem um aplicativo chamado tcp_save(ftp://ftp.stratus.com/vos/network/tcp_save.save.evf.gz) que lhe permite copiar um arquivo via TCP de forma eficaz sem usar OSL. Ele requer alguma configuração mas pode reduzir significativamente o tempo de cópia de arquivos grandes.

 

© 2024 Stratus Technologies.