Windows系統下的TCP引數最佳化

zuoluo2003發表於2016-05-31
通常會採用修改登錄檔的方式改進Windows的系統引數。下面將為大家介紹Windows系統下的TCP引數最佳化方式,適用於Windows 2003、Windows XP、Windows 7以及Server版。對於具體的系統環境與效能需求,最佳化方式會有所差異,效果也不盡相同,僅是個人的建議。所有的最佳化操作都透過修改登錄檔實現,需要使用regedit命令進入登錄檔並建立或修改引數,修改完成後需要重啟系統,以使之生效。以下使用的引數值均為10進位制。


1. TCPWindowSize


TCPWindowSize的值表示TCP的視窗大小。TCP Receive Window(TCP資料接收緩衝)定義了傳送端在沒有獲得接收端的確認資訊的狀態下可以傳送的最大位元組數。此數值越大,返回的確認資訊就越少,相應的在傳送端和接收端之間的通訊就越好。此數值較小時可以降低傳送端在等待接收端返回確認資訊時發生超時的可能性,但這將增加網路流量,降低有效吞吐率。TCP在傳送端和接收端之間動態調整一個最大段長度MSS(Maximum Segment Size)的整數倍。MSS在連線開始建立時確定,由於TCP Receive Window被調整為MSS的整數倍,在資料傳輸中完全長度的TCP資料段的比例增加,故而提高了網路吞吐率。


預設情況下,TCP將試圖根據MSS來最佳化視窗大小,起始值為16KB,最大值為64KB。TCPWindowSize的最大值通常為65535位元組(64KB),乙太網最大段長度為1460位元組,低於64KB的1460的最大整數倍為62420位元組,因而可以在登錄檔中將TCPWindowSize設定為62420,作為高頻寬網路中適用的效能最佳化值。具體操作如下:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為TCPWindowSize的REG_DWORD值,該值的範圍是從0到65535,將該值設定為62420。


2. TCP1323Opts


為了更高效地利用高頻寬網路,可以使用比上述TCP視窗大得多的TCP視窗大小,此特性是Windows 2000和Windows Server 2003中的新特性,稱為TCP Window Scaling,它將以前的65535位元組(64KB)的限制提高到了1073741824位元組(1GB)。在頻寬與延遲的乘積值很高的連線上(例如衛星連線),可能需要將視窗的大小增加到64KB以上。使用TCP Window Scaling,系統可以允許確認資訊間更大資料量的傳輸,增加了網路吞吐量及效能。傳送端和接收端往返通訊所需的時間被稱為迴環時間(RTT)。TCP Window Scaling僅在TCP連線的雙方都開啟時才真正有效。TCP有一個時間戳選項,透過更加頻繁地計算來提高RTT值的估測值,此選項特別有助於估測更長距離的廣域網上連線的RTT值,並更加精確地調整TCP重發超時時間。時間戳在TCP報頭提供了兩個區域,一個記錄開始重發的時間,另一個記錄接收到的時間。時間戳對於TCP Window Scaling,即確認資訊收到前的大資料包傳送特別有用,啟用時間戳僅僅在每個資料包的頭部增加12位元組,對網路流量的影響微乎其微。資料完整性與資料吞吐率最大化哪個更為重要是個需要評估的問題。在某些環境中,例如影片流傳輸,需要更大的TCP視窗,這是最重要的,而資料完整性排在第二位。在這種環境中,TCP Window Scaling可以不開啟時間戳。當傳送端和接收端均啟用TCP Window Scaling和時間戳時,此特性才有效。不過,若在發包時加入了時間戳,經過NAT之後,如果前面相同的埠被使用過,且時間戳大於這個連線發出的SYN中的時間戳,就會導致伺服器忽略該SYN,表現為使用者無法正常完成TCP的3次握手。初始時生成小的TCP視窗,之後視窗大小將按照內部演算法增大。具體操作如下:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為TCP1323Opts的REG_DWORD值,該值的具體含義為:0(預設值)表示禁用TCP Window Scaling和時間戳;1表示只啟用TCP Window Scaling;2表示只啟用時間戳;3表示同時啟用TCP Window Scaling和時間戳。TCP1323Opts設定為啟用TCP Window Scaling後,可以將上文中的登錄檔項TCPWindowSize的值增大,最大能達到1GB,為了達到最佳效能,這裡的值最好設定成MSS的倍數,推薦值為256960位元組。


3. TCP 控制塊表


對於每個TCP連線,控制變數儲存在一個稱為TCP控制塊(TCB)的記憶體塊中。TCB表的大小由登錄檔項MaxHashTableSize控制。在活動連線很多的系統中,設定一個較大的表可以降低系統定位TCB表的時間。在TCB表上分割槽可以降低對錶的訪問的爭奪。增加分割槽的數量,TCP的效能會得到最佳化,特別是在多處理器的系統上。登錄檔項NumTcbTablePartitions控制分割槽的數量,預設是處理器個數的平方。TCB通常預置在記憶體中,以防止TCP反覆連線和斷開時,TCB反覆重新定位浪費時間,這種緩衝的方式促進了記憶體管理,但同時也限制了同一時刻允許的TCP連線數量。登錄檔項MaxFreeTcbs決定了處於空閒等待狀態的TCB重新可用之前的連線數量,在NT架構中常設定成高於預設值,以確保有足夠的預置的TCB。從Windows 2000開始新增了一個新特性,降低超出預置TCB執行的可能性。如果處於等待狀態的連線多於MaxFreeTWTcbs中的設定,所有等待時間超過60秒的連線將被強制關閉,以後再次啟用。此特性合併到Windows 2000 Server和Windows Server 2003後,MaxFreeTcbs將不再用於最佳化效能。具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為MaxHashTableSize的REG_DWORD值,該值的範圍是從1到65536,並且必須為2的N次方,預設值為512,建議設為8192。然後在Parameters子鍵下建立或修改名為NumTcbTablePartitions的REG_DWORD值,該值的範圍是從1到65536,並且必須為2的N次方,預設值為處理器個數的平方,建議設為處理器核心數的4倍。


4. TcpTimedWaitDelay


TcpTimedWaitDelay的值表示系統釋放已關閉的TCP連線並複用其資源之前,必須等待的時間。這段時間間隔就是以前的Blog中提到的TIME_WAIT狀態(2MSL,資料包最長生命週期的兩倍狀態)。如果系統顯示大量連線處於TIME_WAIT狀態,則會導致併發量與吞吐量的嚴重下降,透過減小該項的值,系統可以更快地釋放已關閉的連線,從而為新連線提供更多的資源,特別是對於高併發短連線的Server具有積極的意義。


該項的預設值是240,即等待4分鐘後釋放資源;系統支援的最小值為30,即等待時間為30秒。具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為TcpTimedWaitDelay的REG_DWORD值,該值的範圍是從0到300,建議將該值設定為30。


5. MaxUserPort


MaxUserPort的值表示當應用程式向系統請求可用的埠時,TCP/IP可分配的最大埠號。如果系統顯示建立連線時出現異常,那麼有可能是由於匿名(臨時)埠數不夠導致的,特別是當系統開啟大量埠來與Web service、資料庫或其他遠端資源建立連線時。


該項的預設值是十進位制的5000,這也是系統允許的最小值。Windows預設為匿名(臨時)埠保留的埠號範圍是從1024到5000。為了獲得更高的併發量,建議將該值至少設為32768以上,甚至設為理論最大值65534,特別是對於模擬高併發測試環境的Client具有積極的意義。具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為MaxUserPort的REG_DWORD值,該值的範圍是從5000到65534,預設值為5000,建議將該值設定為65534。


6. 動態儲備


動態儲備的值使系統能自動調整其配置,以接受大量突發的連線請求。如果同時接收到大量連線請求,超出了系統的處理能力,那麼動態儲備就會自動增大系統支援的暫掛連線的數量(即Client已請求而Server尚未處理的等待連線數,TCP連線的總數包括已連線數與等待連線數),從而可減少連線失敗的數量。系統的處理能力和支援的暫掛連線的數量不足時,Client的連線請求將直接被拒絕。


預設情況下,Windows 不啟用動態儲備,可以透過以下操作進行開啟和設定:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改下列名稱的REG_DWORD值。


EnableDynamicBacklog,值為1,表示開啟動態儲備。
MinimumDynamicBacklog,值為128,表示支援的最小暫掛連線的數量為128。
MaximumDynamicBacklog,值為2048,表示支援的最大暫掛連線的數量為2048。對於高併發短連線的Server,建議最大值設為1024及以上。
DynamicBacklogGrowthDelta,值為128,表示支援的暫掛連線的數量的增量為128,即數量不足時自增長128,直到達到設定的最大值,如2048。
7. KeepAliveTime


KeepAliveTime的值控制系統嘗試驗證空閒連線是否仍然完好的頻率。如果該連線在一段時間內沒有活動,那麼系統會傳送保持連線的訊號,如果網路正常並且接收方是活動的,它就會響應。如果需要對丟失接收方的情況敏感,也就是說需要更快地發現是否丟失了接收方,請考慮減小該值。而如果長期不活動的空閒連線的出現次數較多,但丟失接收方的情況出現較少,那麼可能需要增大該值以減少開銷。


預設情況下,如果空閒連線在7200000毫秒(2小時)內沒有活動,系統就會傳送保持連線的訊息。 通常建議把該值設為1800000毫秒,從而丟失的連線會在30分鐘內被檢測到。具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為KeepAliveTime的REG_DWORD值,為該值設定適當的毫秒數。


8. KeepAliveInterval


KeepAliveInterval的值表示未收到另一方對“保持連線”訊號的響應時,系統重複傳送“保持連線”訊號的頻率。在無任何響應的情況下,連續傳送“保持連線”訊號的次數超過TcpMaxDataRetransmissions(下文將介紹)的值時,將放棄該連線。如果網路環境較差,允許較長的響應時間,則考慮增大該值以減少開銷;如果需要儘快驗證是否已丟失接收方,則考慮減小該值或TcpMaxDataRetransmissions值。


預設情況下,在未收到響應而重新傳送“保持連線”的訊號之前,系統會等待1000毫秒(1秒),可以根據具體需求修改,具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為KeepAliveInterval的REG_DWORD值,為該值設定適當的毫秒數。


9. TcpMaxDataRetransmissions


TcpMaxDataRetransmissions的值表示TCP資料重發,系統在現有連線上對無應答的資料段進行重發的次數。如果網路環境很差,可能需要提高該值以保持有效的通訊,確保接收方收到資料;如果網路環境很好,或者通常是由於丟失接收方而導致資料的丟失,那麼可以減小該值以減少驗證接收方是否丟失所花費的時間和開銷。


預設情況下,系統會重新傳送未返回應答的資料段5次,可以根據具體需求修改,具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為TcpMaxDataRetransmissions的REG_DWORD值,該值的範圍是從0到4294967295,預設值為5,根據實際情況進行設定。


10. TcpMaxConnectRetransmisstions


TcpMaxConnectRetransmisstions的值表示TCP連線重發,TCP退出前重發非確認連線請求(SYN)的次數。對於每次嘗試,重發超時是成功重發的兩倍。在Windows Server 2003中預設超時次數是2,預設超時時間為3秒(在登錄檔項TCPInitialRTT中)。速度較慢的WAN連線中超時時間可相應增加,不同環境中可能會有不同的最最佳化設定,需要在實際環境中測試確定。超時時間不要設定太大否則將不會發生網路連線超時時間。具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters登錄檔子鍵,在Parameters子鍵下建立或修改名為TcpMaxConnectRetransmisstions的REG_DWORD值,該值的範圍是從0到255,預設值為2,根據實際情況進行設定。然後在Parameters子鍵下建立或修改名為TCPInitialRTT的REG_DWORD值,同樣根據實際情況進行設定。


11. TcpAckFrequency


TcpAckFrequency的值表示系統傳送應答訊息的頻率。如果值為2,那麼系統將在接收到2個分段之後傳送應答,或是在接收到1個分段但在200毫秒內沒有接收到任何其他分段的情況下傳送應答;如果值為3,那麼系統將在接收到3個分段之後傳送應答,或是在接收到1個或2個分段但在200毫秒內沒有接收到任何其他分段的情況下傳送應答,以此類推。如果要透過消除應答延遲來縮短響應時間,那麼建議將該值設為1。在此情況下,系統會立即傳送對每個分段的應答;如果連線主要用於傳輸大量資料,而200毫秒的延遲並不重要,那麼可以減小該值以降低應答的開銷。


預設情況下,系統將該值設為2,即每隔一個分段應答一次。該值的有效範圍是0到255,其中0表示使用預設值2,可以根據具體需求修改,具體操作:


瀏覽至HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\xx(xx由網路介面卡決定)登錄檔子鍵,在xx子鍵下建立或修改名為TcpAckFrequency的REG_DWORD值,該值的範圍是從1到13,預設值為2,根據希望每傳送幾個分段返回一個應答而設定該值,建議百兆網路設為5,千兆網路設為13。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/76103/viewspace-2109910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章