在w3wp进程之间共享程序集以减少内存使用量

时间:2017-09-03 07:19:18

标签: asp.net .net iis w3wp

问题我们在一台机器上发布了很多微服务,即:30个实例,每个使用150 - 300 mb。 许多微服务使用相同的库,但是将它独立加载。

问题 CLR可以加载程序集一次并与其他域共享以减少内存使用量吗?

调查和实验当我通过ProcessExplorer调查此问题时,我发现每个w3wp进程都有2个Application域。 其中一个用于从GAC加载程序集,另一个用于从应用程序文件夹加载程序集。

当我将常用程序集放入GAC时。 它增加了可共享,共享WS并减少了所有进程的私有WS。但工作集没有变化。

enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

打开VMMap并查看w3wp进程的内存结构。

  • 158 Mb中的61个 - 图像(装配的装配)
  • 158 Mb中的40个 - 页面文件(与进程关联的内存)

vmmap screen

减少内存使用的最简单方法:它将多个站点合并为一个应用程序域。每个站点的启动时间都将减少。

如果有很多具有强名称的程序集,您可以将它们放在GAC中。它为w3wp进程制作了域中性程序集。当且仅当它在GAC中时,此类程序集域中立,并且其传递绑定闭包中的所有程序集都在GAC中。 (see also blogs.msdn)

域中立程序集的优缺点:

  • (专业)域中性程序集是一个跨多个应用程序域的程序集
  • (专业)域中性程序集只会被一次
  • (专业)jitted代码以及各种运行时数据结构(如MethodTables,MethodDescs)将在appdomains之间共享。
  • (缺点)一旦在域中加载,就无法更新强名称程序集,因此您应该回收(重新加载)应用程序池。

关于强名称程序集和GAC的一些说法。

如果程序集具有强名称,请确保将它们放在全局程序集缓存(GAC)中。

否则,加载程序集需要触摸几乎每个页面以验证其数字签名。

当汇编未放入GAC时验证强名称也会降低NGen的性能提升。
(另请参阅:Pro .NET性能:优化您的C#应用​​程序。页面289)