ASP.NET Requests Queued导致网站崩溃。 SQL后端,IIS6

时间:2011-11-16 01:18:09

标签: asp.net sql iis-6

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

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

  • 设备:
    • Server 2003 32位
    • IIS 6
    • 8核(16 w /超线程)
    • 12gb RAM
    • ASP.NET网站
    • 3个应用程序池,因此运行了3个w3wp.exe实例。

该系统服务于大量用户,工作时间带宽相当稳定,达到~68,000kbit / s

有时候系统“关闭” - 网站变得很慢,会产生很多电话。事情通常会减慢60秒,但长度差异很大。有时只有几秒钟,有时甚至是3分钟或更长时间。

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

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

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

  • 整体CPU使用率上升。

  • w3wp.exe的整体内存消耗量上升。

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

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

我已经阅读了很多关于线程队列,线程池等的文章。这是一个很好的例子: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

2 个答案:

答案 0 :(得分:2)

不好玩。

许多根本原因都有共同的症状,这使得很难在不弄脏应用程序的情况下进行诊断。如果隐含了其中一些步骤,请原谅。

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

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

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

对于'减速'行为的描述是否可归因于apppool recycle并再次导致应用程序的jitting? ala - 第一个请求综合症。

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

祝你好运!

ž

答案 1 :(得分:1)

您正在谈论的设置是来自machine.config的system.web元素下的processModel元素的一部分。对于IIS6,以下适用:

autoConfig
maxIoThreads
maxWorkerThreads
minIoThreads
minWorkerThreads
requestQueueLimit
responseDeadlockInterval

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

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

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