刚刚工作时候碰到过这么一个例子!
一个申报系统,用ASP.NET开发的,然后每当申报高峰的时候,都会出现错误页面
统计单位就往我们单位打电话!
根据同事的以前的经验,登录服务器把IIS重启下就可以了
我上去看了看好啊,一台老爷级别的服务器上20多个网站 狂晕!
过了段时间 那边的申报单位换人了。算是一个比较会嫌弃或者说抱怨的人把
真的不想理他,但是没办法毕竟网站是我们做的啊。现在又我接手
我分析了下,最大可能就是连接每关闭!
所以打算分析下代码
发现代码有两个文件夹,假设A和B吧
A文件夹还是有源码的(以前的一个技术牛人写的)
B文件夹据说是一个实习生写的。连.CS文件也没有了!啊!!!
如果改代码说实话,我懒得改 也改不了!
然后百度了圈,发现可能是应用程序池的问题!结果还真是应用程序池 。(肯定是每关闭导致应用程序池过大)
所以今天讲讲啥是应用程序池!
首先我看了看服务器的进程,里面有很多W3WP.EXE 进程! 而且消耗内存很大
我通过PID找到相对应那个网站的进程!更加确定是因为消耗导致卡住的。
在默认情况下apppool设置为每1740分钟(29小时)回收一次,回收时,appPool中的IIS进程会停止,然后用重叠的方式重启。所以不会有请求丢失!回收有助于预防因内存泄漏或其他资源泄漏,程序BUG导致的中断!
他默认只有一个DefaultAPPpool
我当时的想法是,每天早上4点,通过计划任务自动重启下IIS(毕竟那时候没人访问)
但是发现不行,到了12点左右还是会卡死!下午又能接到那个催命一样的电话了
那我们怎么办呢?
后来我通过查阅资料发现,在同一个AppPool内运行的网站会共享这些进程。
简单的说,如果某个网站导致因为程序BUG(比如说datareader未关闭什么的)会导致所有网站的出现卡死(这种情况我们单位遇到过!只有重启服务器,或者IIS)
经过沟通,我发现有些页面用着用着就会很卡,我发现基本上是那个实习生写的文件夹里头的(这边这么说没有看不起实习生的意思,实事求是罢了,再者我一开始进入单位也是实习生,而且我也犯过类似的错误!后来问了以前的几个学长搞定程序连接的问题)
后来我想了想,我能不能多创建几个应用程序池,然后把网站独立开来
添加额外应用程序池,就是为了通过应用程序隔离AppPool,防止因为BUG影响其他网站!(在IIS左边有个应用程序池,你在那儿新建就是了,然后把网站或者文件夹的应用程序池指向你新建的那个应用程序池)
于是我多创建了两个个应用程序池。一个分配给这个网站的A目录一个分配给B目录!然后IIS还是照样计划重启。结果就没卡住过
事情发生了很早,一直想总结,但是没有机会,这几天看资料又看到这块所以就写下,一方面加深印象,第二方面希望对大家有帮助。
by 老陈
2012/3/9