在试图解决应用性能问题时,通常对通信层延迟的影响估计不足,但如果你要引导你的努力朝向实际的解决方案,正确的理解是至关重要的。
首先,我所说的通信层延迟是指一个数据包从本地系统到远程系统再回到本地系统所需要的时间。通信层延迟的最大因素是距离--至少对于地理上相隔的主机来说是这样。另一个主要因素是本地和远程主机之间处理数据包的设备数量;这包括路由器和防火墙等。链路的带宽起着一定的作用,但没有大多数人想象的那么大。带宽会影响插入延迟--把一个数据包放在电线上需要多长时间,但电线上的信号以基于介质而不是带宽的速度传播。在接下来的讨论中,当我指的是通信层延迟时,我将只使用延迟。
为了演示延迟如何影响你的应用程序,让我们假设你在客户端应用程序中输入一些数据并按下回车键。客户端应用程序发送一条消息到服务器应用程序,等待响应,然后再发送另一条消息,等待响应,等等;进行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 |
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 |