我们有一个.NET WebAPI应用程序(使用服务AutoStart提供商(。
该应用程序是由我们的buildserver构建的,并且将输出部署到多个服务器,并通过LoadBalancer路由到应用程序。
该站点的性能已经好几个月了。几天前
即使我们iisReset,重新启动服务器等,现在使用的内存比其他内存更多的服务器。ApplicationPool在开始后立即分配3倍内存。
现在到了超级五的东西....
要找出在内存中持有的内容,我"连接"了一个点式分析器(远程,使用remoteagent.exe(到其中一台服务器。池似乎回收了,一旦启动,它就不再分配3倍内存(因此内存快照是毫无用处的(。我从工作过程中"加入"了探查器,并注意到应用程序池不再使用3倍内存。我重新启动了服务器,它仍未使用3倍内存。
所以...似乎只是将Profiler附加到W3WP过程中,以一种持久的方式解决了我的问题,因为它仍在使用IisReset和重新启动后的"低内存使用"。
。在遇到相同问题的服务器2上尝试了相同的过程,这也解决了我的问题。
似乎Dottrace对我的WorkerProcess做了一些魔术:)?
有人可以找出原因吗?我有更多的服务器(在其他环境中(有相同的问题,但是我想知道这个问题的根本原因。
简短答案:我发现原因是Microsoft Monitoring Agent的Profiler,它挂在我的W3WP流程上。
长答案:
eventlog中的详细信息
.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注册表浏览到:
来禁用profiler。HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW3SVC
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWAS
和更改:
Environment = COR_PROFILER={AD5651A8-B5C8-46ca-A11B-E82AEC2B8E78} Cor_Enable_Profiling=1
to:
Environment = COR_PROFILER={AD5651A8-B5C8-46ca-A11B-E82AEC2B8E78} Cor_Enable_Profiling=0
我猜想,与直接更改注册表(也许卸载Microsoft Monitoring Agent?(
是一种更好的禁用分析方法的方法。...为什么剖析师会导致3x内存消耗仍然是一个谜。