Thomas Marquardt撰寫的文章following描述了IIS如何處理ASP.Net請求,可以配置爲運行的最大/最小CLR工作線程/受管IO線程,涉及的各種請求隊列及其默認大小。ASP.NET IIS - 何時請求排隊?
現在按照文章,下面在IIS 6.0中出現:
- ASP.NET拿起從IIS IO線程的要求和崗位「HSE_STATUS_PENDING」到IIS IO線程
- 的請求是移交給CLR工作線程
- 如果請求的延遲時間很長,並且所有線程都被佔用(線程數接近httpRuntime.minFreeThreads),則請求將發佈到應用程序級請求隊列(此隊列是每個AppDomain )
-
ASP.NET還檢查併發執行請求的數量。文章指出,「如果併發執行的請求數太高」它會將傳入的請求到ASP.NET全局請求隊列(這是每個工作進程)(請檢查更新2)
我想知道什麼是「閾值」,ASP.NET認爲當前執行它的請求數量太高,然後開始將請求排入全局ASP.NET請求隊列?
我認爲這個閾值將取決於工作線程的最大數量的配置,但可能有一些公式基於哪個ASP.NET將確定併發執行的請求的數量過高並開始將請求排入隊列ASP.NET全局請求隊列。這個公式是什麼?或者這個設置是可配置的?
更新
我通過製品再次讀取和評價部分,我發現這個:
1)在IIS 6和IIS 7經典模式,每個應用程序(應用程序域) 有一個隊列,它用於維護工作線程的可用性 。如果可用工作線程的編號 低於 httpRuntime minFreeThreads指定的限制,則此隊列中的請求數將增加。當超出 httpRuntime appRequestQueueLimit指定的限制時,請求將被拒絕,並顯示503狀態碼,客戶端將收到 HttpException,並顯示消息「服務器太忙」。還有一個 ASP.NET性能計數器「請求在應用程序隊列中」, 指示隊列中有多少個請求。是的,CLR線程 池是由.NET ThreadPool類公開的。
2)requestQueueLimit命名不好。它實際上限制了同時可以由ASP.NET 提供服務的最大數量的請求。這包括正在排隊的請求和 正在執行的請求。如果「請求當前」性能 計數器超過requestQueueLimit,新的傳入請求將被 拒絕並顯示503狀態碼。
所以基本上requestQueueLimit限制了排隊的請求數量(我假定這將總結請求的數量在排隊應用程序隊列加上全球ASP.Net請求隊列加上正在執行的請求的數目)並正在執行。儘管這並沒有回答原來的問題,但它確實提供了關於何時我們可能因爲大量的併發請求/高延遲請求而收到503服務器繁忙錯誤的信息。
(檢查更新2)
更新2 有在我的理解犯的一個錯誤。我混合了IIS 6和IIS 7的描述。
本質上,當ASP.NET以集成模式託管在IIS 7.5和7.0上時,應用程序級隊列不再存在,ASP.NET維護全局請求隊列。
因此,如果執行請求的數量很高,IIS 7/7.5將開始將請求排隊到全局請求隊列。這個問題更適用於IIS 7/7.5,而不是6.
據IIS 6.0而言,沒有全局ASP.NET請求隊列,但符合下列條件:
1. ASP。 NET從IIS IO線程獲取請求並將「HSE_STATUS_PENDING」發佈到IIS IO線程
2.將請求移交給CLR工作線程
3.如果請求的延遲時間很長,並且所有線程都被佔用(線程數接近httpRuntime.minFreeThreads),那麼請求將被髮布到應用程序級請求隊列(此隊列是每個AppDomain的)
4. ASP.NET還會在接受新請求之前檢查排隊和當前正在執行的請求的數量。如果此數字大於processModel.requestQueueLimit指定的值,則傳入的請求將被503服務器繁忙錯誤拒絕。
我已經添加到問題的更新已使問題可能不太相關的IIS 7/7.5。並且更新確實提供了關於IIS 6.0的答案 – Ngm
您鏈接到的文章表示閾值由MaxConcurrentRequestsPerCPU確定。有沒有理由不相信這是事實? – RandomEngy