IIS 异常 “System.OutOfMemoryException”、“存储空间不足,无法完成此操作。”

1、 场景:今天是中秋节,部门内一个项目才上线,需要有人值班,作为部门的小头头理所当然的奉献一下了。上午基本上没什么问题,
话说也那么巧,中午正好与客户吃饭呢应用人员报告,有两台机器同时“白屏了!”,根据经验分析,应该是服务器的问题,马上回现
场,网络?OK;远程接入到服务器,登录后提示IIS异常,报了个VC++的内存错误;IISRESET,客户端已能正常连接;查看系统日志.....

2、故事正式开始。

    

    太懒了,不重新描述了,把邮件内容贴上吧:

    

各位领导、老师好!
 
问题现象:见附件两图片。
 
产生原因:(问题分析依据:http://support.microsoft.com/kb/911816):
出现这个问题的原因在于未处理异常的默认策略在 .NET Framework 2.0 中已发生更改。默认情况下,未处理异常的策略是结束工作进程。
在 Microsoft .NET Framework 1.1 和 Microsoft .NET Framework 1.0 中,会忽略托管线程上的未处理异常。除非附加调试程序以捕获异常,否则您可能意识不到出错。
ASP.NET 在 .NET Framework 2.0 中使用未处理异常的默认策略。引发未处理的异常时,基于 ASP.NET 的应用程序将会意外退出。
如果在请求上下文中出现异常,则不会发生上述行为。这类异常仍由 HttpException 对象进行处理和包装。在请求上下文中出现的异常不会导致工作进程结束。但是,请求上下文之外的未处理异常(如计时器线程上或回调函数中的异常)会导致工作进程结束。
 
解决办法:1、修改 IHttpModule 对象的源代码,以便将异常信息记录到应用程序日志中。
             2、将未处理异常策略更改回 .NET Framework 1.1 和 .NET Framework 1.0 中发生的默认行为。
             3、如因Framework本身引起异常,安装Sp2后可解决。
处理结果:现已按解决办法1进行日志跟踪以查找具体原因。
 
<我的大名>匿了
 
 
总之就是按照邮件所述内容搞了一通,在本地做完实验,发现的确可以捕捉到应用的异常,于是发布到服务器,观察一阵,客户端应用正常,就等着下次异常出现,以确定最终异常所在了。。。。。

2、回到家再做饭已经来不及了,抱着负罪感带老婆、孩子去吃饺子,还好排了10分种终于有位置,菜还没上、饺子还没选,评书中讲的也没这么巧,电话来了,异常出现!!!!!!,“上马”去现场肯定来不及,不如“马上”让兄弟远程处理,2分种后短信发来一切正常,此刻起,我每吃两个饺一个电话,直至15个饺子吃完。
    老婆一肚子火,我明知理亏,所以不能怒,更不能言,上车回家,打开笔记本,远程......事件查看器、Google、baidu、截图.......后面的内容又在邮件里了。
 
标题《跟踪"存储空间不足,无法完成此操作"异常情况,初步分析原因及处理情况,进一步观察中》
  
 
各位领导、同仁,大家好!
 
  根据上封邮件采取措失,在晚18点出现异常时捕捉到错误的详细信息如下:
Event code: 3005 
Event message: 发生了未处理的异常。 
Event time: 22/9/2010 PM 6:07:24 
     Event time (UTC): 22/9/2010 AM 10:07:24 
Event ID: 4db8c7da0d564747986910d2ffd18960 
     ..................
     Exception information: 
     Exception type: OutOfMemoryException 
     Exception message: 引发类型为“System.OutOfMemoryException”的异常。 
 
错误信息详细及各错误对比见附件(按时间顺序)
 
用友U8异常处理:
微软MSDN解决办法:
SOSO问问:
 
 
问题原因:
     在ASP.NET Web(U8Soft.AppServer)服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量。在machine.config配置文件(目录)中,配置节中有一个属性“memoryLimit”,这个属性的值是一个百分值,默认为“60”,即指定了ASP.NET进程(在任务管理器中大家就可以看到ASP.NET的进程,IIS5中为aspnet_wp,IIS6中为w3wp)能够使用所有物理内存的60%。当ASP.NET使用的内存量超过这个限额时,IIS会开始自动回收(recycle)进程,即创建一个新的进程去负责应付Http请求,而将旧进程所占用的内存回收。
     比如我们准备了一台4G内存的服务器,那么4G×60%=2.4G。但是,对于Win32操作系统,一个进程所能占用的所有内存空间只有2G。当ASP.NET进程占用的内存开始达到2G时,由于它并没有达到2.4G的“回收阈值”,所以IIS不会启动recycle进程操作,但是由于Win32的限制,实际上已经不能给这个进程分配更多的内存了,于是,OutOfMemoryException就很可能会被抛出了。
 
 
解决方案:
如果你有一台大内存的服务器,同时对Win32操作系统中对于进程最高使用2G内存的限制很郁闷,可选的解决方法有两个:
1、使用/3GB模式启动计算机(只适用于XP和2003操作系统)。在boot.ini文件中做如下设置 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2003 Server" /3GB
2、使用Windows Server 2003 64bits Edition
 
 
上述解决方案是用友建议解决办法,根据我们实际生产情况,暂时无法调整操作系统,所以现采用微软MSDN知识库“应用程序池”回收处理机制建议,现将应用程序池内存调整至800M,以观后效。
 
 
祝大家中秋快乐!
 
PS:如果这个问题解决了,我也很快乐.

礼!       
 
<我的大名>匿了
 
 
我想这事算是告以段落了。
 
 
替朋友打个广告:某男IT从业9年,.NET开发8年时间,多年制造管理、航运生产相关信息化项目建设经验,有项目组织、系统设计开发及实施能力,欲从事项目咨询职位,有意者请留言。
 

 

 

    

posted @ 2010-09-22 21:55  禹过天晴  阅读(3970)  评论(0编辑  收藏  举报