2017-09-03 101 views
3

問題我們在一臺機器上發佈了很多微服務,即:30個實例,每個使用150-300 MB。 許多微服務使用相同的庫,但獨立加載它。在w3wp進程之間共享程序集以減少內存使用

問題 CLR可以加載程序集一次並與其他域共享以減少內存使用量嗎?

調查和實驗當我通過ProcessExplorer調查這個問題時,我看到每個w3wp進程都有2個應用程序域。 其中一個用於從GAC加載程序集,另一個用於從應用程序文件夾加載程序集。

當我將通用組件放入GAC時。 它增加了可共享,共享WS並減少所有進程的私有WS。但工作集沒有變化。

enter image description here enter image description here

+0

我猜想進程的內存是相互隔離的 –

+0

我在Process Explorer幫助中找到了下一個定義。 **可共享WS **分配給可與其他進程共享的類型或區域的物理內存量。 **共享WS **當前與其他進程共享的可共享WS的數量。 – StuS

+1

這不可能實現。但是如果你使用ASP.NET Core,微軟還有一些其他的東西https://github.com/dotnet/announcements/issues/30。 –

回答

1

打開VMMap和看看w3wp進程的存儲器結構。

  • 61出來的158 MB - 圖像(加載組件)
  • 40出來的158 MB - 頁面文件(與過程相關聯的存儲器)

vmmap screen

減少最簡單的方法內存使用情況:它將多個站點合併到一個應用程序域中。每個站點的啓動時間將縮短。

如果有很多名稱較強的程序集,可以將它們放入GAC中。這使得他們的域中立程序集 w3wp進程。當且僅當它位於GAC中時,此類程序集爲域中立,並且其傳遞綁定關閉中的所有程序集均在GAC中。 (see also blogs.msdn)

域中性組件優缺點:

  • (正反)域中性組件是跨多個應用程序域住裝配
  • (正反)域中性組件將被即時編譯一次
  • (專業人員)jitter代碼以及各種運行時數據結構(如MethodTables,MethodDescs)將在AppDomains之間共享。
  • (cons)一旦在域中加載了強命名程序集,就無法更新它,因此應該回收(重新加載)應用程序池。

關於強命名程序集和GAC的一些詞。

如果您的程序集具有較強的名稱,請務必將它們放在全局程序集緩存(GAC)中。

否則,加載程序集需要觸摸幾乎每一頁來驗證其數字簽名。

當組件未放置在GAC中時,強名稱的驗證也會降低NGen的性能收益。
(另請參閱:Pro .NET性能:優化您的C#應用​​程序頁面289)

相關問題