解决iis内存占用过大的问题
在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢。今天研究了一下,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响;
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。同时,设置同时运行的w3wp进程数目为1。再设置当内存或者cpu占用超过多少,就自动回收内存。
一般来说,这样就可以解决了。但仍然会出现个别网站因为程序问题,不能正确释放。那么,怎么样才能到是哪一个网站的?
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid;
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池;
3、到iis中察看该应用程序池对应的网站,就ok了。
用IIS6运行网站的话,一定要利用好应用程序池,我负责维护的我公司的web Server,上面的网站加起来有十多个,我给每个站都分配了单独的应用程序池,并且在应用程序池中设置了,每天凌晨的不同时间对池进行回收。
在任务管理器里面最多(有的站点如果20分钟没人访问,该站点的w3wp就会自动关闭)可以看到十多个进程。
服务器已经稳定运行半年多了,从没有因为IIS的问题出现过什么错误。
关于ASP.NET占用内存过多解决方法
服务器配置方面
1.安装.NET Framework 1.1 Service Pack 1补丁部分解决了一些内存泄漏的问题,下载地址为:
www.microsoft/downloads/details.aspx?displaylang=en&FamilyID=a8f5654 f-088e-40b2-bbdb-a83353618b38
2.使用更多的内存
a.打开/3GB Switch(如果你有3GB以上的内存)。这个配置只在Windows 2000 Advanced Server和Data Center版本以及Windows Server 2003以上才支持,参见:
msdn.microsoft/library/default.asp?url=/library/en-us/dnpag/html/sca lenetchapt17.asp
aspnet和net的区别support.microsoft/default.aspx?scid=kb;en-us;820108
b.即使你有很多内存,但.NET(注意不是ASP.NET工作进程,而是.NET整个使用的内存是有一定限制的,可以通过加大配置使用量来减少内存溢出的发生。方法如下:修改fig文件,一般在 %System%\Microsoft.Net\Framework\v1.1.4322\CONFIG目录中, 修改processModel元素中的memoryLimit,大于缺省设置的60(意味着物理内存的60%)。
3.回收工作线程
设置IIS定期清除Work process是避免此异常的一个较好的方式。但这个功能是IIS 6.0(也就是Windows 2003上带的IIS)才支持。配置方法如下:修改IIS的应用程序池配置,选择DefaultAppPool(如果你的系统是用这个池),右键点属性->Recycling Setting,然后选择根据情况修改“Recycle worker pr ocesses at the following times:'等几项配置,其中定时回收工作进程是一个比较好的方式,可以避免回收工作进程时,引起客户Session丢失。
Windows 2000 server 上安装的是IIS 5.0,本身不支持Recycle,但要想实现这个功能也不难。微软针对IIS提供的IIS5Recycle便是这样一个程序,它安装后以服务形式提供回收工作进程。
安装说明见support.microsoft/?id=322350
代码编写方面的注意问题
1.System.Drawing方面的类使用问题
System.Drawing用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak)例如:BitMap.MakeTransparent方法的使用问题:
www.dotnet247/247reference/msgs/40/202528.aspx 2.new byte[]问题
处理流的时候常常会用到new一个大的byte数组。但在多用户情况下会消耗大量的内存。正确的做法应该是定义一个比较小的byte数组做为缓存,然后循环使用。如在我们的程序中,有些地方使用不当,当图片(或附件)过大或过多的时候, new byte[length]就有可能消耗过多的内存。
3. 避免使用大对象数组或小对象大数组
编程时同样要重视效率问题(包括内存占用问题)。
3.Com接口调用是要注意释放对象。
posted on 2005-01-25 13:37 Chainet
事件类型:错误
事件来源:Application
事件种类:无
事件 ID:0
日期:2005-11-19
事件:15:40:49
用户:N/A
计算机:WEBHOST1
描述:事件 ID ( 0 )的描述(在资源( Application )中)无法到。本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息。您可能可以使用
/AUXSOURCE= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: System.OutOfMemoryException: 发生类型为 System.OutOfMemoryException 的异常。
blog.joycode/kaneboy/archive/2005/05/07/50409.aspx
ASP.NET中的OutOfMemoryException
在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下ASP.NET中出现OutOfMemoryException的问题。
实际上,在ASP.NET Web服务器上,ASP.NET所能够用到的内存,通常不会等同于所有的内存数量。在fig配置文件中,配置节<processModel>中有一个属性“memoryLimit”,这个属性的值是一个百分值,默认为“60”,即指定了ASP.NET进程(在任务管理器中大家就可以看到ASP.NET的进程,IIS5中为aspnet_wp,IIS6中为w3wp)能够使用所有物理内存的60%。当ASP.NET使用的内存量超过这个限额时,IIS会开始自动回收(recycle)进程,即创建一个新的进程去负责应付Http请求,而将旧进程所占用的内存回收。
当我们有一台很大内存的服务器时,“memoryLimit”这个值是需要进行适当的调整的。比如我们准备了一台4G内存的服务器,那么4G×60%=2.4G。但是,对于Win32操作系统,一个进程所能占用的所有
内存空间只有2G。当ASP.NET进程占用的内存开始达到2G时,由于它并没有达到2.4G的“回收阈值”,所以IIS不会启动recycle进程操作,但是由于Win32
的限制,实际上已经不能给这个进程分配更多的内存了,于是,OutOfMemoryException就很可能会被抛出了。为了避免这样的情况,我们就必须将“memoryLimit”适当调小,以让IIS更早的进行进程回收。
微软推荐的ASP.NET进程占用内存是不超过60%,并最好使计算出的实际值不超过800M。就是说,对于一台4G内存的服务器,最好将“memoryLimit”属性设置成“20”。设置一个适当的回收阈值,让IIS适时的进行进程回收,对于保证整个服务器的稳定运行,避免OutOfMemoryException是非常重要的。
在IIS6中,ASP.NET进程的回收阈值不再由配置节中的“memoryLimit”属性决定,而是由IIS管理器中的应用程序池配置中的设置决定。
但是,即使正确设置了这些配置,也不能保证完全避免OutOfMemoryException的发生,原因可能是多样而复杂的,比如内存回收操作可能耗时太多等等。开发人员要注意的,就是在代码中时刻牢记不要无谓的使用和浪费内存。:)
解决服务器进程占用cpu和内存过多问题
最近公司服务器总出现CPU100%占用情况,服务器配置为双核Xeon3.0x2,2G ECC 内存。
发现是长时间占用大量CPU.出现这种情况应该是网站程式存在死循环等问题所致。
在到问题以前能够暂时采取限制w3wp进程CPU使用率的方法确保网站能够将就着工作:
在IIS6下,经常出现的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。
解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程式池配置。即互相之间不影响。
2、配置应用程式池的CPU监控,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。
根据w3wp取得是哪一个应用程式池:
1、在任务管理器中增加显示pid字段。就能够看到占用内存或cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就能够了。这样就能够看到pid对应的应用程式池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,假如您和我相同,也禁止了Vbs默认关联程式,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就能够得到PID和应用程式池的对应关系。)
3、到iis中察看该应用程式池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程式有无死循环之类的问题。
解决内存占用过多,能够做以下配置:
1、在IIS中对每个网站进行单独的应用程式池配置。即互相之间不影响。
2、配置应用程式池的回收时间,默认为1720小时,能够根据情况修改。再配置当内存占用超过多少(如500M),就自动回收内存。
我的配置如下:
首先是对CPU的限制:在启用cpu监控后,我配置该应用程式池最大的cpu使用率为50%。配置刷新cpu时间为1分钟,配置操作为“关闭”。最大工作进程数配置为1。这个意思是,IIS刷新检测该单独池的CPU使用情况时间为1分钟,假如超过配置的cpu限制50%,就会发出关闭池的指令,需要池在指定的时间内关闭。假如池成功在这个时间内关闭,IIS会重启动一个新池,此段时间很短,一般不会有什么感觉,池就重新开启了,对于
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论