【问题标题】:ASP.NET Requests Queued causes website to crumble. SQL backend, IIS6ASP.NET Requests Queued 导致网站崩溃。 SQL 后端,IIS6
【发布时间】:2011-11-16 01:18:09
【问题描述】:

我继承了一个有点复杂的系统(和问题),我需要帮助。

我有一个具有以下规格的网络服务器:

  • 硬件:
    • 服务器 2003 32 位
    • IIS 6
    • 8 核(16 带超线程)
    • 12GB 内存
    • ASP.NET 网站
    • 3 个应用程序池,因此运行了 3 个 w3wp.exe 实例。

该系统为大量人员提供服务,并且在工作时间内带宽相当稳定,达到 ~ 68,000kbit/s

有时系统“崩溃” - 网站变得非常缓慢,从而产生大量电话呼叫。事情通常会减慢 60 秒,但长度变化很大。有时只有几秒钟,有时是 3 分钟或更长时间。

我将我的应用程序池设置为回收大约 600mb 的已用内存。这并不准确,但他们自行回收并取得了很大的成功。有时我会手动回收“主”池以清除我所描述的问题。

当事情进展缓慢时,这就是我所知道的情况。

  • 网络带宽大幅下降。
  • 在 ASP.NET 性能计数器中排队的请求数增加。
  • 随着请求排队上升页面延迟的增加。 (我使用了一个简单的 ASP 页面,该页面进行 SQL 调用并只是说“系统处于活动状态” - 该页面被监控延迟)

  • 总体 CPU 使用率上升。

  • w3wp.exe 的总体内存消耗增加。

在我看来,这就是我想象中正在发生的事情。

有人要求系统生成报告或数据集。这会启动一个消耗大量线程(即所有可用线程)的进程,这会导致对系统的所有其他请求在 ASP.NET que 池中等待,这实际上会杀死站点。缺乏活动会导致网络流量下降。

我已经阅读了很多关于线程队列、线程池等的文章。这是一个很好的例子:http://williablog.net/williablog/post/2008/12/02/Increase-ASPNET-Scalability-Instantly.aspx 并做了我认为可以帮助我解决问题的线索......但我不确定。我正在使用的 asp.net 版本的“Machine.config”文件没有指定文章中列出的任何线程值,因此对于我认为在我们的情况下不正确的所有内容,我们都是默认值。

如果你是我;你接下来会做什么?你认为问题出在哪里?

编辑:这是一个屏幕截图。问题发生时应该很明显。 http://i.imgur.com/5BJlq.png

编辑:

我想为我们的设置更改这些值。先问几个问题:

1) 进行更改后,需要重新启动什么才能生效?

2) 这些设置如何查找具有 8 个物理内核的系统?

maxconnection = 96
maxIoThreads = 100
maxWorkerThreads = 100
minFreeThreads = 704 
minLocalRequestFreeThreads = 608

【问题讨论】:

  • 我会削弱 32 位版本的 Windows,然后选择 64 位版本。虽然 64 位意味着代码可以消耗比 32 位更多的内存,但这也意味着机器可以在一个周期内完成两倍于 32 位操作系统的工作量。它还会为您的应用程序提供更多空间,因为即使您有 12 GB 的内存,一个应用程序也只能寻址 4 GB,因为它是一个 32 位程序(因此不知道 PAE)。
  • 我们将进入 2008R2 / IIS7 - 同时,我们需要了解问题所在,而不是放弃它并做其他事情。
  • 我们也有这个问题,我们的服务器在 6000 个网络服务\当前连接上运行缓慢,但同时我们有另一个单独的服务器,带有 iis 7 用于静态文件(没有 asp)女巫服务 7000 个连接没有问题

标签: asp.net sql iis-6


【解决方案1】:

不好玩。

许多根本原因都有共同的症状,因此很难在不弄脏应用程序的情况下进行诊断。 :) 如果其中一些步骤是暗示的,请原谅。

接下来的一些步骤可能是:

  • 查看每个站点的 IIS 日志,查找以下内容:
    • HTTP 响应代码(5xx、4xx、3xx)
    • 请求响应时间
  • 查看 Windows 事件日志
    • 应用程序池多久循环一次?
    • 应用程序错误等
  • 按照@vinayc 的建议验证 processModel 设置,以确保前任没有变得“棘手”
  • 安装DebugDiag,它是一个非常好的工具,可以对内存和崩溃相关问题进行一些基本分析。
    • 这还可以帮助您捕获内存快照以便以后进行诊断。
    • Tess Ferrandez blog 可以帮助进行内存快照分析的头/尾。
  • 了解每个 AppPool 中运行了多少 Web 应用程序。
  • 调查使用“网络花园”以尽可能减少受“减速”影响的用户数量
  • 是否启用了病毒扫描程序?它在运行吗?如果是,请验证排除项。
  • 是否有应用程序团队可以帮助排除故障?确定他们是否有任何可能有助于诊断问题的自定义应用程序工具。

这种行为是“新的”吗?还是一直都在?如果是“新”,您能否追踪可能导致新行为的部署?

对“减速”行为的描述是否可以归因于应用程序池回收并导致应用程序再次抖动? ala - 第一个请求综合症。

查看日志有助于了解网站/应用程序的使用情况,如果您不拥有代码库,这一点尤其重要。 Logparser 是进行一些 IIS 日志分析(以及其他格式)的出色工具。

祝你好运!

Z

【讨论】:

  • 肯定会查看网站日志:是有什么导致速度变慢的原因,还是随着时间的推移逐渐累积的原因?
  • Jeremy:是某种原因造成的。应用程序池设置为回收@ 600mb 虚拟内存,这似乎让事情变得非常健康。您会在网站日志中查找什么内容?
【解决方案2】:

您所说的设置是 machine.config 中 system.web 元素下的 processModel 元素的一部分。对于 IIS6,以下适用:

autoConfig
maxIoThreads
maxWorkerThreads
minIoThreads
minWorkerThreads
requestQueueLimit
responseDeadlockInterval

通常,您只会找到autoConfig="true" 而不会找到其他元素。自动配置根据您的机器配置设置值 - 调整是根据推荐值完成的(请参阅 this 文章中的 Threading Explained 部分),这些值与您提供的链接所见相同.
article 虽然过时了,但如果您想手动调整这些设置,我是很好的资源。

另一方面,在您服务的负载下,我会推荐两件事(如果您还没有尝试过)

  • 积极使用输出缓存 - 即使数据是动态的,缓存 30-60 秒也可以明显提高负载
  • 如果您怀疑某些请求占用了太多线程,请尝试将这些资源移动到不同的应用程序池下(您可以使用具有不同子域的不同网站,或者您可以使用不同的虚拟目录/应用程序并选择不同的应用程序-池)

【讨论】:

  • 我想为我们的设置更改这些值。先问几个问题: 1) 修改后,需要重启什么才能生效? 2) 这些设置如何查找具有 8 个物理内核的系统? maxconnection = 96 maxIoThreads = 100 maxWorkerThreads = 100 minFreeThreads = 704 minLocalRequestFreeThreads = 608
  • @AaronJAnderson, 1) processModel 更改在重新启动工作进程之前不会生效(请参阅msdn.microsoft.com/en-us/library/7w2sway1%28v=VS.100%29.aspx 中的备注)。 2) 是的,这些是推荐值,但如果你有 autoconfig="true" 那么你已经为你调整了这些值!
  • 感谢您的时间和帮助。我们正在快速跟踪到 2008 R2 w/IIS 7.5 和积极的外部缓存系统。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
相关资源
最近更新 更多