一、IIS:應用程序池隊列(Application pool queue,位于HTTP.SYS)
這是請求到達IIS后遇到的第一個隊列,http.sys收到請求后會將請求放入對應的應用程序池隊列,這樣可以減少上下文的切換。需要注意的是應用程序池隊列雖然是給w3wp進程用的,但它存在于http.sys的內存區(http.sys是一個運行于kernel-mode的設備驅動程序)。如果把http.sys比作一塊網卡,那應用程序池隊列相當于網卡的緩沖區。
1)設置方法:在IIS應用程池設置中設置Queue Length的值(缺省值是1000)。
2)監測方法:Windows性能監視器中監測Http Service Request Queues\ArriveRate。
3)出隊方法:工作者進程(w3wp,user-mode)通過完成端口(completion port)從應用程序池隊列中取出請求進行處理(user-mode與kernel-mode之間的通信),需要注意的是這里進行了IO操作。
二、ASP.NET:CLR線程池隊列(CLR threadpool queue)
w3wp從應用程序池隊列中取出請求后,接下來就是從CLR線程池中撈出一個CLR線程處理請求,如果池中空無一線,就會將請求放在CLR線程池隊列中。
1)設置方法:在machine.config中設置processModel/requestQueueLimit(默認是1000),或者Aspnet.config中設置applicationPool。
<processModel enable="true" requestQueueLimit="2000" >
2)監測方法:Windows性能監視器中監測ASP.NET v4.0.30319\Requests Queued。
【參考資料】
Understanding IIS 7.0 Architecture : IIS 7.0 Core Components
Everything you ever wanted to know about ASP.NET request queueing
文章列表