• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    監視服務器進程

    發布: 2007-6-11 12:42 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 73次 | 進入軟件測試論壇討論

    領測軟件測試網

    2003 年 11 月

    適用于:
        Microsoft® ASP.NET

    摘要:學習如何創建 ASP.NET HTTP 處理程序,以查看 Web 站點使用的進程的運行狀況和關閉狀況。另外,還將學習如何創建配置節處理程序(本文包含一些指向英文站點的鏈接)。

    下載 ProcessHandlerCS.msi 的 Visual C# 版本。

    下載 VBSample.msi">ProcessHandlerVBSample.msi 的 Visual Basic 版本。(請注意,在示例文件中,程序員的注釋使用的是英文,本文中將其譯為中文是為了便于讀者理解。)

    目錄

    簡介
    我們將看到什么?
    創建進程查看處理程序
    實現 IHttpHandler
    安裝 HTTP 處理程序
    添加配置
    小結

    產品簡介

    您看到過出色的咖啡店店員送咖啡的情景嗎?那簡直就是咖啡豆、蒸汽和牛奶調和咖啡飲料在跳精彩的芭蕾,跳躍著奔向焦急等候的顧客。然而,即便是最好的店員偶爾也會出現問題。比如兩個單子在處理時搞混了,結果送到您面前的是一杯 Soy latte。也可能是杯子上龍飛鳳舞的潦草字跡根本就是寫錯了,或者店員理解錯了。有人要了一杯“卞高奇若”(卡普其諾),可憐的店員絞盡腦汁也弄不懂顧客到底要點什么。如果出現了類似的問題,就必須停止處理,然后再重新開始。好的服務員可能會推延一下現有的要求,而優秀的服務員卻能夠在沒人察覺的情況下做到這一點。

    Microsoft® ASP.NET 在系統可靠性方面取得了優于其任何競爭對手的巨大進步。然而,就像那位出色的店員一樣,ASP.NET 偶爾也會出現問題。幸運的是,ASP.NET 是非常優秀的服務器。它能在后臺迅速生成新的進程,然后處理請求。通常只會在請求頁面時發生一點用戶甚至可能都不會注意到的輕微延遲。

    而 ASP.NET 系統的管理員可能需要知道發生了什么。同樣,他們也想了解是什么原因導致了進程失敗。幸運的是,使用 .NET Framework 類庫文檔中的 lrfSystemWebProcessInfoClassTopic.asp">ProcessInfo 和 ProcessModelInfo 類便可獲得相關信息。本文中,我們將學習如何創建 ASP.NET HTTP 處理程序,以使用這些對象查看 Web 站點使用的進程的運行狀況和關閉狀況。另外,我們將創建一個配置節處理程序,這樣我們便能夠在安裝處理程序后對其進行配置。

    我們將看到什么?

    ASP.NET 進程負責編譯和管理所有向 ASP.NET 頁面提出的請求。理想狀況下,此進程應該始終存在于服務器中:活躍地接收請求、編譯頁面并返回 HTML。然而,由于存在許多可能影響進程的潛在事件,我們不得不面對 Web 開發的真實狀況。開發人員可能未能正確處理內存泄漏或線程問題;服務器可能會丟失與進程的連接;或者甚至會因為在 Web.config 文件的 <processModel> Element 節中對 idleTimeout、requestLimit、memoryLimit 和類似的項目進行了錯誤的配置而導致出現問題。如果發生了以上任何一種事件,則將創建新的 ASP.NET 輔助進程,新的請求將移交至此進程進行處理。

    由于 ASP.NET 進程對頁面處理如此重要,因此監視這些進程同樣重要。使用 ProcessInfoProcessModelInfo 類可以查看當前和以前進程的有效期和運行狀況。圖 1 所示為在本文中創建的進程列表。

    圖 1:Web 服務器的進程歷史記錄

    ProcessInfo class 存儲了給定進程的數據。不得自行創建 ProcessInfo 類,但可以使用 ProcessModelInfo class 來檢索 ProcessInfo 對象。表 1 所示為 ProcessInfo 類的重要屬性。

    表 1:ProcessInfo 類的屬性

    屬性 數據類型 說明
    Age TimeSpan 進程運行(或曾經運行)的總時間。如果這個值超出了在 Web.Config 文件的 processModel 節中的超時設置,可導致重新啟動進程。
    PeakMemoryUsed Integer 此進程所用內存的最大值(以 MB 為單位)。如果這個值超出了在 Web.Config 文件的 processModel 節設置的 memoryLimit 級別設置,可導致進程重新啟動。
    ProcessID Integer 操作系統使用此 ID 來標識進程。每個進程均有唯一的 ID(在進程運行時)。
    RequestCount Integer 進程接收到的頁面請求的數量。如果這個值超出了在 Web.Config 文件的 processModel 中 requestLimit 的級別設置,可導致進程重新啟動。
    ShutdownReason ProcessShutdownReason 此枚舉定義進程重新啟動的可能原因。有關可能的值,請參閱表 2。
    StartTime DateTime 進程啟動的時間。
    Status ProcessStatus 此枚舉定義 ASP.NET 輔助進程的當前狀態。此值可能為 Alive(活動)、ShuttingDown(進程已接收到關閉請求)、ShutDown(進程已正常關閉)或 Terminated(進程已被迫關閉)。

    某進程關閉后,關閉原因將被設置為 ProcessShutdownReason Enumeration 中的某一個值。

    表 2:進程關閉的可能原因

    說明
    None 此值表明進程仍在運行。
    Timeout 進程因其生存期超出了在 Web.Config 文件的 processModel 節中設置的超時值而重啟。如果這種情況頻繁發生,也許應考慮增加超時值。不過,一般來說因這種原因而重新啟動可以接受。
    IdleTimeout 進程重新啟動的原因是缺少客戶端。如果在 Web.Config 文件的 processModel 節中的 idleTimeout 值所設置的時間期限內沒有客戶端請求,將發生此類重新啟動。這通常也是可以接受的重新啟動的原因。
    RequestsLimit 進程重新啟動的原因是接收到的請求數量超過了在 Web.Config 文件的 processModel 節中設置的值 (requestLimit)。一般來說,這種重新啟動的原因也可以接受,主要用于您希望進程偶爾重新啟動的情況。
    MemoryLimitExceeded 進程重新啟動的原因是因為超出了通過 Web.Config 文件中的 memoryLimit 值設置的內存限制。這通常表示進程的某個 ASP.NET 應用程序部分發生了問題(可能是內存泄漏)。如果此類現象頻繁發生,請監視每個 Web 應用程序的內存使用是否正常。
    RequestQueueLimit 進程重新啟動的原因是在等候響應的請求總數超出了 Web.Config 文件的 requestQueueLimit 值。通常這是某些情況將導致 Web 服務器延遲的信號?赡苄枰黾觾却婊蚍⻊掌,或提高驅動器或處理器的速度。
    DeadlockSuspected 進程重新啟動的原因是可能停止了正在處理的請求。正如這個關閉原因的名稱那樣,最可能導致這種情況的原因為:如果兩個或多個線程需要另一個線程完成后才能繼續進行(例如 A 線程需要 B 線程完成向某文件的寫入后才能繼續進行,而同時 B 線程需要 A 線程完成計算后才能繼續進行),我們將這種情況稱為線程處于“Deadlock”(死鎖)狀態。如果有這種可能,進程將因此而關閉。一般來說,您肯定不希望看到這種關閉原因,如果您不幸看到了,請查看在應用程序中使用的所有線程處理或資源使用情況。
    PingFailed 當 ASP.NET 輔助進程管理頁面時,有時會收到從 IIS 進程發來的 ping 以確定是否仍需要此進程。如果 ping 失敗,則 IIS 進程可能會關閉該 ASP.NET 進程。這個關閉原因說明了可能在服務器接收消息的過程中確實存在通信問題或 ASP.NET 輔助進程因某種原因而停止工作。
    Unexpected 一般來說,您肯定不想看到此消息,因為它表明是“某種其他原因”終止了 ASP.NET 輔助進程。除了監視每個進程或對所有運行中的代碼執行代碼校對,幾乎沒有任何辦法解決此問題。

    創建進程查看處理程序

    在 ASP.NET 中,主要使用兩種方法來創建 HTTP 處理程序。第一種是通過創建帶有 ASHX 擴展名的文件,另一種是創建實現 System.Web.IHttpHandler 的類,請參閱 IHttpHandler Interface。本文將著重介紹第二種形式。要創建 HTTP 處理程序,需要創建一個程序集(通常是一個代碼庫項目)和一個實現 System.Web.IHttpHandler 的類。然后將該類注冊到 Web.Config(或 machine.config)文件中,然后它就可以接收請求了。如果查看 machine.config 文件(在相應命名的 httpHandlers 節中),將看到許多當前已注冊的 HTTP 處理程序,包括 System.Web.UI.PageHandlerFactory(ASP.NET 頁面的主處理程序)。在編寫 HTTP 處理程序時,其實就是在定義處理請求的新方法。

    所有 HTTP 處理程序均通過實現 System.Web.IHttpHandler Interface 來創建。此接口需要創建一個屬性和一個方法,如表 3 所示。

    表 3:IHttpHandler 接口的成員

    成員 類型 說明
    IsReusable 屬性 (Boolean) 確定該處理程序的實例是否可以重復使用。通常,該屬性應返回 true,除非處理程序需要對某個資源的獨占訪問。
    ProcessRequest 方法 HTTP 處理程序的“主”方法。將在此添加對請求的所有處理。該類傳遞當前 ASP.NET 上下文?梢詮拇松舷挛闹袡z索請求對象和響應對象。

    實現 IHttpHandler

    創建 HTTP 處理程序的大量工作集中在實現處理程序的 ProcessRequest。通常,需要存儲當前上下文的請求和響應對象,然后使用響應對象的編寫方法創建輸出。以下給出了用于進程查看處理程序的 ProcessRequest 資源的 Microsoft Visual Basic® .NET 源。

        Public Sub ProcessRequest(ByVal context As HttpContext) _
           Implements IHttpHandler.ProcessRequest
            _context = context
            _writer = New HtmlTextWriter(context.Response.Output)
    
            'we only want to do this if we're enabled
            If _config.Enabled Then
                _writer.WriteLine("<html>")
                _writer.WriteLine("<head>")
                _writer.WriteLine(Me.StyleSheet)
                _writer.WriteLine("</head>")
    
                _writer.WriteLine("<body>")
                _writer.WriteLine("<span class=""content"">")
    
                'write content here
                'create table
                Dim t As New Table()
                With t
                    .Width = Unit.Percentage(100)
                    .CellPadding = 0
                    .CellSpacing = 0
                End With
    
                'the meat of the routine
                'make certain this is a destination machine
                If (PermittedHost(_context.Request.UserHostAddress)) Then
                    CreateHeader(t)
                    AddProcesses(t)
                    CreateFooter(t)
                Else
                    CreateErrorReport(t)
                End If
    
                'write to the stream
                t.RenderControl(_writer)
    
                _writer.WriteLine("</span>\r\n</body>\r\n</html>")
            End If
        End Sub
    

    ProcessRequest 的實現會存儲當前上下文和編寫者。然后,它通過呈現頁面的起始 HTML 標簽將新的 HTML 頁面創建為輸出。下一步,它將創建一個用于格式化輸出的表格。最后,如果啟用了處理程序,并且發出請求的客戶端是合法的 IP 地址之一,則通過以下三種方法創建輸出: CreateHeader、AddProcessesCreateFooter。這些方法將相應的值呈現在表格的單元格中。這些代碼有很大一部分是重復的,為了簡短起見,以下僅給出了 AddProcesses 及其相關的方法。

        Private Sub AddProcesses(ByVal table As _
                System.Web.UI.WebControls.Table)
            Dim procs As ProcessInfo() = _
                ProcessModelInfo.GetHistory(_config.RequestLimit)
            Dim row As TableRow
    
            _list = New ProcessInfoCollection
            For Each proc As ProcessInfo In procs
                row = AddRow(table)
                _list.Add(proc)
                AddCell(row, proc.ProcessID.ToString())
                AddCell(row, proc.Status.ToString())
                AddCell(row, proc.StartTime.ToString("g"))
                AddCell(row, FormatAge(proc.Age))
                AddCell(row, proc.PeakMemoryUsed.ToString("N0") + " MB")
                AddCell(row, proc.RequestCount.ToString("N0"))
                AddCell(row, proc.ShutdownReason.ToString())
            Next
        End Sub
        Private Function AddCell( _
             ByVal row As System.Web.UI.WebControls.TableRow, _
             ByVal text As String) As System.Web.UI.WebControls.TableCell
            Dim c As New TableCell()
            c.Text = text
            row.Cells.Add©
            Return c
        End Function
    

    細心的(和有技術背景的)讀者可能已經注意到,我完全可以通過呈現 DataGrid 并將 ProcessInfoCollection 綁定到 DataGrid 來簡化此代碼,但那樣就失去了編寫程序的樂趣。

    安裝 HTTP 處理程序

    創建完 HTTP 處理程序后,必須進行安裝才能使用。這包括使類可用,并在配置文件中添加相應的信息以激活處理程序。

    如果創建的是僅被單個 vroot 使用的簡單處理程序,則可以將 DLL 復制至該 vroot 的 bin 目錄即可使用該類。如果創建了一個由多個 vroot 使用的 HTTP 處理程序(類似于 ProcessHandler),則此處理程序必須安裝到全局程序集緩存 (GAC) 中。要將此處理程序安裝到 GAC 中,類必須具有嚴格名稱。要具有嚴格名稱,它必須有關聯的嚴格名稱鍵。必須使用命令行可執行文件 sn.exe 創建嚴格名稱鍵文件。有關此程序的詳細信息,請參閱 NET Framework Tools 文檔的 Strong Name Tool (Sn.exe) 一節。

    處理程序可用后,下一步就是添加配置以使其可以處理請求,方法是在 Web.Config 或 machine.config 文件的 httpHandlers 節中添加條目。此條目指定了將通過處理程序路由的文件擴展名和操作。進程查看處理程序的條目如下所示。

    <add verb="*" path="process.axd"
     type="Microsoft.Samples.Msdn.Web.ProcessHandler,
        MsdnProcessHandler, Version=1.0.0.0, Culture=neutral,
        PublicKeyToken=f5f94c20bb90ce64" />
    

    此條目意味著在某個請求使用任何 HTTP 命令尋找“文件” process.axd(實際上不存在)時,它將向位于程序集 MsdnProcessHandler 中的 Microsoft.Samples.Msdn.Web.ProcessHandler 類發送請求。該類將實現 IHttpHandler,然后由 IHttpHandler 負責生成輸出。

    添加配置

    許多 ASP.NET 應用程序使用 appSetting 標簽添加自定義配置。這對于大多數應用程序來說已經完全足夠了。然而,有時應用程序可以使用更有針對性的解決方案。這種情況下,您可以為應用程序新建節。

    新建配置節包括兩個步驟。首先,必須創建配置對象。此對象或結構具有表示所需配置數據的屬性。此對象可以具有、但通常不具有任何方法。其次要創建一個節處理程序。此節處理程序負責從 web.congfig 文件中讀取相應的信息,并且將其轉化為配置對象。

    ProcessViewer 的配置對象具有四個屬性,如下表所述。

    表 4:ProcessViewer 配置對象的屬性

    屬性 數據類型 說明
    Enabled Boolean 如果 ProcessViewer 可用,則為 true。這樣便可以暫時關閉處理程序而無需將其從 web.config 文件中刪除。
    LocalOnly Boolean 如果只能從本地計算機查看 ProcessViewer 的輸出,則為 true。這是最為安全的方案,防止其他人查看 Web 應用程序的進程歷史記錄。
    RequestLimit Integer 該屬性限定了顯示項目數的最大值。ProcessModelInfo.GetHistory 最多返回 100 個項目。此屬性用于在需要時減少此數量。
    PermittedHosts String array 如果 LocalOnly 為 false,則任何計算機均可以訪問 Process.axd handler 來查看應用程序的進程歷史記錄。這就可能會有安全風險。因此,可以分配允許訪問處理程序的 IP 地址的列表。此屬性可用于限制對管理員工作站的訪問。

    創建自定義配置的第二步是創建解釋配置文件的 XML 的類,并使用該信息填充配置對象。此類必須實現 System.Configuration.IConfigurationSectionHandler 接口。此接口只有一個方法,稱為 Create。以下給出了 ProcessViewerSectionHandler 的 Visual Basic .NET 源(請參閱 C# 源的下載)。

        Public Function Create(ByVal parent As Object, _
          ByVal configContext As Object, _
          ByVal section As System.Xml.XmlNode) As Object _
            Implements Configuration.IConfigurationSectionHandler.Create
            ' 節具有以下格式:
            '<processView 
            '   localOnly="true|false" 
            '   requestLimit="<=100" 
            '   enabled="true|false" 
            '   permittedHosts="comma-delimited list of IP addresses" />
            Dim result New ProcessViewerConfiguration()
            Dim config As New ConfigurationHelper(section)
    
            Dim max As Integer
            Dim hosts As String
            Const delimiter As String = ", "
            Const MaximumReturnCount As Integer = 100
            '確認設置,并設定
            result.Enabled = config.GetBooleanAttribute("enabled")
            result.LocalOnly = config.GetBooleanAttribute("localOnly")
    
            max = config.GetIntegerAttribute("requestLimit")
            If max <= MaximumReturnCount Then
                result.requestLimit = max
            End If
    
            hosts = config.GetStringAttribute("permittedHosts")
            result.PermittedHosts = hosts.Split(delimiter.ToCharArray())
            Return result
        End Function
    

    Create 方法傳遞了三個對象:

    • parent - 表示父配置節(如果可用)。
    • configContext - 表示 HttpConfigurationContext 對象,即 Web 配置的剩余部分?梢允褂么藢ο髲漠斍 web.config 文件中檢索值。
    • section - 最為重要的參數,實際的配置節。使用此對象填充配置對象。

    以上代碼使用了 ConfigurationHelper 對象。此對象是一個用于從節中檢索特定數據類型的簡單對象。此類的代碼如下所示。

    Friend Class ConfigurationHelper
        Dim _section As XmlNode
        Public Sub New(ByVal configSection As XmlNode)
            _section = configSection
        End Sub
        '接受 true/false、yes/no
        Public Function GetBooleanAttribute(ByVal name As String) As Boolean
            Dim value As String
            Dim result As Boolean
    
            value = GetStringAttribute(name).ToLower()
            If ((Boolean.TrueString.ToLower() = value) _
              OrElse (value = "yes")) Then
                result = True
            Else
                result = False
            End If
    
            Return result
        End Function
    
        Public Function GetIntegerAttribute(ByVal name As String) As Integer
            Dim value As String
            Dim result As Integer
    
            value = GetStringAttribute(name)
            result = Int32.Parse(value)
    
            Return result
        End Function
    
        Public Function GetStringAttribute(ByVal name As String) As String
            Dim theAttribute As XmlAttribute
            Dim result As String
    
            theAttribute = _section.Attributes(name)
            If Not theAttribute Is Nothing Then
                result = theAttribute.Value
            End If
            Return result
        End Function
    
    End Class
    

    要使用這個節處理程序和配置對象,必須將其注冊在相應的 ASP.NET 配置文件中。因為可以在任何進程中調用該類,所以最好將其添加到 machine.config 文件中。在 machine.config 類的 configSection 節中的相應位置注冊節處理程序(我將其添加到了 system.web 節中)

        <sectionGroup name="system.web">
          ... other sections
          <section name="processView" 
              type="Microsoft.Samples.Msdn.Web.ProcessViewerSectionHandler, 
                   MsdnProcessHandler, Version=1.0.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=f5f94c20bb90ce64" />
         </sectionGroup>
    

    注冊完畢后,便可以向 machine.config 文件中添加節,并且該類將成為可配置類。

    小結

    創建 HTTP 處理程序可以提供超出 ASP.NET. 功能的強有力機制,使得開發者避開頁面模型,并創建、修改或擴展 Web 站點的內容。通過添加用于查看 ASP.NET 的進程歷史記錄的 HTTP 處理程序,可以診斷代碼或服務器中導致客戶投訴的問題,例如代碼中存在內存泄漏或未處理的異常,或服務器的內存不足。

    創建并安裝 HTTP 處理程序后,您將可以更敏銳地發現在此重要進程中發生的狀況。到時候您就會有時間來喝杯咖啡,而不是忙于追查 Web 站點進程重新啟動的原因了。

    資源

     

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: 服務器 監視 進程


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>