2010-12-22 66 views
25

我一直在WCF中編寫長輪詢服務。我在負載測試點和我遇到的是,當我到達5000個未完成的請求,我開始得到了一個問題:編寫長輪詢WCF服務

The HTTP service located at (my service) is too busy. 

我實現了這是一個WCF AsyncPattern服務和消耗的工作者/ IO線程數量仍然非常低(就像它應該)。手柄的數量看起來不錯,等等。我想我正在碰到一個反DOS的限制,只是找不到它。以下是我所做的一些事情:

我修改了註冊表,以便MaxConcurrentRequestsPerCPU不是問題。事實上,ASP.NET排隊請求的數量保持爲0.

我已經在web配置中設置了服務限制,所以這不應該是一個問題。 WCF跟蹤沒有顯示任何異常。

我正在使用不包含任何安全性的自定義綁定等,它只有編碼和傳輸(httpTransport)。

我已經修改了machine.config中最多的requestQueueLimit:這是從processModel元素:

<processModel enable="true" 
    timeout="Infinite" 
    idleTimeout="Infinite" 
    shutdownTimeout="0:00:05" 
    requestLimit="Infinite" 
    requestQueueLimit="15000" 
    restartQueueLimit="10" 
    memoryLimit="60" 
    webGarden="false" 
    cpuMask="0xffffffff" 
    userName="machine" 
    password="AutoGenerate" 
    logLevel="Errors" 
    clientConnectedCheck="0:00:05" 
    comAuthenticationLevel="Connect" 
    comImpersonationLevel="Impersonate" 
    responseRestartDeadlockInterval="00:09:00" 
    responseDeadlockInterval="00:03:00" 
    maxWorkerThreads="250" 
    maxIoThreads="250" /> 

但是還是我結束了此限制(有問題的機器可以處理它,其餘系統異步回到消息排隊系統)。

任何人都可以想到別的嗎?

我是WindowsServer 2008R2上的IIS 7.5。 Asp.NET 3.5SP1。


更多信息:當我得到上述錯誤時,ASP.Net v2.0.50727「請求被拒絕」性能計數器跳轉。文檔指出,當請求隊列已滿時會發生這種情況。請求隊列perf計數器爲0,永不變動。

如果我打開最大工作進程,我可以超過5K併發請求。

+0

您正在使用的實例模型是什麼?你有沒有機會碰到一個會議限制?實例和併發模式調整可能是另一個地方看... http://msdn.microsoft.com/en-us/magazine/cc163590.aspx – 2010-12-22 22:32:52

回答

1

是IIS限制打開的連接數?我認爲有在IIS Web站點或Web應用程序,可以做到這一點的設置。

3

來源:http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

對於V2.0和V3.5設置DWORD註冊表值@HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\MaxConcurrentRequestsPerCPU = 5000.重新啓動IIS

對於V3.5,則還可以在aspnet.config文件中設置<system.web><applicationPool maxConcurrentRequestsPerCPU="5000"/></system.web>。如果在兩個位置都設置了該值,則aspnet.config設置將覆蓋註冊表設置。

對於v4.0,默認maxConcurrentRequestsPerCPU爲5000,因此您不需要執行任何操作。

增加HTTP.sys隊列限制,其默認值爲1000.如果操作系統是x64,並且您有2 GB或更多內存,將其設置爲5000應該沒問題。如果它太低,您可能會看到HTTP.sys拒絕具有503狀態的請求。打開IIS管理器和應用程序池的高級設置,然後更改「隊列長度」的值。 如果您的ASP.NET應用程序使用Web服務(WFC或ASMX)或System.Net與HTTP後端進行通信,則可能需要增加connectionManagement/maxconnection。對於ASP.NET應用程序,autoConfig功能限制爲12 * #CPU。這意味着在一個四端口處理器上,最多可以有12 * 4 = 48個併發連接到IP端點。因爲這與autoConfig綁定,所以增加ASP.NET應用程序中最大連接的最簡單方法是以編程方式設置System.Net.ServicePointManager.DefaultConnectionLimit,例如,從Application_Start開始。將該值設置爲您希望應用程序使用的併發System.Net連接數。我已將其設置爲Int32.MaxValue,並且沒有任何副作用,因此您可以嘗試這樣做 - 這實際上是本機HTTP堆棧WinHTTP中使用的默認值。如果您無法以編程方式設置System.Net.ServicePointManager.DefaultConnectionLimit,則需要禁用autoConfig,但這意味着您還需要設置maxWorkerThreadsmaxIoThreads。如果您不使用classic/ISAPI模式,則不需要設置minFreeThreadsminLocalRequestFreeThreads