Asp.net

ASP.NET IIS - 請求何時排隊?

  • June 7, 2012

Thomas Marquardt的以下文章描述了 IIS 如何處理 ASP.Net 請求、可配置為執行的最大/最小 CLR 工作執行緒/託管 IO 執行緒、涉及的各種請求隊列及其預設大小。

現在根據文章,在 IIS 6.0 中發生以下情況:

  1. ASP.NET 從 IIS IO 執行緒獲取請求並將“HSE_STATUS_PENDING”發佈到 IIS IO 執行緒
  2. 請求被移交給 CLR Worker 執行緒
  3. 如果請求具有高延遲並且所有執行緒都被佔用(執行緒數接近 httpRuntime.minFreeThreads),則將請求發佈到應用程序級請求隊列(此隊列是每個 AppDomain)
  4. ASP.NET 還檢查並發執行請求的數量。文章指出“如果並發執行的請求數太高”,它將傳入請求排隊到 ASP.NET 全域請求隊列(這是每個工作程序)(請檢查更新 2)

我想知道什麼是“門檻值”,此時 ASP.NET 認為目前執行它的請求數太高,然後開始將請求排隊到全域 ASP.NET 請求隊列?

我認為這個門檻值將取決於最大工作執行緒數的配置,但可能有一些公式基於 ASP.NET 將確定並發執行的請求數過高並開始將請求排隊到 ASP.NET全域請求隊列。這個公式可能是什麼?或者這個設置是可配置的?


更新

我再次通讀了這篇文章,在評論部分我發現了這個:

  1. 在 IIS 6 和 IIS 7 經典模式下,每個應用程序 (AppDomain) 都有一個隊列,用於維護工作執行緒的可用性。如果可用工作執行緒數低於 httpRuntime minFreeThreads 指定的限制,則此隊列中的請求數會增加。當超過 httpRuntime appRequestQueueLimit 指定的限制時,請求將被拒絕並返回 503 狀態程式碼,並且客戶端會收到帶有消息“伺服器太忙”的 HttpException。還有一個 ASP.NET 性能計數器“應用程序隊列中的請求”,它指示隊列中有多少請求。是的,CLR 執行緒池是 .NET ThreadPool 類公開的。

  2. requestQueueLimit 命名不當。它實際上限制了 ASP.NET 可以同時處理的最大請求數。這包括排隊的請求和正在執行的請求。如果“Requests Current”性能計數器超過 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 工作執行緒

  1. 如果請求延遲高且所有執行緒都被佔用(執行緒數接近 httpRuntime.minFreeThreads),則將請求發佈到應用程序級請求隊列(此隊列是每個 AppDomain)

  2. ASP.NET 也檢查在接受新請求之前排隊和目前正在執行的請求數。如果此數字大於 processModel.requestQueueLimit 指定的值,則傳入請求將被拒絕,並出現 503 伺服器繁忙錯誤。

本文可能有助於更好地理解設置。

**minFreeThreads:**如果執行緒池中的可用執行緒數低於此設置的值,則工作程序使用此設置對所有傳入請求進行排隊。此設置有效地將可以同時執行的請求數限制為 maxWorkerThreads minFreeThreads。將 minFreeThreads 設置為 88 * # of CPUs。這將並發請求的數量限制為 12(假設 maxWorkerThreads 為 100)。

編輯:

在這篇SO 文章中,Thomas 提供了集成管道中請求處理的更多細節和範例。請務必閱讀答案的評論以獲取更多解釋。

本機回調(在 webengine.dll 中)在 CLR 工作執行緒上獲取請求,我們將maxConcurrentRequestsPerCPU * CPUCount與總活動請求進行比較。如果我們超過了限制,請求被插入到全域隊列中(本機程式碼)。否則,它將被執行。如果它已排隊,它將在其中一個活動請求完成時出列。

引用自:https://stackoverflow.com/questions/10929922