w3wp.exe占用内存


8

在Small Business Server 2011安装中,许多w3wp.exe进程似乎使用了不成比例的内存。开箱即用的SBS安装中共有7个站点和20个ASP.NET应用程序池(Sharepoint,Exchange,WSUS和SBS特定的东西,例如Remote Web Workplace)。

随着时间的推移,由此产生的十几个w3wp.exe进程往往会消耗超过4 GB的服务器内存,而峰值应用程序池属于WSUS,工作集中的内存池约为800 MB。通过IIS MMC手动回收应用程序池有助于暂时减少内存使用(w3wp.exe进程缩小到10 MB,其中一些增长很快),但显然不是管理员整日想要做的事情。我找不到有关自动回收预装SBS的应用程序池的任何建议,因此我有些不情愿在生产系统上“做到这一点”。

我在网络上如何限制此限制的研究仅引发了几篇文章,指出w3wp的内存消耗不会损害但会提高性能,因为内存将“在其他应用程序需要时释放”。问题是它无法解决:

  • 首先,SBS是多角色服务器,CIFS网络存储是其中的主要角色之一,CIFS网络存储极大地受益于文件系统缓存,而文件系统缓存又依赖于“空闲”内存,如“任何其他进程均未使用”方式”-几乎看不到用户并消耗内存的ASP.NET应用程序池起反作用
  • 另一件事是,由于内存不足,我仍然必须看到w3wp实例的内存消耗大量减少-我看到的是轻微减少了不到100 mb,而是过度交换-再次损害了性能

我几乎从未管理过IIS或ASP.NET应用程序,因此欢迎有关如何有效减少应用程序池的内存需求的任何想法。


此ASP.NET应用程序做什么?我曾看到当应用程序无法关闭与Linq-To-SQL或实体框架的连接时,w3wp.exe会占用大量内存。
Nate 2012年

有几种。许多都与Exchange相关,例如OWA / OMA和Sync服务,其中一个特别大,是WSUS,一些用于Sharepoint或自定义的SBS特定(CompanyWeb,Remote Web Workplace)网站
the-wabbit 2012年

Answers:


7

欢迎来到SBS的美好世界。建议的RAM = 10GB的要求...并且至少需要8GB。(根据Microsoft的说法)是有充分理由的。这不是经过精心调校的机器,它非常草率,肿,并且在阳光下将所有东西捆在一起。您可以在该盒子上投入的RAM越多……越好。不幸的是,您最多只能使用32gb。哪个恕我直言...很傻。


我想我应该稍微完善一下答案。如果您担心它消耗的RAM数量,请执行以下一项操作,以节省很多时间/头疼:A)不要使用SBS ...使用标准服务器并设置您需要的角色个别地。或B)将更多的RAM投入系统...因为RAM非常便宜。SBS是为非常小的办公室而设计的...(10-20个工作站...),并且扩展性不是很好。
TheCompWiz 2012年

感谢您的回答。我观察到该行为的系统具有16 GB的RAM,这是物理限制。可用内存很快被Exchange的store.exe以及SQL Server和w3wp.exe的许多实例所填满,这不仅是“未经微调”的,而且是彻底的脑残。当我经常管理Exchange和SQL Server系统时,我知道如何处理其他两个内存消耗过多的问题,但是使用w3wp会使我有些茫然。网络本身只有11个用户。
the-wabbit 2012年

Exchange,SQL Server和IIS均具有尝试并消耗100%RAM用于“缓存”数据的机制。如果其他情况需要更多RAM,则应该全部缩减3 个以允许其他服务运行而无需进行交换。(理论上)在实践中,但是我发现您只需要在某些事情上努力...您可以尝试并手动调整所有内容并设置硬限制...但是您将不断追赶那个。我将看看是否能找到我几年前读到的有关为您限制IIS中的应用程序池的文章...
TheCompWiz 2012年



7

这就是我最终要做的事情:

通过在at中设置privateBytesLimit参数,将.NET AppPools的服务器应用程序缓存设置为较低的值(5 MB)web.config%WINDIR%\Microsoft.NET\Framework\<version>\Config以下答案所示

    <configuration>
      <system.web>
         <caching>
           <cache privateBytesLimit="5242880" privateBytesPollTime="00:01:00" />
         </caching>
      </system.web>
    </configuration>

在默认的池回收设置下,这有助于将内存使用量减少到1 GB以上。

显然,使用“服务器”类型的垃圾收集器(<gcServer = "true">也会导致大量内存消耗,但是看起来<gcServer>默认情况下它设置为false。


仅供参考-前一阵子,我们在阅读以下文章后就开始将gcserver设置为false: forums.asp.net/t/1654596.aspx/1msdn.microsoft.com/en-us/library/ff647787.aspx
Greg Askew

@ the-wabbit既然服务器垃圾回收同时发生,设置gcServer = false的建议是否仍然有效?
迈克尔•斯蒂尔

6

如果您怀疑由于软件缺陷造成的内存消耗问题,可以使用Microsoft DebugDiag 1.2创建完整的内存转储并分析转储中的常见问题。如果您认为可能存在内存问题,则需要通过选择“监视泄漏”选项来启用泄漏跟踪,并在创建/分析转储之前让它运行一段时间。

DebugDiag 1.2下载
https://www.microsoft.com/download/en/details.aspx?id=26798

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


感谢您的链接,我将尝试一下。在本地化(非美国英语)版本的Windows上运行时,MSI安装程序包显然存在问题,我必须查看是否有解决方法。
the-wabbit 2012年

2

您不需要为每个应用程序都提供单独的应用程序池,仅需要那些不可靠或希望优先处理的应用程序池即可。许多人可以共享(将不同的.net版本分开保存)。然后,您可以更实际地限制应用程序池将使用的内存。每天不应重复多次回收池。

同样,只有这么多的内存可以通过这种方式释放。尽管其中一些将被缓存,但每个应用程序都需要一定数量的工作内存,而这些内存高度依赖于特定的Web应用程序。试图限制太多,将使事情陷入停顿。

问题实际上是SBS试图一次做太多事情,您需要查看实际使用的内容,并关闭不使用的内容。

但是老实说,只有11个用户,其余的内存又去了哪里呢?轻量级的Exchange和SQL当然不需要超过12Gb!


啊,您从未体验过SBS的美丽,是吗?当不受限制时,Exchange的信息存储将增长到8 GB,多个SQL Server实例将很乐意再占用3 GB。大多数应用程序池仅在相同的.NET版本和相同的安全上下文中运行1-2个应用程序。但是,由于支持问题,我无法对其进行重组。同样,也不大可能解决内存问题-如果我只有4个1 GB进程而不是12个较小的进程,那么赢不了多少。
the-wabbit 2012年

减少应用程序池的区别在于,各种缓存将充满常规使用的内容,而将不使用的内容全部排除。随着大量的应用程序池,将会有更多的浪费。您实际上对11个用户需要多少个安全上下文?是的,Exchange将愉快地使用它可以使用的尽可能多的内存,但是如果您限制的话,对于少数几个用户来说,它也会愉快地仅运行2GB。使用SBS,您需要接受的是,您不能在任何地方都使用最佳实践,也不能以最佳方式运行任何选项,您需要务实一点,不要过度设计。
JamesRyan 2012年

好吧,如果您尝试在服务器上运行它的20个实例,也难怪您试图将它们全部塞入内存。您确实应该在问题中提到这一点,因为它使事情完全不同。
JamesRyan 2012年

我实际上不是-正如我所说,物理系统会出现问题,很少使用的应用程序池会从更有价值的文件系统缓存中窃取内存。我怀疑这可能是由于应用程序池中存在一些对象缓存,并且正在寻找一些减少/禁用缓存的方法。
the-wabbit 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.