【问题标题】:How can I profile an ASP.NET application running on a production server?如何分析在生产服务器上运行的 ASP.NET 应用程序?
【发布时间】:2011-04-28 01:44:54
【问题描述】:

我有一个 ASP.NET 应用程序,它始终使用生产服务器上 75% - 100% 的 CPU。如何分析应用程序以找出代码的哪一部分占用了最多的 CPU?我查看了几个不同的工具(Xte Profiler、EQATEC、dotTrace),但他们似乎都希望您在他们的工具中加载和运行应用程序。在我看来,他们希望您在他们的工具中加载应用程序并在本地(而不是在生产中)运行测试。我想在应用程序在生产中运行时对其进行分析,让人们点击它以查看实际情况。这可能吗?

我是应用程序分析的新手,如果我遗漏了一些明显的东西或没有正确考虑这一点,请原谅我。

谢谢, 科里

【问题讨论】:

    标签: asp.net profiling


    【解决方案1】:

    我猜这与长时间运行的数据库查询有关,而不是与 ASP.net 应用程序本身有关。以我的经验,10 次中有 9 次这是我所看到的,这会使 APPLICATION 服务器陷入爬行状态,因为资源被消耗并且应用程序必须等待每个查询完成才能继续前进。查看数据库服务器上的 SQL 分析器,看看是否有任何查询需要很长时间才能执行。

    它可以像为列添加索引或其他一些小的优化一样简单。知道查询后,您还可以返回代码并调整该部分。

    【讨论】:

    • 好吧,SQL Server 机器几乎没有做任何事情。 RAM 和 CPU 以及数据库服务器的整体性能都很好。所以我认为这根本不是数据库问题。
    【解决方案2】:

    最好的办法是在您自己的机器上分析您的代码,以确定它在哪里花费时间。

    免费试用 10 天:

    http://www.jetbrains.com/profiler/

    这里有一些链接可以帮助您:

    Link

    http://msdn.microsoft.com/en-us/library/ms178643(v=VS.100).aspx

    http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

    【讨论】:

    • 最好创建一个暂存环境,在那里复制生产和测试
    • 我同意。但是,只要小心,也可以在开发机器上测试瓶颈。
    • 我不同意。可以在暂存环境中复制环境,但不能复制行为。当接收 10 个请求与一次接收 100 个请求时,站点的行为可能会有所不同。例如,我有一个站点接收来自我开发的考勤系统中的生物识别设备的请求。当我在开发机器或登台机器上测试系统时,它就像一个魅力,但是当它同时收到来自多个设备的请求时,我遇到了问题。为了模拟人和设备的真实行为,这几乎是一个新项目,
    【解决方案3】:

    您应该考虑在生产服务器遇到高 CPU 时对其进行内存转储。查看ADPlus 并在asp.net 进程上进行挂起转储。然后可以使用Windbg 或其他工具对其进行分析。

    我刚刚经历了一次类似的经历,我们的生产服务器遇到了过多的 CPU 负载——我们无法在本地或在测试/暂存环境中重新创建这种情况。与数据库无关(数据库CPU正常)。分析转储文件让我们了解导致问题的原因(我们正在使用的某些库过度编译正则表达式对象)。

    如果没有Tess' blog,这个答案将是不完整的,所以这是链接。

    【讨论】:

    • 嗯..是的,我们昨天做了。但我不知道如何分析它。也许我只需要真正了解更多关于 ADPlus 和 Windbg 的信息,因为我真的觉得我不知道自己在做什么。谢谢。
    【解决方案4】:

    当然可以使用 EQATEC Profiler 分析 ASP.NET。见:
    Profiling ASP.NET websites with EQATEC Profiler

    EQATEC Profiler 在一个单独的步骤中检测您的应用程序,使应用程序本身能够收集其自己的分析信息,然后分析器仅显示该计时数据。

    这意味着您可以完全独立于分析器本身运行已检测的 ASP.NET 应用程序。 你可以例如检测您的应用程序,将其邮寄到您在印度的测试站点,让他们在服务器上运行几天,然后它会自行生成计时报告,然后让他们将这些报告邮寄给您,然后您可以查看探查器。很整洁。

    注意:要让已分析的应用程序“自行”生成时序快照,它必须知道何时生成它们。默认情况下,这是在 ASP.NET 应用程序中调用 Application_End 方法的时候。您可以使用 EQATEC Profiler API 在适合您的情况下以编程方式转储快照。请参阅用户指南或查看this thread

    【讨论】:

      【解决方案5】:

      Sam Saffron(StackoverFlow 的创建者之一)不久前编写了一个很棒的命令行工具,但不幸的是放弃了它。

      我的一个朋友分叉了代码以使其在 2015 年工作:

      https://github.com/jitbit/cpu-analyzer

      (该页面有一个链接到 Sam 的帖子,解释如何使用它)

      这个工具的好处(除了“不需要安装”的可移植性、命令行界面等)是像 NewRelic 等 APM 包只监控 http-requests。如果您的应用有一些后台线程 - 它们不会有太大帮助。

      【讨论】:

        【解决方案6】:

        对于那些仍然偶然发现这个问题的人来说,这实际上取决于您要完成的工作。

        如果服务器在 CPU 上运行得这么高,那么标准分析器很有可能会因为它的额外开销而使其停止运行。

        实际上有三种不同类型的分析器。标准分析器、轻量级事务分析器和 APM 工具。您可以在我讨论所有 3 的博客文章中阅读有关此内容的更多信息:

        .NET Profilers: 3 types and why you need all of them

        【讨论】:

          【解决方案7】:

          您可以在 Microsoft Developer Network 上阅读有关此内容的信息。 您可以根据 Visual Studio 的版本选择文档。您应该验证是否为您的 Visual Studio 类型提供了分析功能。

          How to: Profile a Web Site or Web Application Using the Performance Wizard

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-29
            • 1970-01-01
            • 2012-10-28
            • 1970-01-01
            • 2011-04-06
            相关资源
            最近更新 更多