w3wp 从一天到另一天内存使用率高

w3wp high memory usage from one day to another

我们有一个 .NET webapi 应用程序(带有服务自动启动提供程序)。

应用程序由我们的构建服务器构建,输出部署到多个服务器,对应用程序的请求通过负载均衡器路由。

网站几个月来一直表现良好。几天前,我们注意到应用程序池在三分之二的服务器上使用的内存比前几天多 3 倍。

现在使用比其他服务器更多内存的服务器正在这样做,即使我们 iisreset、重新启动服务器等也是如此。应用程序池在启动后立即分配比另一个多 3 倍的内存。

现在来看看超级奇怪的东西....

为了找出内存中的内容,我 "attached" 一个 dotTrace 分析器(远程,使用 remoteagent.exe)到其中一台服务器。池似乎在回收,一旦启动它就不再分配 3x 内存(因此内存快照无用)。我 "deattached" 来自工作进程的探查器并注意到应用程序池不再使用 3x 内存。我重新启动了服务器,它仍然没有使用 3x 内存。

所以...似乎只是将探查器附加到 w3wp 进程以一种持久的方式解决了我的问题,因为它在 iisreset 和重新启动后仍在使用 "low memory usage"。

在遇到同样问题的服务器 #2 上尝试了相同的程序,它也解决了我的问题。

dotTrace 似乎对我的工作进程做了一些神奇的事情:) ?

谁能找出原因?我有更多的服务器(在其他环境中)有同样的问题,但我想知道这个问题的根本原因。

简答: 我发现原因是 Microsoft Monitoring Agent 的探查器挂钩到我的 w3wp 进程。

长答案:

事件日志中的详细信息

.NET Runtime version 4.0.30319.34014 - The profiler was loaded successfully.  Profiler CLSID: '{AD5651A8-B5C8-46CA-A11B-E82AEC2B8E78}'.  Process ID (decimal): xxxx.  Message ID: [0x2507].

让我得出结论,另一个分析器附加到 w3wp。在注册表中搜索 CLSID 很明显涉及到监控代理。可以通过首先浏览 windows 注册表来禁用探查器:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WAS

和变化:

Environment = COR_PROFILER={AD5651A8-B5C8-46ca-A11B-E82AEC2B8E78} Cor_Enable_Profiling=1

至:

Environment = COR_PROFILER={AD5651A8-B5C8-46ca-A11B-E82AEC2B8E78} Cor_Enable_Profiling=0

我想有比直接更改注册表更好的禁用分析的方法(也许卸载 Microsoft Monitoring Agent?)

...为什么探查器会导致 3 倍的内存消耗仍然是个谜。