【发布时间】: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 个连接没有问题