2011-02-05 33 views
9

我將log4net添加到我的應用程序中,現在可以在用戶瀏覽我的網站時看到用戶活動的線索ID。是否有任何特定的算法來分配IIS7的線程分配情況,還是隻是一個隨機數字分配(我懷疑它不是完全隨機的,因爲我的低流量站點顯示的線程大部分在10-30範圍內)?任何最大數量的線程可用?而且我注意到我的調度程序顯示了一個奇怪的線程ID - 這是什麼原因?調度器是Quartz.net,id顯示爲「Scheduler_Worker-10」,而不僅僅是一個數字。如何分配IIS7線程?

+0

我會假設它至少有1個線程分配給每個連接,然後可能是應用程序的幾個主線程(接受連接,管理全局應用程序狀態等)。我不會將此作爲答案發布,因爲這只是一個猜測。 – IDWMaster 2011-02-05 22:46:16

回答

8

This解釋所有你需要知道的。

的摘錄:

當ASP.NET在IIS 7.0中 集成模式託管,使用線程是 有點不同。首先, 應用程序級隊列不再。 他們的表現總是很差 不好,沒有希望修復這個,所以我們擺脫了他們。但也許 最大的區別是,在IIS 6.0 或ISAPI模式,ASP.NET限制的線程數併發 執行的請求,但在IIS 7.0 集成模式,ASP.NET限制 號同時執行 請求。當請求異步時,差別僅僅是 (該請求要麼具有 異步處理程序,要麼 中的模塊異步地完成 )。顯然,如果 多個請求是同步的,那麼 號同時執行 請求相同的 線程同時執行 請求數,但如果請求是 異步那麼這兩個數字 可以像你可以很不同 比線程有更多的reqeusts。

所以基本上,如果請求是同步的,每個請求的線程數相同。看到這裏各種parameters

4

我已經解釋了這是一個博客張貼在我的博客 ASP.NET Performance-Instantiating Business Layers

標題不會與你的問題相符,但我解釋一下IIS處理請求的方式,我相信你有你的答案。

從文章引述

當IIS字段進行 應用程序的請求遞給它交給 工作進程。 轉的工作進程會創建您的 全局類(其類型爲 HttpApplication)的實例。從 的這一點開始,發生ASP.NET 應用程序的典型流程(ASP.NET 管道)。但是,你所需要的 認識和了解的是,工人 過程(認爲它作爲IIS真的) 保持的情況下你 的HttpApplication(您 全球類的實例)活着,爲了領域的其他 請求。事實上,它在默認情況下 它會創建並緩存到您的全球級的10種 情況下,如果根據負載 要求(延遲實例) 您的網站收到其他 因素 請求數。在上面的圖1中,您的ASP.NET應用程序 的 實例顯示爲紅色框。有 可能會被這些緩存的工作進程中的10個緩存到 。這些實際上是 線程,其工作進程已創建並緩存了 ,並且每個線程都擁有自己的Global類的實例 。 請注意,這些線程中的每一個都在 之間的同一個App域中。因此,您在 應用程序中可能具有的任何靜態 類都將在這些線程或應用程序的 實例中的每一個上共享。

我建議你閱讀那篇文章,我很樂意回答你可能有的任何問題。請注意,我故意保持文章的簡單性,因爲我不會談論內核中發生的事情,或者討論參與的各種組件的細節。保持簡單可以幫助人們更好地理解這些概念(我感覺)。

我來回答你的一些其他問題在這裏:

  1. 是否有任何具體的算法來分配線程與IIS7是如何發生的?

不,對於所有意圖而言,它的目的都是隨機的。這在我指出的文章中有解釋。簡短的回答是,如果緩存的線程可用,則II將使用它。如果沒有,它會創建一個新的線程,創建你的HttpApplication(Global)的實例併爲其分配所有的上下文。所以在一個不太忙的站點上,你可能會看到相同的線程處理請求。但是沒有保證。如果有多個空閒線程,IIS將隨機選擇一個線程來處理該請求。您應該在這裏注意,即使在不太繁忙的站點中,如果您的請求需要很長時間,IIS也將被迫創建新線程來處理其他傳入請求。

  1. 任何最大數量的線程可用?

是的(正如本文所述)每個工作者進程通常有10個線程。這可以調整,但我已經在一些非常繁忙的網站上工作,我從來沒有。關鍵是要儘可能快地響應你的應用程序。請注意,應用程序可以爲其分配多個工作進程(在應用程序池中進行配置),因此在繁忙的站點中,實際上需要爲應用程序提供多個工作進程,但意味着您擁有所需的硬件(CPU核心和內存)。

  1. 調度是Quartz.net和ID顯示爲 「Scheduler_Worker-10」,並不僅僅是一個數字

線程可以有名字的,而不是IDS。如果線程已被分配一個名稱,那麼你會看到,而不是一個ID。當然,對於IIS創建的線程,你沒有這種控制。請注意,我沒有使用(也不知道Quartz),所以我不知道這一點,但我猜是這樣。