2010-09-29 79 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