Socket.Listen方法用於將 Socket 置於偵聽狀態
backlog(樓主說的引數)
掛起連線佇列的最大長度。
backlog 引數指定佇列中最多可容納的等待接受的傳入連線數。若要確定可指定的最大連線數,要參照 MaxConnections 值
程式程式碼:
// create the socket
Socket listenSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// bind the listening socket to the port
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
listenSocket.Bind(ep);
// start listening
listenSocket.Listen(backlog);
考慮預設值為5明顯應該是MaxConnections 。
後面的測試驗證,就是這個引數非常的致命,在修改為200之後,tps直接*2。
返回來分析這個引數,預設最多容許有5個空閒長連線。考慮到100個工作執行緒,正常應該長連線數目也在100附近,考慮每次請求都要先申請一個連線,用完
之後再放回,100個工作執行緒同時操作,很有可能同時將超過5個的連線返還給連線池。如果伺服器簡單的判斷說多於5個連線然後就立即close並釋放長連
接,那麼就會出現一方面連續釋放長連線,一方面因為連線數不夠不停的建立新的長連線。
換言之,當100個執行緒併發在連線池中進行申請連線/返還連線的過程中,連線池內的可用連線數是時刻變化的,實際的數目會有大的波動。而預設的最大空閒引數過小(預設才5)使得這個波動有極大的機率突破限制,從而造成連線池進行不必要的釋放所謂過多的“空閒”連線。
Socket.Listen方法用於將 Socket 置於偵聽狀態
backlog(樓主說的引數)
掛起連線佇列的最大長度。
backlog 引數指定佇列中最多可容納的等待接受的傳入連線數。若要確定可指定的最大連線數,要參照 MaxConnections 值
程式程式碼:
// create the socket
Socket listenSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
// bind the listening socket to the port
IPAddress hostIP = (Dns.Resolve(IPAddress.Any.ToString())).AddressList[0];
IPEndPoint ep = new IPEndPoint(hostIP, port);
listenSocket.Bind(ep);
// start listening
listenSocket.Listen(backlog);
考慮預設值為5明顯應該是MaxConnections 。
後面的測試驗證,就是這個引數非常的致命,在修改為200之後,tps直接*2。
返回來分析這個引數,預設最多容許有5個空閒長連線。考慮到100個工作執行緒,正常應該長連線數目也在100附近,考慮每次請求都要先申請一個連線,用完
之後再放回,100個工作執行緒同時操作,很有可能同時將超過5個的連線返還給連線池。如果伺服器簡單的判斷說多於5個連線然後就立即close並釋放長連
接,那麼就會出現一方面連續釋放長連線,一方面因為連線數不夠不停的建立新的長連線。
換言之,當100個執行緒併發在連線池中進行申請連線/返還連線的過程中,連線池內的可用連線數是時刻變化的,實際的數目會有大的波動。而預設的最大空閒引數過小(預設才5)使得這個波動有極大的機率突破限制,從而造成連線池進行不必要的釋放所謂過多的“空閒”連線。