昨晚十点钟的样子,网站崩溃,开始 service unavailable,最近开始业务高峰,心里一惊,麻痹肯定进程池又异常崩溃了。又碰到什么问题?上次是因为一个异步线程的问题,导致了进程池直接崩溃,后面修改掉了,这次又因为什么?
然后先新建了一个进程池,把网站先跑起来。
查看windows日志,发现如下错误:
先爆发了一个oom错误,再w3wp.exe崩溃了。
但是我确信,我的内存绝对足够,一般只占用70%最多。
所以当时我没办法找到问题,今天早上,一个同事反馈网站有一个功能异常,大致就是,从上传的excel中,读取数据,以前可以读到显示,现在不行了。
遂问另外一个负责开发的同事,可能是什么情况(因为代码没动过),同事说,是不是换过进程池?(因为以前有时候进程池出问题,第一个解决办法就是先新建进程池把网站跑起来。)
然后告诉我,是因为没开启IIS进程池高级设置那里的的一个选项(这台服务器我们都可以管理配置,他配置过这个选项,我不知道。),如图:
我听到以后,
第一个反映就是:那肯定是这个问题造成的了。
第二个反映是:卧槽,前台怎么能把这个开关打开?要知道,前台进程池的w3wp.exe经常会跑到2g以上的内存!!
先普及一下这个开关的作用,因为我的服务器是64位的,windows server 2008,然后读取excel的时候,用的是oledb,一定要安装windows office才能用,然后服务器上一直用的是windows office 2003。
so,问题来了:2003相关东西是不能以64位的方式被IIS进程加载的,所以要打开这个开关,让它能正确加载,但是这样一来,当前IIS进程将处于32位方式下运行。
so,问题又来了,32位程序,最大可用内存是2g
一切依然明了,首先是同事打开了IIS进程池高级设置的这个开关,导致了IIS进程池的进程以32位方式运行,然后高峰期业务量稍微一高,内存占用马上超过2g,
OOM 自然来了,然后一直这样W3WP.EXE自然崩溃了。
所以罪魁祸首就是打开了这个开关。。。。。
所以,暂时的解决办法,关注一下内存,跑得稍微高了点的时候,及时回收一下进程池。
第二步,想办法将那个开关变为true,并且让读excel的功能能 用。
要让开关能换为true且功能能正常的,无非就是,要么修改服务器环境,安装一个2010的office上去,或者修改读取excel的代码,不用微软提供的相关东西。
so,为了不对服务器做很大的改动,果断选择后者。
查资料,发现NPOI,很适合我的需求,用之,解决。大概用法见以下链接 http://www.cnblogs.com/Jerseyblog/p/6410559.html
以上,记录一下找到问题过程,以免以后自己忘记,也让可能有同种问题的人参考之。
===================================================================
以下代码纯粹是为了让搜索引擎收录好让友友或许能百度到这篇文章,可以不用看。是windows错误日志详情。(或许百度就收录这篇文章,你或许就刚好搜这个错误代码看到了呢?对吧。毕竟我截图,百度收录不到这个关键代号什么的)
进程主机空闲检查过程中发生错误。
Exception: System.OutOfMemoryException
Message: 引发类型为“System.OutOfMemoryException”的异常。
StackTrace: 在 System.Web.Hosting.ApplicationManager.CloneAppDomainsCollection()
在 System.Web.Hosting.ApplicationManager.IsIdle()
在 System.Web.Hosting.ProcessHost.IsIdle()
错误应用程序名称: w3wp.exe,版本: 7.5.7601.17514,时间戳: 0x4ce7a5f8
错误模块名称: KERNELBASE.dll,版本: 6.1.7601.19160,时间戳: 0x56bcd5c3
异常代码: 0xe0434352
错误偏移量: 0x0000c52f
错误进程 ID: 0x648
错误应用程序启动时间: 0x01d287a8fac9208a
错误应用程序路径: C:WindowsSysWOW64inetsrvw3wp.exe
错误模块路径: C:Windowssyswow64KERNELBASE.dll
报告 ID: a4af05ca-f44f-11e6-9c01-e998e853dd81