刚刚工作时候碰到过这么一个例子!

一个申报系统,用ASP.NET开发的,然后每当申报高峰的时候,都会出现错误页面

统计单位就往我们单位打电话!

根据同事的以前的经验,登录服务器把IIS重启下就可以了

我上去看了看好啊,一台老爷级别的服务器上20多个网站 狂晕!

过了段时间 那边的申报单位换人了。算是一个比较会嫌弃或者说抱怨的人把

真的不想理他,但是没办法毕竟网站是我们做的啊。现在又我接手

我分析了下,最大可能就是连接每关闭!

所以打算分析下代码

发现代码有两个文件夹,假设A和B吧

A文件夹还是有源码的(以前的一个技术牛人写的)

B文件夹据说是一个实习生写的。连.CS文件也没有了!啊!!!

如果改代码说实话,我懒得改 也改不了!

然后百度了圈,发现可能是应用程序池的问题!结果还真是应用程序池 。(肯定是每关闭导致应用程序池过大)

所以今天讲讲啥是应用程序池

 

首先我看了看服务器的进程,里面有很多W3WP.EXE 进程! 而且消耗内存很大

我通过PID找到相对应那个网站的进程!更加确定是因为消耗导致卡住的。

E8C8FFA77BDAB946ED20B1B517F86E4C_B500_90

66CB754D5E5B1ABF13C87E8707B6D2F6_B500_90

在默认情况下apppool设置为每1740分钟(29小时)回收一次,回收时,appPool中的IIS进程会停止,然后用重叠的方式重启。所以不会有请求丢失!回收有助于预防因内存泄漏或其他资源泄漏,程序BUG导致的中断!

他默认只有一个DefaultAPPpool

我当时的想法是,每天早上4点,通过计划任务自动重启下IIS(毕竟那时候没人访问)

但是发现不行,到了12点左右还是会卡死!下午又能接到那个催命一样的电话了

那我们怎么办呢?

后来我通过查阅资料发现,在同一个AppPool内运行的网站会共享这些进程。

简单的说,如果某个网站导致因为程序BUG(比如说datareader未关闭什么的)会导致所有网站的出现卡死(这种情况我们单位遇到过!只有重启服务器,或者IIS

经过沟通,我发现有些页面用着用着就会很卡,我发现基本上是那个实习生写的文件夹里头的(这边这么说没有看不起实习生的意思,实事求是罢了,再者我一开始进入单位也是实习生,而且我也犯过类似的错误!后来问了以前的几个学长搞定程序连接的问题)

后来我想了想,我能不能多创建几个应用程序池,然后把网站独立开来

添加额外应用程序池,就是为了通过应用程序隔离AppPool,防止因为BUG影响其他网站!(在IIS左边有个应用程序池,你在那儿新建就是了,然后把网站或者文件夹的应用程序池指向你新建的那个应用程序池)

于是我多创建了两个个应用程序池。一个分配给这个网站的A目录一个分配给B目录!然后IIS还是照样计划重启。结果就没卡住过

 

事情发生了很早,一直想总结,但是没有机会,这几天看资料又看到这块所以就写下,一方面加深印象,第二方面希望对大家有帮助。

by  老陈

2012/3/9