現在一個測試項目,發現性能測試機中有很多TIME_WAIT狀態的TCP連接,在網上查了一下,這種狀態也叫TCP半連接狀態。
測試環境:9台windows測試機,其中包括一台壓力控制機,即controller機器
服務器環境:IIS7.0+MS SQL
問題表現:controller機器使用其中任何一台windows測試機並發5個vuser或者更多,都會在8分鍾或者10分鍾左右出現大量的失敗交易
分析:通過在cmd中查看netstat -ano > d:/port.txt(把netstat打印的信息輸出到當前D盤根目錄下)查看TCP連接,有大量的TIME_WAIT狀態的TCP連接,大約有6W多個time_wait狀態的TCP連接,咱們windows系統最大端口數量才只有65536個端口,性能測試機每次通過TCP訪問server都會占用一個本地端口,導致time_wait狀態(半連接狀態)過多,並且不釋放,導致新的TCP連接去尋找新的端口。如果widows提供的65536個端口全部用完,time_wait狀態大量存在,就不會再有新建立的連接,則會出現timeout,導致大量的並發用戶數宕掉。這嚴重影響了並發的發起,該問題已經提交到運維部,請他們來協助
解決辦法:
1、修改注冊表中的tcpip的屬性值:TIMEWAIT回收時間
在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名為TcpTimedWaitDelay的DWORD鍵,設置為十進制0,以縮短TIME_WAIT的等待時間。
測試結果:TIME_WAIT狀態的連接依然大量存在,每台機器可以承擔少量的並發不會出現錯誤;當並發增大時則會出現大量的錯誤。