1

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

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

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

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

现在到超级奇怪的东西......

为了找出内存中的内容,我将 dotTrace 分析器(远程,使用 remoteagent.exe)“附加”到其中一台服务器上。池似乎在回收,一旦启动它就不再分配 3x 内存(因此内存快照是无用的)。我从工作进程中“分离”了分析器,并注意到应用程序池不再使用 3x 内存。我重新启动了服务器,它仍然没有使用 3x 内存。

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

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

似乎 dotTrace 对我的工作进程有什么神奇作用:)?

任何人都可以找出原因吗?我有更多的服务器(在其他环境中)有同样的问题,但我想知道这个问题的根本原因。

4

1 回答 1

1

简短回答: 我发现原因是 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 倍的内存消耗仍然是一个谜。

于 2017-04-26T08:27:58.843 回答