[英]ASP.NET IIS - when are requests queued?
Thomas Marquardt撰寫的以下文章描述了IIS如何處理ASP.Net請求,可配置為運行的最大/最小CLR工作線程/托管IO線程,涉及的各種請求隊列及其默認大小。
現在根據文章,IIS 6.0中發生以下情況:
我想知道什么是“閾值”,此時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.