Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 在w3wp进程之间共享程序集以减少内存使用_Asp.net_.net_Iis_W3wp - Fatal编程技术网

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

Asp.net 在w3wp进程之间共享程序集以减少内存使用,asp.net,.net,iis,w3wp,Asp.net,.net,Iis,W3wp,问题我们在一台机器上发布了许多微服务,即:30个实例,每个实例使用150–300 mb。 许多微服务使用相同的库,但独立加载 问题CLR能否加载程序集一次并与其他域共享以减少内存使用 调查和实验当我通过ProcessExplorer调查这个问题时,我发现每个w3wp进程有两个应用程序域。 其中一个用于从GAC加载程序集,另一个用于从应用程序文件夹加载程序集 当我在GAC中放置公共程序集时。 它增加了所有进程的可共享、共享WS,并减少了私有WS。但是工作集没有改变 打开并查看w3wp进程的内存结

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

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

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

当我在GAC中放置公共程序集时。 它增加了所有进程的可共享、共享WS,并减少了私有WS。但是工作集没有改变

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

  • 158 Mb中的61个–映像(已加载的程序集)
  • 158MB页面文件中的40个(与进程相关的内存)

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

如果有很多具有强名称的程序集,您可以将它们放在GAC中。对于w3wp过程,它可以使它们的域无关程序集。此类程序集是域中立的当且仅当它在GAC中,并且它的传递绑定闭包中的所有程序集都在GAC中

与域无关的程序集优点和缺点:

  • (优点)域无关程序集是跨多个AppDomain的程序集
  • (优点)域无关程序集将只进行一次JIT
  • (优点)jitted代码以及MethodTables、MethodDesc等各种运行时数据结构将在appdomains之间共享
  • (缺点)一旦强名称程序集加载到域中,您就不能更新它,所以您应该回收(重新加载)应用程序池
一些关于强命名程序集和GAC的单词。

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

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

当程序集未放入GAC时,验证强名称也会减少NGen的任何性能收益。

(另请参见:Pro.NET Performance:优化您的C#应用程序。第289页)

我想进程的内存是相互隔离的。我在Process Explorer帮助中找到了下一个定义。Shareable WS分配给类型或区域的物理内存量,可与其他进程共享。Shared WS当前与其他进程共享的可共享WS的数量。不太可能实现。但是如果你使用ASP.NETCore,微软还有别的功能。