【问题标题】:ASP.NET monitoring page_load performance (without code change)ASP.NET 监控 page_load 性能(无需更改代码)
【发布时间】:2011-12-16 17:04:37
【问题描述】:

我正在寻找一种方法来监视系统中每个页面的 page_load,以计算出请求和数据发送回用户结束之间的时间。

我希望 100% 在服务器端执行此操作,并且我不想对应用程序代码进行任何代码更改。如果需要更改应用程序代码,是否有一个标准的地方来做这些?我正在考虑某种 web.config 类型参数,它将信息记录到位置/数据库。我们可以做处理部分,只需要某种方式的原始数据。

我希望收集的信息是:

  1. 页面名称(包括查询字符串)
  2. 请求的日期时间
  3. 花费的时间
  4. 我们可以获得的有关请求的任何其他信息!

显然,前提是它不应该影响性能。

我也在寻找低成本的东西,或者我们可以用来开发我们的系统的方法。

其他信息: 更清楚地说,我们完全控制了 IIS 和底层操作系统,但是,网站应用程序不在我们的控制范围内。我们可以更改配置文件,但不能更改应用程序的实际代码。

我们目前正在使用 IIS 6.0,但是,如果使用 IIS 7.0/7.5 更高效,和/或开箱即用,那么它可能会加快迁移速度,很高兴听到这些建议。

【问题讨论】:

  • 您运行的是什么版本的 IIS? IIS 7 对此具有内置功能。
  • 目前为 6.0,但我们正在考虑在某个时候升级到 7.5,因此信息 7 功能会很有用(尽管不考虑这个问题的答案,抱歉)。
  • @JohnSaunders 您能指出 IIS7 中页面统计信息的位置吗?我找不到任何这样的东西(在 IIS 7.5、Windows Server 2008 R2 中)
  • 我知道此类数据可用于失败的请求跟踪。我相信您可以定义什么构成“失败”,以便您可以获得所有请求的此信息。当然还有更多可能。

标签: asp.net performance monitoring


【解决方案1】:

这不是 WebForms 问题,而是 ASP.net 问题。使用global.asaxIHttpModule 挂钩到BeginRequest/EndRequest 事件来跟踪请求需要多长时间。

StopWatchModule.cs

class StopWatchModule: IHttpModule
{
    private Int64 _requestStartTicks; 

    public void Init(HttpApplication application)
    {
         application.Context.BeginRequest += Application_BeginRequest;
         application.Context.EndRequest += Application_EndRequest;
    }

    private void Application_BeginRequest(object sender, EventArgs e)
    {
        _requestStartTicks = Stopwatch.GetTimestamp();
    }

    private void Application_EndRequest(object sender, EventArgs e)
    {
        Int64 requestStopTicks = Stopwatch.GetTimestamp();

        Double requestDurationMs = (Double)(requestStopTicks - _requestStartTicks) / Stopwatch.Frequency / 1000000f; 
        /* 
           Sample output:
           Request for "~/EditCustomer.aspx" took 37 ms to complete
        */
        HttpContext context = ((HttpApplication)sender).Context;
        Logger.Info("Request for \"{0}\" to {1} ms to complete", 
              context.Request.AppRelativeCurrentExecutionFilePath, 
              requestDurationMs.ToString("r", CultureInfo.InvariantCulture));
    }
}

Web.config

<configuration>
    <system.web>
        <httpModules>
            <add name="StopWatchModule" type="StopWatchModule" />
        </httpModules>
    </system.web>
</configuration>

我是凭记忆写的,所以上面可能有错误,但就是这样。您的日志消息可以尽可能详细。 Logger 是某种类型的日志库。我更喜欢 log4net,但选择权在你。

【讨论】:

  • 性能与此相关,是否与请求本身不符?这会影响正在发生的实际请求吗?另外,上下文的生命是什么,它是单页吗?我假设我也应该能够获取会话信息?
  • 我将其标记为答案,因为这是我们决定采用的方式,尽管我没有得到作者的回复。
  • 这与请求本身是内联的,您可以访问整个上下文。请求、响应、会话等有关它如何适合您的应用程序结构的更多信息,请研究 asp.net 管道。这是 .net 中所有 http 开发的核​​心。 webforms、mvc 等都建立在 asp.net 管道之上。
【解决方案2】:

你能触摸 global.asax 吗?您可以在收到、完成、失败等请求时覆盖那里的应用程序事件。

根据您的需要,您还可以尝试解析 IIS 日志,因为您可以向其中添加一些性能指标。

【讨论】:

  • 如果应用程序代码不需要重新编译,那么是的,您可以提供任何链接以及如何完成此操作?
【解决方案3】:

您始终可以在 web.config 中启用跟踪,使用选项 pageOutput = "false"。

然后您可以转到 trace.axd 查看特定请求的信息。

您也可以通过在 @page 指令中设置特定页面来执行此操作。

【讨论】:

    【解决方案4】:

    我正在寻找的是某种方法来监控每个页面的加载 系统中的页面来计算请求和请求之间的时间 发送回给用户的数据的结尾是。

    我想知道 IIS 日志的 time-taken 字段是否有任何用途,因为它会为您提供时间、IP、字节(发送/接收)等。

    更多信息请参见fields

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      相关资源
      最近更新 更多