跳转至主要内容

在试图解决应用性能问题时,通常对通信层延迟的影响估计不足,但如果你要引导你的努力朝向实际的解决方案,正确的理解是至关重要的。

首先,我所说的通信层延迟是指一个数据包从本地系统到远程系统再回到本地系统所需要的时间。通信层延迟的最大因素是距离--至少对于地理上相隔的主机来说是这样。另一个主要因素是本地和远程主机之间处理数据包的设备数量;这包括路由器和防火墙等。链路的带宽起着一定的作用,但没有大多数人想象的那么大。带宽会影响插入延迟--把一个数据包放在电线上需要多长时间,但电线上的信号以基于介质而不是带宽的速度传播。在接下来的讨论中,当我指的是通信层延迟时,我将只使用延迟。

为了演示延迟如何影响你的应用程序,让我们假设你在客户端应用程序中输入一些数据并按下回车键。客户端应用程序发送一条消息到服务器应用程序,等待响应,然后再发送另一条消息,等待响应,等等;进行N个回合。在N个回合结束时,客户端应用程序将结果返回给你。

假设需要10个回合,服务器应用程序需要1ms的时间来处理客户端消息并发回一个答案。在延迟为1ms的情况下,你得到的响应时间为10*(1ms+1ms)或20ms。现在坐上飞机去芝加哥,服务器停留在波士顿,所以你现在的延迟比如说50ms,响应时间为10*(50ms+1ms)或550ms。这足以让人注意到,但不会让人痛苦。将匝数增加到100,你现在有一个痛苦的5.5秒的响应时间。你可能会认为100个回合是过度的,但一些复杂的数据库查询或填写复杂表格的应用程序可以做到这一点。你知道你的应用程序需要多少个回合吗?
通过OSL做一个copy_file也会表现出这种行为。OSL会以4K的事务发送文件。每个事务都需要一个响应,所以一个1,000,000字节的文件将需要1,000,000 / 4,096 = 245个事务,或者使用前一段的命名法。同样,假设处理事务的时间为1ms,延迟为1ms,那么copy_file将需要490ms。如果我们把延迟增加到50ms,将需要12.495秒。如果我们将文件增加到1,000,000,000字节,则需要244,141个事务;1ms延迟的相应时间为488.282秒,50ms延迟的相应时间为12,451.191秒,差不多3.5小时。

衡量延迟的最简单方法是用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

 

不幸的是,网络阻止ping数据包,或者主机忽略它们的现象越来越普遍,你甚至可以告诉STCP忽略它们(从15.3、16.2和17x开始)。如果你不能使用ping,你可以使用packet_monitor来计算连接请求得到响应所需的时间。例如,用""命令启动packet_monitor。start_process 'packet_monitor -numeric -time_stamp -filter -host A.B.C.D -port NNN' -privileged”.然后输入命令"telnet A.B.C.D NNN”.你应该进行几次连接,得到一个平均值。请注意,我正在连接到远程主机上一个未使用的端口。这减少了跟踪中的数据包数量,但如果防火墙阻止了端口,你可能需要使用一个活动端口。

 

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

你也可以使用我写的一个程序,在不需要使用packet_monitor的情况下对连接进行计时。参见http://members.cox.net/ndav1/self_published/stcp_tping.doc。stcp_tping命令需要你连接到远程主机的一个活动端口。在本例中,我使用的是23号端口(telnet),但任何活动端口都可以使用。命令末尾的数字1表示每秒钟发送一次请求。

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

 

如果你还没有系统来测量,如何估计延迟?最简单的方法是在同一地理区域找到一个系统,然后测量它的延迟。这将给你一个非常粗略的估计。我喜欢使用学院和大学,因为我知道他们的位置,而且他们有可能在校园里托管自己的系统,至少是较大的大学,可能有高带宽的互联网链接。该网站 http://www.utexas.edu/world/univ/state/该网站按州列出了许多大学的网站。该网站 http://www.bulter.nl/universities/按国家列出了世界各地大学的网站。请记住,通过企业VPN和通过互联网进行通信可能有很大的不同。

 

你怎么能解决这个问题?你可能无法解决。你可能可以控制一些链接的带宽,也许可以控制一些网络设备,但你肯定无法控制距离。你可以做的是通过减少所需的转数来改变应用程序,使其对延迟不那么敏感。

 

如果你使用OSL来长距离移动大文件,我只能说不要。根据文件类型的不同,你可以使用FTP,或SFTP或SCP。如果不是的话,Stratus ftp 站点有一个叫做 tcp_save 的应用程序(ftp://ftp.stratus.com/vos/network/tcp_save.save.evf.gz),它可以让你在不使用 OSL 的情况下通过 TCP 复制文件。它需要一些设置,但可以大大减少大文件的复制时间。

 

© 2024Stratus Technologies.