在 Small Business Server 2011 安装中,大量的 w3wp.exe 进程似乎占用了过多的内存。SBS 开箱即用安装总共包含 7 个站点和 20 个 ASP.NET 应用程序池(Sharepoint、Exchange、WSUS 和 SBS 特定的内容,如远程 Web 工作区)。
由此产生的十几个 w3wp.exe 进程往往会随着时间的推移消耗超过 4 GB 的服务器内存,峰值应用程序池是属于 WSUS 的应用程序池,工作集约为 800 MB。通过 IIS MMC 手动回收应用程序池有助于暂时减少内存使用量(w3wp.exe 进程缩减回 10 MB,其中一些进程会快速重新增长),但显然不是管理员想要整天做的事情。我找不到有关自动回收 SBS 预安装的应用程序池的任何建议,所以我不太愿意在生产系统上“直接这样做”。
我在网上研究了如何限制这种情况,结果只找到了一些帖子,声称 w3wp 内存消耗不会损害性能,反而会提高性能,因为内存会“在其他应用程序需要时释放”。问题是,它不起作用:
- 首先,SBS 是一个多角色服务器,其中一个角色(主要角色)是 CIFS 网络存储,它极大地受益于文件系统缓存,而文件系统缓存又依赖于内存的“空闲”,即“不以任何方式被其他进程使用”——ASP.NET 应用程序池几乎看不到用户,而且占用内存是适得其反的
- 另一件事是,我仍然看到 w3wp 实例内存消耗在内存短缺时大幅减少 - 我看到的是轻微的减少,远少于 100 mb,并且反而进行了过多的交换 - 再次损害了性能
我几乎从不管理 IIS 或 ASP.NET 应用程序,因此欢迎任何关于如何有效削减应用程序池内存需求的想法。
答案1
欢迎来到 SBS 的奇妙世界。建议 RAM 要求 = 10GB... 并且至少需要 8GB。(根据微软.) 有充分的理由。它不是一台经过精心调校、运转良好的机器……它非常马虎、臃肿,把所有的东西都捆绑在一起。你能给这个盒子装的内存越多……就越好。不幸的是,你最多只能使用 32gb。在我看来……这很愚蠢。
答案2
这就是我最终做的事情:
按照建议web.config
设置privateBytesLimit 参数,将 .NET AppPools 的服务器应用程序缓存设置为较低的值(5 MB)%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。
答案3
如果您怀疑由此产生的内存消耗是由于软件缺陷造成的,您可以使用 Microsoft DebugDiag 1.2 创建完整的内存转储并分析转储中的常见问题。如果您认为可能存在内存问题,则需要通过选择“泄漏监控”选项来启用泄漏跟踪,并在创建/分析转储之前让其运行一段时间。
DebugDiag 1.2 下载
https://www.microsoft.com/download/en/details.aspx?id=26798
答案4
您不需要为每个应用程序设置单独的应用程序池,只需要为那些不可靠的应用程序或您希望优先考虑的应用程序设置一个。许多应用程序可以共享(将不同的 .net 版本分开)。然后,您可以更实际地限制应用程序池将使用的内存。每天不需要多次重复回收池。
此外,通过这种方式可以释放的内存是有限的。虽然其中一些内存会作为缓存,但每个应用程序都需要一定数量的工作内存,这在很大程度上取决于特定的 Web 应用程序。试图过度限制这一点将导致事情陷入停滞。
问题实际上是 SBS 试图同时做太多事情,您需要查看您实际使用了哪些功能并关闭不使用的功能。
但说实话,对于只有 11 个用户的用户来说,剩余的内存都用在哪儿了?Exchange 和轻量级 SQL 肯定不会需要超过12Gb!