2024年1月4日发(作者:)

解决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的问题出现过什么错误。

关于占用内存过多解决方法

服务器配置方面

1. 安装.NET Framework 1.1 Service Pack 1补丁部分解决了一些内存泄漏的问题,下载地址为:/downloads/?displaylang=en&FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38

2.使用更多的内存

a.打开/3GB Switch(如果你有3GB以上的内存)。这个配置只在Windows 2000 Advanced

Server和Data Center版本以及Windows Server 2003以上才支持,参见:

/library/?url=/library/en-us/dnpag/html/

/?scid=kb;en-us;820108

b.即使你有很多内存,但.NET(注意不是工作进程,而是.NET整个使用的内存是有一定限制的,可以通过加大配置使用量来减少内存溢出的发生。方法如下:修改文件,一般在 %System%meworkv1.1.4322CONFIG目录中, 修改processModel元素中的memoryLimit,大于缺省设置的60(意味着物理内存的60%)。

3.回收工作线程

设置IIS定期清除Work process是避免此异常的一个较好的方式。但这个功能是IIS

6.0(也就是Windows 2003上带的IIS)才支持。配置方法如下:修改IIS的应用程序池配置,选择DefaultAppPool(如果你的系统是用这个池),右键点属性->Recycling Setting,然后选择根据情况 修改“Recycle worker processes at the following times:'等几项配置,其中定时回收工作进程是一个比较好的方式,可以避免回收工作进程时,引起客户Session丢失。

Windows 2000 server 上安装的是IIS 5.0,本身不支持Recycle,但要想实现这个功能也不难。微软针对IIS提供的IIS5Recycle便是这样一个程序,它安装后以服务形式提供回收工作进程。

安装说明见/?id=322350

代码编写方面的注意问题

1. g方面的类使用问题

g用到了很多系统的资源和非托管代码,所以使用的时候要特别小心,注意内存泄漏(Memory Leak)例如:ansparent方法的使用问题:/247reference/msgs/40/

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= 标识来检索词描述;查看帮助和支持以了解详细信息。下列信息是事件的一部分: emoryException: 发生类型为 emoryException 的异常。

/kaneboy/archive/2005/05/07/

中的OutOfMemoryException

在博客园看到了一位园友写的文章《如何处理OutOfMemoryException异常?》,于是想和大家交流一下中出现OutOfMemoryException的问题。

实际上,在 Web服务器上,所能够用到的内存,通常不会等同于所有的内存数量。在配置文件中,配置节中有一个属性“memoryLimit”,这个属性的值是一个百分值,默认为“60”,即指定了进程(在任务管理器中大家就可以看到的进程,IIS5中为aspnet_wp,IIS6中为w3wp)能够使用所有物理内存的60%。当使用的内存量超过这个限额时,IIS会开始自动回收(recycle)进程,即创建一个新的进程去负责应付Http请求,而将旧进程所占用的内存回收。

当我们有一台很大内存的服务器时,“memoryLimit”这个值是需要进行适当的调整的。比如我们准备了一台4G内存的服务器,那么4G×60%=2.4G。但是,对于Win32操作系统,一个进程所能占用的所有内存空间只有2G。当进程占用的内存开始达到2G时,由于它并没有达到2.4G的“回收阈值”,所以IIS不会启动recycle进程操作,但是由于Win32

的限制,实际上已经不能给这个进程分配更多的内存了,于是,OutOfMemoryException就很可能会被抛出了。为了避免这样的情况,我们就必须将“memoryLimit”适当调小,以让IIS更早的进行进程回收。

微软推荐的进程占用内存是不超过60%,并最好使计算出的实际值不超过800M。就是说,对于一台4G内存的服务器,最好将“memoryLimit”属性设置成“20”。设置一个适当的回收阈值,让IIS适时的进行进程回收,对于保证整个服务器的稳定运行,避免OutOfMemoryException是非常重要的。

在IIS6中,进程的回收阈值不再由配置节中的“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:windowssystem32目录下的一个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会重启动一个新池,此段时间很短,一般不会有什么感觉,池就重新开启了,对于

访问网站的人基本是不会有感觉的。但假如池 没有在指定时间内关闭,IIS就会强行关闭他一个刷新CPU时间。在这个停止的时间内,网站无法访问,提示“Service Unavaliable”。

关闭时间和启动时间间隔配置:设短一些比如10秒,这样当您的网站程式大量占用系统资源时IIS自动快速回收进程并且快速启动进程,您的网站暂时还能够将就着工作。

对内存的限制及进程回收时间的配置:我配置为内存占用超过800M就自动回收内存,虚拟内存没有做限制。进程回收时间我保持默认没有修改。各位能够根据自己的情况配置更短的时间。对应用程式池最大虚拟内存也能够在此进行配置,超过了配置的最大虚拟内存,该池会就被回收。

最后综合落伍wlmmc的一些经验,总结一些需要注意的问题:

1、 要限制一个站点的CPU使用,必须将该站点配置为单独应用程式池,共用应用程式池是无法限制单个站点的。IIS单独应用程式池,就需要单独的进程,很消耗内存。单独池越多,就有越多的W3WP进程。对 于每个站点均要单独应用程式池的服务器,在一般的普通P43.0 2G内存的普通服务器上,建议不要超过50个站点,最好30以内,不然服务器压力很大。在配置上,我一般把资源消耗较大的网站单独一个池,一般普通BBS 或生成HTML的系统大概5个站一个池。普通网站连同一些企业站点均共用一个池。

2、根据wlmmc的经验,在服务器硬件允许的情况下,一般不要限制站点内存使用,这样能够确保网站运行,不会出现用户掉线情况。需要限制某站的最大虚拟内存不要小于64M,不然可能出现一些未知的错误。

3、这些都不是根本解决办法,他的根本问题是网站程式有问题,要解决根本问题还要从程式查起。根据本文开头提到的方法查到具体的应用程式池,找到使用此应用程式池的网站,解决网站程式存在的问题,如死循环之类。

4、除了, 在调用数据库进行大量查询操作的时候,也会大量占用CPU资源,这是难免的(数据库方面的语句及结构优化不在本文讨论范围之内)。个人认为,只要不是CPU长时间占用100%, 一般在75%左右都是正常的。

解决占用CPU和内存问题

在WINDOWS2003+IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢。

今天研究了一下,可以做以下配置:

1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。

2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。同时,设置同时运行的w3wp进程数目为1。再设置当内存或者cpu占用超过多少,就自动回收内存

一般来说,这样就可以解决了。但仍然会出现个别网站因为程序问题,不能正确释放。那么,怎么样才能找到是哪一个网站的?

1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid;

2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池;

3、到iis中察看该应用程序池对应的网站,就ok了。

问:我的具体情况是这样的:

服务器配置 至强2.8G 内存512M SCSI硬盘 2块 (软镜像)

系统 windows 2003

现在挂了一个开发的网站 访问量不大 但是出现一个问题,就是每当服务器运行2-3天后,访问网站就特别慢,重启动服务器后就正常了,查看进程使用内存的情况,发现 和 进程占用内存相当大,达到了170多M( 每个),物理可用内存几乎用光(服务器重启动时 占用的内存很小才40多M 每个)。以前网站挂在一个虚拟机上,数据库是分开挂的,从没出现这种情况后来,原版移植到新服务器上就出现这样的问题~~ ;

还个一问题就是,我在SQL企业管理器中查看SQL进程,发现有很多是.net 引起的进程是sleeping,但是却占用了内存~ 无法释放。

搞了很久了 一直都没解决

求救~~请高手 指教~~ 万分感谢~~~~~

答:IIS服务管理器----》应用程序池----》添加你的应用,并设置最大内存,当程序达到最大内存后其会自动重启。

我的问题跟你一样,不过我的内存是2G的,访问量比较高,一般是差不多运行24小时后就得重启,内存没耗完,W3WP进程占到一百八九十兆,SQL占了二百多兆时,就得重启,不然整个站点就当在那边....55555555,搞了快半个月了还是不行,痛苦啊。

就是你的应用宿主,如果你使用了大量的Session、Cache等资源,并且Session超市时间很长,那么内存占用量就比较大。应用池是为增加性能而设的一个特

性,但是也消耗很大的内存。另外关掉Windows Server 2003里的大多数Service(那个不用都可以关掉),也可以节省一部分内存。

1.怀疑在程序中应用的CACHE,

中有大量的数据

3.频繁刷新CACHE

4.没有设计好CACHE的方式

你的问题我以前也遇见过,我以前是用的Session,后我全部改成cook之后就好多了,应该是你的Session或是你的CACHE有问题(CACHE不太懂,但多多少应该是有的)

跟踪下SQL的调用记录,在每次往CACHE或SESSION写入大量数据时记录一下时间,看是否太过频繁

1.在win2003里的进程就是

2.512M内存个人用是够用了,但是放在服务器上就有点不够用了,尤其是win2003 + +sql server 。尤其是sql server 他是很吃内存的,如果不控制的话,他会占光所有的物理内存(只剩下几十M 倒 100M 吧)。win2003 本身就要占用150M左右。也就剩不下什么了。

3.优化程序,就向楼上的说的那样,少用或不用session cache application之类的东西,再有就是是不是有翻页的地方,翻页处理不好也是会占很多内存的。

4.限制sql的内存。企业管理器——SQL的属性(一般是local)——“内存”标签,在这里看内存的设置,把最大值改成100M吧。

第四条是最快的方法,可以试一试。

我的一个自开发OA系统也存在这样的问题。

总结上面,大概原因是因为 session 和 cache 的不合理使用造成的。

我的应用程序中,确实用了很多的Session 和 Cache,在 MSDN 中找到了“动态内存分配”这一篇,今天就试看看,是否有效。

希望有经验的朋友多给些信息,大家也好总结下出现类似错误的原因,谢谢!!

不知道你是什么网站。按理说是不会占用这么大的。如上你用了cache存放了超额的内容。当然。象session这种是不太可能占用这么大的了,或用了application 类似的一些有超长时间或永久保持性的对象来保存大量数据。如利用单例保存数据这些都有可能造成使用大量的内存。

建义2003系统安装至少1G内存。

是2003下的一个iis进程,至于楼主说的sql占用内存,那有可能是因为你的sql没有设置占用内存上限

在IIS6下,经常出现的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。

解决内存占用过多,可以做以下配置:

1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。

2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。

解决CPU占用过多:

1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。

2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。

根据w3wp取得是那个一个应用程序池:

1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid

2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:windowssystem32目录下的一个VBS脚本,全名为,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based Script Host”来执行,就可以得到PID与应用程序池的对应关系。)

3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。

Web站点崩溃的原因总结

有许多种原因可能导致Web站点无法正常工作,这使得系统地检查所有问题变得很困难。下面将集中分析总结导致Web站点崩溃的最常见的问题。如果可以解决这些常规问题,那么也将有能力对付出现的一些意外情况。

磁盘已满

导致系统无法正常运行的最可能的原因是磁盘已满。一个好的网络管理员会密切关注磁盘的使用情况,隔一定的时间,就需要将磁盘上的一些负载转存到备份存储介质中(例如磁带)。

日志文件会很快用光所有的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。可以采取措施将日志文件保存在与操作系统不同的文件系统中。日志文件系统空间已满时Web服务器也会被挂起,但机器自身被挂起的几率已大大减低。

C指针错误

用C 或C++编写的程序,如Web服务器API模块,有可能导致系统的崩溃,因为只要间接引用指针(即,访问指向的内存)中出现一个错误,就会导致操作系统终止所有程序。另外,使用了糟糕的C指针的Java模拟量(analog)将访问一个空的对象引用。Java中的空引用通常不会导致立刻退出JVM,但是前提是程序员能够使用异常处理方法恰当地处理错误。在这方面,Java无需过多的关注,但使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。

内存泄漏

C/C ++程序还可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分配时,通常会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,只要操作系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。

解决方案之一是使用代码分析工具(如 Purify)对代码进行仔细分析,以找出可能出现的泄漏问题。但这种方法无法找到由其他原因引起的库中的泄漏,因为库的源代码是不可用的。另一种方法是每隔一段时间,就清除并重启进程。Apache的Web服务器就会因这个原因创建和清除子进程。

虽然Java本身并无指针,但总的说来,与C程序相比,Java程序使用内存的情况更加糟糕。在Java中,对象被频繁创建,而直到所有到对象的引用都消失时,垃圾回收程序才会释放内存。即使运行了垃圾回收程序,也只会将内存还给虚拟机VM,而不是还给操作系统。结果是:Java程序会用光给它们的所有堆,从不释放。由于要保存实时(Just In Time,JIT)编译器产生的代码,Java程序的大小有时可能会膨胀为最大堆的数倍之巨。

还有一个问题,情况与此类似。从连接池分配一个数据库连接,而无法将已分配的连接还回给连接池。一些连接池有活动计时器,在维持一段时间的静止状态之后,计时器会释放掉数据库连接,但这不足以缓解糟糕的代码快速泄漏数据库连接所造成的资源浪费。

进程缺乏文件描述符

如果已为一台Web服务器或其他关键进程分配了文件描述符,但它却需要更多的文件描述符,则服务器或进程会被挂起或报错,直至得到了所需的文件描述符为止。文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,这意味着每个从shell启动的进程可以同时打开64个文件和网络连接。大多数shell都有一个内嵌的ulimit 命令可以增加文件描述符的数目。

线程死锁

由多线程带来的性能改善是以可靠性为代价的,主要是因为这样有可能产生线程死锁。线程死锁时,第一个线程等待第二个线程释放资源,而同时第二个线程又在等待第一个线程释放资源。我们来想像这样一种情形:在人行道上两个人迎面相遇,为了给对方让道,两人同时向一侧迈出一步,双方无法通过,又同时向另一侧迈出一步,这样还是无法通过。双方都以同样的迈步方式堵住了对方的去路。假设这种情况一直持续下去,这样就不难理解为何会发生死锁现象了。

解决死锁没有简单的方法,这是因为使线程产生这种问题是很具体的情况,而且往往有很高的负载。大多数软件测试产生不了足够多的负载,所以不可能暴露所有的线程错误。在每一种使用线程的语言中都存在线程死锁问题。由于使用Java进行线程编程比使用C容易,所以Java程序员中使用线程的人数更多,线程死锁也就越来越普遍了。可以在Java代码中增加同步关键字的使用,这样可以减少死锁,但这样做也会影响性能。如果负载过重,数据库内部也有可能发生死锁。

如果程序使用了永久锁,比如锁文件,而且程序结束时没有解除锁状态,则其他进程可能无法使用这种类型的锁,既不能上锁,也不能解除锁。这会进一步导致系统不能正常工作。这时必须手动地解锁。

服务器超载

Netscape Web服务器的每个连接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的连接提供任何服务。如果有一种负载分布机制可以检测到服务器没有响应,则该服务器上的负载就可以分布到其它的Web服务器上,这可能会致使这些服务器一个接一个地用光所有的线程。这样一来,整个服务器组都会被挂起。操作系统级别可能还在不断地接收新的连接,而应用程序(Web服务器)却无法为这些连接提供服务。用户可以在浏览器状态行上看到connected(已连接)的提示消息,但这以后什么也不会发生。

解决问题的一种方法是将参数RqThrottle的值设置为线程数目之下的某个数

值,这样如果越过RqThrottle的值,就不会接收新的连接。那些不能连接的服务器将会停止工作,而连接上的服务器的响应速度则会变慢,但至少已连接的服务器不会被挂起。这时,文件描述符至少应当被设置为与线程的数目相同的数值,否则,文件描述符将成为一个瓶颈。

数据库中的临时表不够用

许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,直到有临时表被释放时才能再继续运行。

这是一个不容易被程序员发觉的问题,但会在负载测试时显露出来。但可能对于数据库管理员(DataBase Administrator,DBA)来说,这个问题十分明显。

此外,还存在一些其他问题:设置的表空间不够用、序号限制太低,这些都会导致表溢出错误。这些问题表明了一个好的DBA对用于生产的数据库设置和性能进行定期检查的重要性。而且,大多数数据库厂商也提供了监控和建模工具以帮助解决这些问题。

另外,还有许多因素也极有可能导致Web站点无法工作。如:相关性、子网流量超载、糟糕的设备驱动程序、硬件故障、包括错误文件的通配符、无意间锁住了关键的表