问题我们在一台机器上发布了很多微服务,即:30个实例,每个使用150 - 300 mb。 许多微服务使用相同的库,但是将它独立加载。
问题 CLR可以加载程序集一次并与其他域共享以减少内存使用量吗?
调查和实验当我通过ProcessExplorer调查此问题时,我发现每个w3wp进程都有2个Application域。 其中一个用于从GAC加载程序集,另一个用于从应用程序文件夹加载程序集。
当我将常用程序集放入GAC时。 它增加了可共享,共享WS并减少了所有进程的私有WS。但工作集没有变化。
答案 0 :(得分:1)
打开VMMap并查看w3wp进程的内存结构。
减少内存使用的最简单方法:它将多个站点合并为一个应用程序域。每个站点的启动时间都将减少。
如果有很多具有强名称的程序集,您可以将它们放在GAC中。它为w3wp进程制作了域中性程序集。当且仅当它在GAC中时,此类程序集域中立,并且其传递绑定闭包中的所有程序集都在GAC中。 (see also blogs.msdn)
域中立程序集的优缺点:
关于强名称程序集和GAC的一些说法。
如果程序集具有强名称,请确保将它们放在全局程序集缓存(GAC)中。
否则,加载程序集需要触摸几乎每个页面以验证其数字签名。
当汇编未放入GAC时验证强名称也会降低NGen的性能提升。
(另请参阅:Pro .NET性能:优化您的C#应用程序。页面289)