Concurrent connection limit
這幾天在做IIS 6上Web Service (WSE 2.0)的性能測試。在這個過程中陸續(xù)發(fā)現(xiàn)和解決了一些問題。
其中有一個問題比較有意思。我和項目組的同事發(fā)現(xiàn),不論我們用C#寫的模擬客戶端用多少并發(fā)量來連接Web Service,服務(wù)器端監(jiān)測到的并發(fā)連接數(shù)(性能記數(shù)器中的Web Service\Current Connections)總是每客戶端最高2個。這使得我們無法查看服務(wù)器在大并發(fā)量下的真切反應(yīng)。
那么為什么服務(wù)器會對每客戶端做出最高2個并發(fā)量的限制呢?
通過查找資料,我找到了問題的根源。原來,在HTTP 1.1 Spec中針對Persistent Connections提出了這樣的Practical considerations:
Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion.
以上內(nèi)容表明,為了提高HTTP響應(yīng)時間以及避免產(chǎn)生網(wǎng)絡(luò)堵塞,HTTP連接中的客戶端不應(yīng)該與服務(wù)器端建立超過2個的HTTP連接。如果有更多的請求需要,那么這些請求將被pipeline到這兩個HTTP連接之中,并以異步的方式傳送給服務(wù)器端。舉個例子:有上百輛汽車(requests)想從天津開往北京,但是天津與北京之間最多只允許修建兩條公路(HTTP connection),因此這些汽車要想從天津駛往北京的話,就只能走這兩條公路。
但是,有時的確需要突破這樣的限制。比如我一開始提到的性能測試,我需要用盡可能少的客戶端程序來模擬盡可能多的用戶訪問,而不能為了模擬1000個并發(fā)量同時使用500臺機器來測。那么應(yīng)該怎樣通過一個測試應(yīng)用程序來產(chǎn)生指定的并發(fā)數(shù)量呢?
不難看出,為了提高單一測試應(yīng)用程序所產(chǎn)生的并發(fā)量,就應(yīng)該增加兩個指標(biāo):網(wǎng)絡(luò)客戶端數(shù)量和單一客戶端的HTTP連接數(shù)量。就我所知,可以通過以下兩種方法來分別提高這兩個指標(biāo)。
方法一:使用AppDomain
在. NET中,一個AppDomain就被視為網(wǎng)絡(luò)連接中的一個客戶端,因此如果希望用一個測試應(yīng)用程序模擬多個客戶端,那么只須創(chuàng)建多個AppDomain 即可。需要注意的是,對于每一個AppDomain,最高2個的連接限額仍然存在,不同之處只是我們可以使用一個測試應(yīng)用程序發(fā)送超過2個的并發(fā)請求了(現(xiàn)在為了模擬1000個并發(fā)量就不需要找500臺測試機器了)。請看下面的代碼:
AppDomain appDomain = AppDomain.CreateDomain("");
appDomain.ExecuteAssembly(@"TestClient.exe");
AppDomain.Unload(appDomain);
在這里,我通過調(diào)用AppDomain的靜態(tài)方法CreateDomain創(chuàng)建了一個新的應(yīng)用程序域,并要求該應(yīng)用程序域執(zhí)行一個應(yīng)用程序 TestClient.exe。該應(yīng)用程序?qū)⒇?fù)責(zé)向服務(wù)器發(fā)送請求(最多只能建立兩個連接)。你可以通過多線程的方式來驅(qū)動上述代碼,使得大量應(yīng)用程序域在近乎相同的時間里被創(chuàng)建,從而就可以模擬指定數(shù)量的客戶端,并產(chǎn)生所希望的并發(fā)訪問量。
方法二:使用配置文件
除了增加客戶端數(shù)量以外,我們還可以增加單一客戶端所能建立的HTTP連接數(shù)量。在.NET中實現(xiàn)這一目標(biāo)非常容易,只需要在客戶端(沒錯,是客戶端!)的配置文件中增加以下幾行即可:
<system.net>
?<connectionManagement>
? <add address="*" maxconnection="100"/>
?</connectionManagement>
</system.net>
其中,connectionManagement節(jié)點負(fù)責(zé)指定客戶端與某一網(wǎng)絡(luò)主機之間所能建立的最高連接數(shù)量。它在Machine.config文件中的默認(rèn)取值就是2。我們完全可以在應(yīng)用程序級的配置文件中對這一限額做出更改。address屬性表明該連接限額針對的是哪一個網(wǎng)絡(luò)地址,*表明所有的網(wǎng)絡(luò)主機;如果寫成address="www.google.com"就表明后面的maxconnection只適用于對google的訪問。
好了,現(xiàn)在就可以根據(jù)自己的需要來更改配置了。如果你把maxconnection的取值改成了1000,那么你的測試應(yīng)用程序與服務(wù)器之間所能建立的最高連接數(shù)量就是測試用應(yīng)用程序域的數(shù)量 * 1000,測吧!
轉(zhuǎn)載于:https://www.cnblogs.com/gxh973121/archive/2005/04/18/139484.html
總結(jié)
以上是生活随笔為你收集整理的Concurrent connection limit的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载python 教学视频.md
- 下一篇: 微观经济学论文选题怎么选?