2016-10-18 73 views
0

我有一個IIS應用程序;在我們的應用程序的負載測試期間,我們發現吞吐量非常低。在嘗試解決問題時,我們運行了一個測試負載測試頁面,該頁面返回約1000字節的靜態數據,並在控制器中進行睡眠。我們發現,如果睡眠持續時間大約是1秒,IIS將無法在1秒內爲超過10 rps的負載提供請求。IIS:無法獲得高吞吐量

現在我瞭解了Concurrent Requests和.Net 4.5,默認值是5000.所以如果IIS正在處理5000個併發請求,那麼它如何在10 rps時無法處理請求,每個請求都取1第二?數學不加起來。

請注意,返回靜態數據,數據大小很小,並且所有功能都是休眠。所以沒有CPU,磁盤,網絡等機器參數超限。服務器幾乎不閃爍。

這是整個控制器代碼

public ActionResult Contact() 
{ 
    Thread.Sleep(1000); 
    return View(); 
} 

在那裏的視圖返回一些靜態HTML;我使用Visual Studio模板創建了Web應用程序;該模板返回靜態HTML。

當我刪除睡眠,然後我沒有問題在高rps運行服務器。但是,然後這些請求完成得如此之快,甚至在高rps時IIS甚至不會遇到任何高併發性。

回答

0

是否所有的請求都屬於同一個會話?如果是這樣,this post指出問題的原因。

本質上,事實證明,ASP.NET會話不是線程安全的,並且不能有來自同一會話的並行請求。 ASP.NET將簡單地序列化這些調用並按順序執行它們。這會導致您在撥打Thread.Sleep()時看到的阻止。

如果請求來自不同的會話,應該沒有阻塞。在任何情況下,你可以嘗試關閉turining會議:

<sessionState mode="Off" /> 
+0

我有一個簡單的C#的負載測試程序 HttpWebResponse objWebResponse =(HttpWebResponse)objRequest.GetResponse(); 從多個線程調用以獲得所需的負載。沒有明確的會話創建。這會導致IIS上的同一會話嗎?由於我沒有發回任何會話信息,我猜不是。 – Amit

+0

除非另有說明,否則會有一個會話ID作爲響應中的cookie發回。如果後續請求一起發送該cookie,則ASP.NET將把它們全部視爲同一會話的一部分。嘗試關閉會話狀態並查看它是否適用於您的情況值得一試。 – Connor

+0

我會嘗試;但我們不會通過該負載生成器發回Cookie。 – Amit