2010-09-29 38 views
1

我有一个基于Python的telnetlib推动的库。 最近,我注意到在Windows XP和Linux的性能是如此不同。在Windows XP和Linux的Telnet性能

下面的脚本,我设计了三种操作,“得单位”,“只需按回车”,“得与选择单位”

“获得单位”有一长串的回报,“得与选择单位”返回短字符串,并且“只需按Enter”将返回最短的字符串。

让我们猜测,这将花费更多的时间,似乎它的顺序应该是“获取单位”,“获取具有选项的单位”,然后“只需按Enter”。

,但实际的结果是Windows XP中:

得到单位:3.67200016975小号 的选项得到单位:10.0319998264小号 只需按ENTER键:10.0小号

在Ubuntu相同的测试: 得到单位:3.91432785988 得到单位选择:2.86995506287 只需按ENTER键:2.05337381363

看来,Windows XP中有大量的IP分组不错的表现,但对于小数据包,它是如此糟糕。

我已经使用windows的telnet客户端putty手动测试过它。使用wireshark捕获telnet数据。并发现,对于小包,数据包延迟是这么长,大约0.2s

我试图改变TCP窗口,但没有帮助。

任何人都可以提出一些建议吗?

try: 
    begin_g = time.time() 
    for i in range(50): 
     connection.write('ZUSI:OMU;') 
     ret = connection.read_until('<') 
     ret = connection.read_until('<') 
    end_g = time.time() 
    elapse_g = end_g-begin_g 

    clean_begin_t = time.time() 
    for i in range(50): 
     ret = ipa.get_units() 
    clean_end_t = time.time() 
    elapse_c = clean_end_t-clean_begin_t 

    begin_wu = time.time() 
    for i in range(50): 
     connection.write('') 
     ret = connection.read_until_prompt() 
    end_wu = time.time() 
    elapse_wu = end_wu-begin_wu 

回答

0

也许是因为Nagle's algorithm延迟发送短包。

你可以通过在XP机器上禁用Nagle算法来测试(谷歌如何做到这一点)。

+0

谢谢。我知道了:)。 0.2s延迟是由windows的“延迟ACK算法”引起的,其默认值为0.2s – Rainman 2010-09-29 09:33:56

0

谢谢大家。我已经解决了这个问题。有两种算法:Nagle算法,延迟的ACK算法。我的问题是由“延迟的ACK算法”造成的。不幸的是,它不能在Python中设置。我必须修改寄存器,将值设置为1,它可以工作。但我认为这不够好。 Linux支持TCP_QUICKACK。但Windows不。

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Tcpip \Parameters \Interfaces \{Adapter-id}] 
TcpAckFrequency = 2 (Default=2, 1=Disables delayed ACK, 2-n = If n outstanding ACKs before timed interval, sent ACK) 

More Info MS KB Q328890 
More Info MS KB 815230 (XP/2003 needs hotfix or SP2 for it to work) 
More Info MS KB 935458 (Vista needs hotfix or SP1 for it to work) 
+0

你要telnet到什么?理想情况下,您的Telnet服务器可以延迟ACK工作。 – 2010-09-30 14:26:58

+0

我在MS的网上搜索过。 RFC中定义了延迟ACK。但Linux似乎有更好的表现。通过修改寄存器,windows可以禁用此功能。我认为对于TCP_NODELAY,如果服务器和客户端无法设置它,它会对我的情况有所帮助。 – Rainman 2010-11-05 07:09:21

+0

TcpAckFrequency = 2(默认值= 2,1 =禁用延迟的ACK,2-n =如果在定时间隔之前n个未完成的ACK,已发送ACK) 子项:HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ TCPIP \参数\接口\ <接口GUID> 项:的TcpAckFrequency 值类型:REG_DWORD,数 有效范围:0-255 默认值:2 – Rainman 2010-11-05 07:09:41