簡體   English   中英

在IIS中托管的WCF有很多打開請求,服務速度很慢

[英]WCF hosted in IIS has lots of open requests and the service is slow down

我有一個基於JSON和POST方法的WCF Web服務,它有一個叫做網站的功能。 此函數有一個簡單的代碼,只使用下面的代碼調用另一個Web服務:

        using (var cli = new MyWebClient())
        {                
            Task<string> t = cli.UploadStringTaskAsync(myURI, "POST", request);
            if (t == await Task.WhenAny(t, Task.Delay(400)))
            {
                response = t.Result;
            }
            else
            {
                response = "";
            }
            cli.Dispose();
        }

MyWebClient類實現為:

class MyWebClient : WebClient
        {
            protected override WebRequest GetWebRequest(Uri address)
            {
                WebRequest request = base.GetWebRequest(address);
                if (request is HttpWebRequest)
                {
                    (request as HttpWebRequest).KeepAlive = true;                    
                    (request as HttpWebRequest).ContentType = "application/json";
                }
                return request;
            }
        }

問題是,我可以在IIS中看到大量請求保持打開超過18秒,甚至更多,我的工作進程中有1或2個(正如您在其中一個附件中看到的那樣)! 這使得服務變得非常慢。 請注意,此服務每秒大約有2K個請求,並且此服務的應用程序池具有包含12個工作進程的Web園,隊列限制為10K。 當(例如)4個工作進程在可預測的時間(大約450毫秒)內工作時,會發生這種情況,並且IIS顯示其請求的最大耗用時間約為380。

IIS中仍有大量請求保持打開狀態

請注意,我使用了cli.UploadStringTaskAsync ,因此不考慮cli超時。 所以,我必須實現像t == await Task.WhenAny(t, Task.Delay(400))來模擬超時。

你覺得有什么問題?! 是否使用await導致許多上下文切換並且請求排隊等待由cpu執行?


編輯:

在這里你可以找到一些有用的建議,但沒有人可以幫助解決問題。 我在我的應用程序的Web配置中設置它們但它無法解決我的問題。


更新:

作為附加信息,請注意網卡為1G,並且最多我們有100Mgb / s的帶寬使用率。 Intel Xeon E5-1650 V3 3.5 Ghz有6個內核和12個邏輯處理器。 我們有128GB的RAM和480GB的SSD。

我找到了解決問題的解決方案。 關鍵點是“processModel元素(ASP.NET設置架構)”。 正如我在問題中提到的那樣:

當(例如)4個工作進程在可預測的時間(大約450毫秒)內工作時,會發生這種情況,並且IIS顯示其請求的最大耗用時間約為380。

因此,我認為平衡工作進程之間的負載可能是個問題。 通過手動配置processModel元素,我已經解決了這個問題。 在研究了很多之后,我發現了關於processModel Element及其屬性的這個有價值的鏈接。

鏈接還描述了每個項目的所有屬性和效果。 如此鏈接中所述,有兩個重要的屬性稱為“requestLimit”和“requestQueueLimit”:

requestQueueLimit :指定在ASP.NET開始將消息“503 - Server Too Busy”返回到新請求之前隊列中允許的請求數。 默認值為5000。

requestLimit :指定在ASP.NET自動啟動新工作進程以取代當前進程之前允許的請求數。 默認為無限。

解決方案是在我的情況下通過有理數控制和限制requestLimit ,例如300。 此外,通過乘以工作進程數和requestLimit來限制requestQueueLimit 我已將工作進程數增加到20,並且通過此配置,6000請求可以完全排隊,並且每個工作進程最多有300個請求。 通過每個工作進程達到300個請求,ASP.NET自動啟動一個新的工作進程來取代當前進程。

因此,工作進程之間的負載更加均衡。 我檢查了所有隊列,沒有超過400時間的請求!

我認為通過使用這些屬性( requestLimitrequestQueueLimit工作進程數 ),此解決方案可以用作IIS和工作進程的半負載平衡器算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM