通过asp.net网页进行Web服务器监控

时间:2012-07-03 19:06:04

标签: asp.net system monitoring

我想在网页上监控以下内容:

  • 总响应时间
  • 总字节数
  • 吞吐量(请求/秒)
  • 使用了RAM
  • 硬盘空间和IO问题
  • 服务器CPU开销
  • 错误(错误代码)
  • MSSQL加载
  • IIS错误

我托管了一个用于网络托管的小型服务器群集。我需要在ASP.NET中创建一个硬件视图,以尽可能接近实时快照。

我听说过Spiceworks或其他方法来完成这项任务。我同意这些都是很棒的工具,但我想对此进行编码并保持简单。

以下是我提出/找到的一些现有代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string[] logicalDrives = System.Environment.GetLogicalDrives();
            //do stuff to put it in the view.
        }
        protected static string ToSizeString(double bytes)
        {
            var culture = CultureInfo.CurrentUICulture;
            const string format = "#,0.0";

            if (bytes < 1024)
                return bytes.ToString("#,0", culture);
            bytes /= 1024;
            if (bytes < 1024)
                return bytes.ToString(format, culture) + " KB";
            bytes /= 1024;
            if (bytes < 1024)
                return bytes.ToString(format, culture) + " MB";
            bytes /= 1024;
            if (bytes < 1024)
                return bytes.ToString(format, culture) + " GB";
            bytes /= 1024;
            return bytes.ToString(format, culture) + " TB";
        }
        public static string ToApproximateString(this TimeSpan time)
        {
            if (time.TotalDays > 14)
                return ((int)(time.TotalDays / 7)).ToString("#,0.0") + " weeks";
            if (14 - time.TotalDays < .75)
                return "two weeks";
            if (time.TotalDays > 1)
                return time.TotalDays.ToString("#,0.0") + " days";
            else if (time.TotalHours > 1)
                return time.TotalHours.ToString("#,0.0") + " hours";
            else if (time.TotalMinutes > 1)
                return time.TotalMinutes.ToString("#,0.0") + " minutes";
            else
                return time.TotalSeconds.ToString("#,0.0") + " seconds";
        }
    }
} 

4 个答案:

答案 0 :(得分:1)

性能计数器通过System.Diagnostics.PerformanceCounter类公开。 Here是ASP.NET的一些性能计数器。另外,how-to

答案 1 :(得分:1)

与@Sumo所说的类似,您需要使用System.Diagnostics命名空间中的Windows性能计数器(PC)。

您的问题的部分问题在于,从PC的角度来看,您对要测量的内容有点模糊。个人电脑非常具体而且非常狭窄;他们衡量一个非常详细的指标。您必须将您的要求转换为您想要的特定Windows PC。

你说你想测量:

  • 总响应时间
  • 总字节数
  • 吞吐量(reqs / sec)
  • Ram使用
  • 硬盘空间
  • IO问题
  • 服务器CPU开销
  • 错误(错误代码)
  • MSSQL加载

您还应该参考http://technet.microsoft.com/en-us/library/cc776490(WS.10).aspx上的Windows Technet参考(它是W2K3,但它仍然适用于W2K8 / R2)。这将为您提供所需的所有性能计数器的概述和解释。

向下跑:

  • 总响应时间

据我所知,没有ASP.NET PC列出这个。而且,无论如何,它可能对您没有意义,因为ASP.NET也会响应各种各样的请求,您可能不关心它需要多长时间(即以.axd结尾的任何内容)。我在我的项目中做的是创建一个自定义PC,但还有其他技术可用(比如使用自定义跟踪监听器)。

  • 总字节数
  • 吞吐量(reqs / sec)

我相信这两款都有PC,不过我认为总字节数可能列在 Web服务类别下,而吞吐量可能是ASP.NET类别。

  • 使用了RAM

内存类别,但您需要决定是否正在寻找工作集大小,使用的物理RAM等。

  • 硬盘可用空间

检查 LogicalDisk 类别

  • IO问题

这是什么意思?再次,查看可用的PC以查看最相关的内容。

  • 服务器CPU开销

您可以在处理器类别

下找到此信息
  • 错误(错误代码)

您可以获取抛出的错误总数或抛出异常的速率,但是如果要收集EventLog中的条目,则需要使用EventLog中的System.Diagnostics类。 1}}名称空间。

  • MSSQL加载

我没有找到SQL Server PC的参考概述,但是Brent Ozar是一位专家,他有一份要查看的PC列表:http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/。对于SQL Server 2008 / R2,此列表可能没有太大变化。

备注

  • 您可能需要确保运行Web应用程序的应用程序池的标识已添加到名为Windows性能监视器用户的计算机用户组中。
  • 您只需打开计数器即可进行只读访问。
  • 性能计数器是组件,因此实现IDisposable。请确保.Dispose()他们(或者更好的是,使用using()语句)。
  • 使用.NextValue()方法获取您的值;几乎从不需要使用.RawValue.NextSample()

我没有给你每个计数器的确切名称,因为你真正理解每个计数器测量的内容以及它对你有多大是非常重要的,只有你能回答这个问题。实验

答案 2 :(得分:0)

我建议使用New Relic等分析服务。 .Net使用的页面位于New Relic for .Net

答案 3 :(得分:0)

New Relic非常适合这里。您想要的产品是New Relic APM。这提供了完整的端到端跟踪,并为应用程序使用的所有内容创建服务映射。如果您需要有关MySQL的更多信息,还可以添加mysql插件。