在你的服務器端代碼中使用線程和創建異步處理(3) - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 在你的服務器端代碼中使用線程和創建異步處理(3) (http://www.webasp.net/article/12/11658.htm) |
| -- 作者:未知 -- 發佈日期: 2004-07-05 |
| IIS 5.0 and 6.0 的線程分派
位於IIS5.0上的請求是典型的基於I/O線程的響應,或者是線程異步實現I/O,因為使用異步寫命名管道把這些請求分派給工作進程。當工作進程中響應一個請求時,它將會使用異步讀取的線程。位於工作進程中用來響應請求的線程來自於進程範圍的CLR線程池。儘管線程池的線程通過綁定I/O實施端口不正確是返回錯誤(IsThreadPoolThread of Thread),但是不要指望使用這個屬性。 儘管在IIS5.0響應請求的服務是基於I/O線程,但在重的負載下,一些請求將被終止為了正常的來自於池的工作線程,因此兩種線程會被同時激發。默認CLR線程池大小是25,分離了I/O線程和工作線程。有可以更改線程池的上限,如前所述。 情況發生了巨大的變化在IIS6上(2003)。首先,inetifo.exe不再用於響應Http的請求。作為取代的是,http請求置於內部方式隊列中,http.sys 用來分發每一個合適的應用隊列。另外,IIS6支持應用池,能夠共享單個的工作進程,現在的命名為w3pwp.exe。應用池在許多的不同的工作進程中給你選擇,依賴你對分離你的web應用的程度。 這個範例改變asp.net響應請求的處理方式。使用分發請求從inetinfo.exe到asp.net工作進程,http.sys直接在合適的進程中對每一個請求予以排隊。所有的請求現在有來自CLR線程池的工作進程來響應,再也不用I/O線程。於2003上的machine.config發現的描述,進程模式仍然初始化線程池的上限,然而另外所有的屬性都被忽略,它們現在存儲於IIS6的元數據上。 對異步的要求 許多因素影響著web應用的擴展性。通常,任何情況下,多個並發的操作請求去訪問共享資源,系統的擴展性就會受到損害,以上系統共享資源列表是CPU本身( 或位於多個處理箱的CPU集)。運行asp.net的服務器有其自己CPU,其共享依賴於線程池的方式的並發請求。這種線程池目的為了有效的分派CPU處理請求的時間,線程池的總數分派是有其上限的。這是一個重要的約束對於有的地方,正如當有大量並發請求時,創建沒有界定線程數量能夠很容易讓系統停止。 然而,如果位於線程池的線程被用來執行非CPU-intensive工作(比如對遠程數據一個請求或調用一個遠程的web服務),這就會影響線程池,不會有較高的CPU利用率。這中情形下,事實上線程池降低了系統的擴展性,這是因為請求會被延遲(或可能被拒絕)即使服務器並非在忙於處理其它請求。 例如一個沼澤線程池的例子,接下來的asp.net頁面,slow.aspx, 其人工的延遲服務響應時間兩秒並且打印出線程,正如: <!-- File: slow.aspx --> <%@ Page Language="C#" %> <%@ Import Namespace="System.Reflection" %> <%@ Import Namespace="System.Threading" %> <script runat="server"> protected void Page_Load(object src, EventArgs e) { System.Threading.Thread.Sleep(2000); Response.Output.Write("SlowResponse, threadid={0}", AppDomain.GetCurrentThreadId()); } </script> 另一個asp.net 頁面,fast.aspx, 相比slow.aspx來說,除了不休息兩秒是一樣的: <%@ Page Language="C#" %> <%@ Import Namespace="System.Reflection" %> <script runat="server"> protected void Page_Load(object src, EventArgs e) { Response.Output.Write("FastResponse, threadid={0}", AppDomain.GetCurrentThreadId()); } </script> 使用web應用壓力工具來檢測這兩個頁面,你可以發現在大量請求的情況下測試的平均響應時間. 最初的對於fast.aspx頁面的平均響應時間為0.0824秒, 在1分鐘的時間內響應52,190個請求.同時測試fast.aspx和slow.aspx, fast.aspx時間為4.47秒,slow.aspx為6.54秒, 請求次數的總數量在1分鐘減少到1062次. |
| webasp.net |