【问题标题】:Do websites in the same application pool share loaded libraries?同一个应用程序池中的网站是否共享加载的库?
【发布时间】:2014-01-12 16:20:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这不是 IIS 特有的。任何共享完全相同 DLL(来自 GAC,或来自同一文件夹)的代码都共享该 DLL 的页面。
  • @JohnSaunders 好点,没错。但是,并非所有 DLL,例如EF,被设计为 GAC'd。因此,在这种情况下,Peter 建议的工具可以自动使用相同的文件夹,看起来是最佳解决方案。

标签: asp.net iis application-pool


【解决方案1】:

查看 Process Explorer 中的 w3wp 进程(托管多个站点)表明它托管了多个不同的应用程序域,其中相同程序集的不同实例加载到内存中。因此,将网站移至单个 AppPool 可能没有多大帮助。

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

看看this bit from asp.net 和这个TechNet blog post

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

【讨论】:

  • 太棒了!相同的安全性但共享库,这就是我所需要的,并且工作起来就像一个魅力。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2023-04-05
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多