簡體   English   中英

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

[英]ASP.NET IIS - when are requests queued?

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可以同時處理的最大請求數。 這包括排隊的請求和正在執行的請求。 如果“請求當前”性能計數器超過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 Worker線程
3.如果請求具有高延遲並且所有線程都被占用(線程計數接近httpRuntime.minFreeThreads),則請求將發布到應用程序級別請求隊列(此隊列是每個AppDomain)
4. ASP.NET還會在接受新請求之前檢查排隊和當前正在執行的請求數。 如果此數字大於processModel.requestQueueLimit指定的值,則將拒絕傳入的請求,並顯示503服務器忙碌錯誤。

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

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

編輯:

在這篇SO帖子中 ,Thomas在集成管道中提供了更多詳細信息和請求處理示例。 請務必閱讀有關答案的評論,以獲得更多解釋。

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

暫無
暫無

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

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