1. 程式人生 > >LR報:Error 27796 Failed to connect to server

LR報:Error 27796 Failed to connect to server

慢慢 action sim prot doc 錯誤 分析 failed 最小

原錯誤信息:

Action.c(58): Error -27796: Failed to connect to server "10.1.44.68:7013": [10048] Address already in use
Try changing the registry value
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters\TcpTimedWaitDelay to 30
and HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters\MaxUserPort to 65534
and rebooting the machine
See the readme.doc file for more information

根據以上錯誤信息以此對HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters\下的TcpTimedWaitDelay,MaxUserPort。tcp端口釋放的時間和tcp端口的數量進行更改;

附Windows系統下的TCP參數優化(註冊表\TCPIP\Parameters):https://blog.csdn.net/libaineu2004/article/details/49054261

修改完後重啟機器再次壓測只報原Error -27796TcpTimedWaitDelay 錯誤信息,一下是我解決問題時分析的過程:

1.在此壓測出現Error -27796錯誤之前, lr tps,art等資源都是穩定狀態;報TcpTimedWaitDelay錯誤信息時,tps曲線直接下跌到底。使用netstat -ano > d:\port.text查看一下,基本都是time_wait狀態,這個錯誤以前運到過,當時由於給予解決問題,便記錄了這樣解決的過程:http://www.cnblogs.com/what-/p/8048212.html

分析:根據網上度娘方法,TcpTimedWaitDelay表示系統釋放已關閉的TCP連接必須等待的時間,換句話說系統內有大量連接處於TIME_WAIT狀態,則會導致並發量與吞吐量的嚴重下降縮小該項值,可以更快地釋放已關閉的連接,難道是客戶端性能太好,發壓的速率太快導致把tcp/ip的連接或端口占滿。不應該呀!在網上查了一下,win7系統最大設置fffe65534tcp/ip,也有設置fff的; tpc端口數按理說已經是設置的最大了包括tcp的關閉時間也設置了最小,這大量的TIME_WAIT到底是怎麽導致的,百思不得其解?

2.最後解決的方法是:在 Run-time Setting/Browser Emulation中將Simulate a new user on each iteration 選項去掉(默認是選中的)。重新運行一切正常,沒有錯誤出現。

該項值表示默認Controller在調用VUG腳本時,每次叠代模擬一個新的用戶,首先清空瀏覽器中的緩存,在重新獲取前端層的信息;去掉這個選項的意思是,始終使用一個tcp/ip鏈接,不斷開,也就是開發人員所說的長鏈接或持久連接。

短連接:建立連接-----發送和接收報文1-------關閉連接;

長連接:建立連接-----發送和接收報文1.。。。2.。。。3-----關閉連接 ;

3.選r中Run-time Setting/internet Protocol/Winlnet replay instead of sockets(Windows only)替換上面的方式,也是可以解決掉此類問題;

這個項值表示回放腳本通過sockets端口方式進行, 慶幸的是我們程序支持sockets方式,建議需要通過sockets方式回放時,在選擇這項值。

4.使用wireshark工具通過對lr通信信息進行抓取,在監測通訊過程中發現,問題出現在第二次握手,客戶端已經發出syn包,但服務器端沒有接受到syn包,當TIME_WAIT1s秒鐘後再次發出syn包,服務器端可以接收到此包,問題出現了,就是說這個請求在沒有建立連接時就出現錯誤了,神奇了。

靜下心了慢慢分析了一下客戶端與服務器端建立的過程:

1.第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers);

2.第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

3.第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據;

附tcp/ip三次握手連接及seq和ack號的正確理解:http://blog.sina.com.cn/s/blog_735e97540101ir8h.html

分析:抓取這樣的結果,我的tcp端口還沒有使用滿的前提下,報Error -27796,根據網上排查的思路,一般是腳本的問題。我使用lr最多也是web(html/http),一般走http接口時,我會把Mode=HTML改HTTP,一些get請求有時候就沒有RecContentType=text/html不去指定返回的內容,要麽空或者要麽沒有要麽刪掉,都是可以執行成功的。根據度娘的解答如果缺少RecContentType=text/html返回類型的話,會造成服務器無法識別;

LR報:Error 27796 Failed to connect to server