同一個應用程序池中的網站是否共享載入的庫?
我有一個帶有 IIS 8.0 的 Windows Server 2012。它託管了許多使用者群較低的小型網站,這些網站在任何方面都不是關鍵任務。對於小型網站,我的意思是應用程式碼和記憶體佔用非常低,但由於載入了 EntityFramework 等庫,新啟動和空閒時應用程序的記憶體消耗約為 140MB。
一般來說,對於一個成熟的網路伺服器來說,這沒什麼大不了的,但我只有一個具有 4GB RAM 的 VPS,它還執行其他幾個應用程序(數據庫、BIND、hMail 等)。我基本上將它用作開發伺服器來使用許多不同的技術。因此,在為數十個 ~140MB w3wp 提供服務時,我的 RAM 很快就用完了。
除了在空閒時掛起之外,我還想減少記憶體消耗,同時仍然使用我想使用的任何框架或庫——這實際上是整個事情的目的。
**長話短說:**由於應用程序不僅共享相同的 .NET 版本,而且還共享一些庫,如 EF 或 MVC,所以在一個 app_pool 中執行多個站點以便它們可以共享庫是否更有意義?還是每個站點都會載入自己的副本(由於此處討論的不同應用程序域)?
**額外問題:**在考慮硬體升級時,1GB 的 RAM 是 20 $ /month but putting the whole server on SSDs is 10 $ /月。雖然我確實知道從頁面文件讀取總是比從 RAM 讀取慢得多,但我正在考慮在 SSD 上使用大頁面文件,而不是以兩倍的價格購買 1gig 額外的 RAM – 同樣,網站的速度不是關鍵,他們應該工作。這有什麼意義嗎?
查看 Process Explorer 中的 w3wp 程序(託管多個站點)表明它託管多個不同的應用程序域,其中相同程序集的不同實例載入到記憶體中。因此,將這些站點移動到單個 AppPool 可能沒有多大幫助。
但還有另一種選擇。在 IIS 8+ 中,您可以跨 AppPools 共享通用程序集。如果某些程序集被多個 AppPools 使用,它們只載入到記憶體中一次,然後由不同的程序別名。
從 asp.net和這篇TechNet 部落格文章中查看這一點
你必須做一些設置工作,但它似乎工作得很好。