【问题标题】:Determining what is putting pressure on IIS确定对 IIS 施加压力的因素
【发布时间】:2012-06-24 12:20:31
【问题描述】:

我有一台运行 IIS 7.5 和 SQL Server 2010 的专用服务器。服务器 CPU 负载通常接近 100%。 SQL 服务器不会占用太多,但 w3wp 进程占用了大量 CPU(通常为 70+%)。

我想知道是什么导致了这种压力: * 静态文件请求过多(可以添加CDN) * 太多的 ajax 请求(无论如何我都在考虑彗星/网络套接字) * 单个asp.net页面消耗过多的处理能力(应该很容易优化)

您会从哪里开始寻找优化的起点?

【问题讨论】:

  • 这不是很多信息。你有多少网络设置?有多少用户同时连接?有多少个数据库,它们有多大?你的 CPU 是多少线程,你有多少内存?我看到一个服务器受到攻击的案例,一个机器人在一个受保护不好的网络应用程序上创建用户,并用坏东西制作了数百万个博客。你能检查一下你是否有这样的情况吗?还是所有来自普通用户的?
  • 一切正常,无攻击。有足够的 RAM(16 GB,IIS 使用少于 1GB,3GB 未使用)

标签: asp.net performance iis


【解决方案1】:

最简单的方法是在生产环境中分析应用。不确定您的情况是否可行。一些选项:

  • 查看日志并查看请求的持续时间。长请求可能会给系统带来负担
  • 使用 Visual Studio 远程调试 w3wp 并暂停调试器 10 次以查看它最停止的位置。那是热点
  • 使用 XPerf 或 PerfView 来捕获(托管)堆栈。这对生产性能几乎没有影响

【讨论】:

    【解决方案2】:

    启动开发工具(IE/Chrome 中的 F12)并查看网络选项卡下的时间是一个很好的起点。这将向您显示页面如何加载的瀑布式图表,并且应该帮助您识别任何可能被明智地移至 CDN 的加载速度特别慢的静态文件、发出的任何不必要的请求、花费了多少时间来获取实际页面本身等。

    之后,使用性能分析器分析应用程序。像ANTS Performance Profiler 这样的好的分析器可以让您查看不同方法的执行时间/命中计数,以及正在运行哪些数据库查询以及它们花费了多长时间。新版本的 ANTS(目前位于 EAP)还将按 http 请求对该活动进行分组,以便您查看特定页面是否需要优化或被点击次数过多。

    您最好检查一下缓存是否按预期工作,以免用户不必要地重新请求页面。

    还有一篇关于 ASP.NET 性能的好文章,您可能想在 http://aspalliance.com/1533_ASPNET_Performance_Tips.7 阅读。

    免责声明:我为制作 ANTS 的 Red Gate 工作。

    【讨论】:

    • 从用户的角度来看,网站很快,所以浏览器端的开发者工具没有帮助。但是,是的,我应该去使用像 ANTS 这样的工具。 (或 dotTrace :))但到目前为止,我不确定是否以及如何在生产服务器上使用它。几年前我涉足开发服务器,但我没有相关的使用数据。
    • 根据经验,您应该尽量避免在生产环境中进行分析,因为这会增加对已经负载很重的系统的性能影响。也就是说,它有时是一种必要的邪恶,实际上人们总是成功地做到这一点。如果您将来这样做,您可以使用“附加到进程”选项来避免重新启动 IIS。您还可以使用较低的采样策略来减少对性能的影响:例如,除非确实需要,否则您可能希望避免生产中的行级时序,而方法级时序可能没问题。
    【解决方案3】:

    我找到了一种简单的方法来查看服务器上发生了什么。 尽管如此,专业的方法可能是去使用分析工具。

    我做了什么? 在 IIS 控制台中,您可以获得所有当前工作线程的列表,如果您选择一个,您可以看到该线程正在处理什么。所以我能够看到线程正在并行处理 100 个请求,其中 70 个请求回溯到同一个 ajax 调用。

    立即的解决方案是减少调用频率(从每 10 秒到每 30 秒)。下一步将进一步优化服务器端的调用,因为我确实有其他频率相同(每 10 秒)的 ajax 调用,由于它们的速度如此之快,它们几乎从未出现在活动请求列表中。

    【讨论】:

    • 现在您已经知道自己在寻找什么,请查看我在回答中提到的 Eqatec 分析器。他们有免费版本。
    【解决方案4】:

    可能最简单的解决方法是在服务器上安装New Relic。我认为试用期持续 30 天,所以它应该给你足够的时间来了解这一点。它将向您展示长时间运行的 SQL 查询、.NET 方法以及您能想到的几乎所有其他内容。它使识别瓶颈变得非常容易。


    顺便说一句,我建议使用 New Relic,因为听起来您的问题出在生产环境中。 New Relic 并不是一个非常详细的分析器。它收集了足够的信息以提供帮助,但不会降低服务器的速度。这使得它非常适合这个目的。

    但是,如果您可以在开发环境中重现该问题,您可以尝试免费的Eqatec profiler 之类的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多