我有一个基于Python的telnetlib的图书馆。 最近,我注意到windows xp和Linux的性能是如此不同。
在脚本下方,我设计了三个操作,“获取单位”,“只需输入”,“获取带选项的单位”
“get units”有长字符串返回,“get units with options”返回更短的字符串,“只需按Enter键”将返回最短字符串。
让我们猜测,这将花费更多的时间,似乎它的顺序应该是“获取单位”,“获得带选项的单位”,然后“只需按回车”。
但是windows xp中的实际结果是:
获得单位:3.67200016975 s 获得带有期权的单位:10.0319998264 s 只需输入:10.0 s
在Ubuntu中进行相同的测试: 获得单位:3.91432785988 获得带有期权的单位:2.86995506287 只需输入: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 :(得分:0)
由于Nagle's algorithm,可能是因为发送短数据包而拖延。
你可以通过在XP机器上禁用Nagle算法来测试它(谷歌如何做到这一点)。
答案 1 :(得分: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)