我们有一个.NET webapi应用程序(带有服务自动启动提供程序)。
应用程序由我们的构建服务器构建,输出部署到多个服务器,对应用程序的请求通过负载均衡器进行路由。
该网站连续几个月表现良好。几天前,我们注意到应用程序池使用的内存比前一天多3倍,在3台服务器中有2台。
现在使用更多内存的服务器正在这样做,即使我们iisreset,重新启动服务器等。应用程序池在启动后立即分配比另一个多3倍的内存。
现在对超级奇怪的东西......
为了找出记忆中被耽搁的东西,我附上" dotTrace探查器(远程,使用remoteagent.exe)到其中一个服务器。该池似乎是循环使用的,一旦启动它就不再分配3倍内存(因此内存快照无用)。我" delaached"来自工作进程的探查器,并注意到应用程序池不再使用3x内存。我重新启动了服务器,它仍然没有使用3x内存。
所以...似乎只是将探查器附加到w3wp进程,以一种持久的方式解决了我的问题,因为它仍在使用低内存使用率#34;在iisreset和重新启动之后。
尝试在服务器#2上遇到同样问题的相同程序,它也解决了我的问题。
似乎dotTrace对我的workerprocesses做了一些魔术:)?
任何人都可以找出原因吗?我有更多的服务器(在其他环境中)有同样的问题,但我想知道这个问题的根本原因。
答案 0 :(得分: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倍内存消耗仍然是个谜。