2012-06-07 50 views
29

Thomas Marquardt撰寫的文章following描述了IIS如何處理ASP.Net請求,可以配置爲運行的最大/最小CLR工作線程/受管IO線程,涉及的各種請求隊列及其默認大小。ASP.NET IIS - 何時請求排隊?

現在按照文章,下面在IIS 6.0中出現:

  1. ASP.NET拿起從IIS IO線程的要求和崗位「HSE_STATUS_PENDING」到IIS IO線程
  2. 的請求是移交給CLR工作線程
  3. 如果請求的延遲時間很長,並且所有線程都被佔用(線程數接近httpRuntime.minFreeThreads),則請求將發佈到應用程序級請求隊列(此隊列是每個AppDomain )
  4. 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服務器繁忙錯誤拒絕。

+0

我已經添加到問題的更新已使問題可能不太相關的IIS 7/7.5。並且更新確實提供了關於IIS 6.0的答案 – Ngm

+0

您鏈接到的文章表示閾值由MaxConcurrentRequestsPerCPU確定。有沒有理由不相信這是事實? – RandomEngy

回答

2

This article可能有助於更好地瞭解設置。

minFreeThreads:此設置使用的工作進程隊列中的所有傳入的請求,如果可用線程的 線程池數低於此設定值。此設置 將可同時運行的請求數有效地限制爲maxWorkerThreads minFreeThreads的 。將minFreeThreads設置爲88 *# CPU。這將併發請求的數量限制爲12個(假設 maxWorkerThreads爲100)。

編輯:

在這種SO post,托馬斯提供了更多的細節和的請求在集成的管道處理的例子。請務必閱讀關於答案的評論以獲取更多解釋。

一個土生土長的回調(在webengine.dll)拿起在CLR工人 線程請求,我們比較maxConcurrentRequestsPerCPU * CPUCount以總價 主動請求。如果我們已經超出限制,請求被插入到 全局隊列(本地代碼)中。否則,它將被執行。如果排隊的是 ,則當其中一個活動請求完成時它將被排隊。

+0

是的,它在IIS 6.0中。我還提到了這個問題:如果請求的延遲時間很長,並且所有線程都被佔用(線程數接近httpRuntime.minFreeThreads),則請求將發佈到應用程序級請求隊列(此隊列是每個AppDomain) – Ngm

+0

'對,只適用於傳統的應用程序池。 – ulty4life