在Windows XP和Linux的Telnet性能
我有一个基于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
谢谢大家。我已经解决了这个问题。有两种算法: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)
你要telnet到什么?理想情况下,您的Telnet服务器可以延迟ACK工作。 – 2010-09-30 14:26:58
我在MS的网上搜索过。 RFC中定义了延迟ACK。但Linux似乎有更好的表现。通过修改寄存器,windows可以禁用此功能。我认为对于TCP_NODELAY,如果服务器和客户端无法设置它,它会对我的情况有所帮助。 – Rainman 2010-11-05 07:09:21
TcpAckFrequency = 2(默认值= 2,1 =禁用延迟的ACK,2-n =如果在定时间隔之前n个未完成的ACK,已发送ACK) 子项:HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \服务\ TCPIP \参数\接口\ 项:的TcpAckFrequency 值类型:REG_DWORD,数 有效范围:0-255 默认值:2 – Rainman 2010-11-05 07:09:41
谢谢。我知道了:)。 0.2s延迟是由windows的“延迟ACK算法”引起的,其默认值为0.2s – Rainman 2010-09-29 09:33:56