问题 同一应用程序池中的网站是否共享加载的库?


我有一个带有IIS 8.0的Windows Server 2012。它托管了许多用户群较少的小型网站,这些网站在任何方面都不是关键任务。对于小型网站,我的意思是应用程序代码和内存占用量很低,但由于加载的库(如EntityFramework),应用程序的内存消耗大约为140MB,刚刚启动和空闲时。

一般来说,这对于一个成熟的网络服务器来说并不是什么大不了的事,但我只有一个带有4GB RAM的VPS,它还可以运行其他几个应用程序(数据库,BIND,hMail等)。我基本上将它用作开发服务器来使用许多不同的技术。因此,我在服务数十个~140MB w3wp的同时快速耗尽RAM。

除了在空闲时暂停,我还想减少内存消耗,同时仍然使用我想要使用的任何框架或库 - 这实际上是整个事情的目的。

长话短说: 由于应用程序不仅共享相同的.NET版本,而且还有一些像EF或MVC这样的库,在一个app_pool中运行多个站点以便它们可以共享库更有意义吗?或者无论如何每个站点都会加载自己的副本(由于讨论的不同的应用程序域) 这里)?

奖金问题: 在考虑硬件升级时,1GB的RAM是20美元/月,但将整个服务器放在SSD上是10美元/月。虽然我知道从页面文件中读取总是比从RAM中读取要慢得多但我正在考虑在SSD上使用大页面文件,而不是以两倍的价格购买1g的额外RAM - 再次,网站的速度不是至关重要,他们应该工作。这有什么意义吗?


6521
2017-12-24 12:04


起源

这不是IIS特有的。任何共享完全相同的DLL(来自GAC或来自同一文件夹)的代码共享该DLL的页面。 - John Saunders
@JohnSaunders好点,那是对的。但是,不是所有的DLL,例如EF,设计为GAC。所以在这种情况下,Peter建议的工具可以自动使用相同的文件夹,看起来就像是最佳解决方案。 - marce


答案:


在Process Explorer中查看w3wp进程(托管多个站点)显示它托管了几个不同的应用程序域,其中相同程序集的不同实例已加载到内存中。因此将网站迁移到单个AppPool可能没什么用。

但还有另一种选择。在IIS 8+中,您可以跨AppPools共享通用程序集。如果多个AppPools使用某些程序集,它们只会加载到内存中一次,然后由不同的进程进行别名处理。

看一下 来自asp.net的这一点 和这个 TechNet博客文章

你必须做一些设置工作,但它似乎工作得很好。


15
2017-12-25 17:04



优秀!相同的安全性,但共享库,这就是我需要和工作的魅力。 - marce