背景
代碼寫的有問題,會很容易出現內存泄露的問題。
應用如果是部署在docker容器里面的,可以限制這個應用的內存。
那么,如果是傳統的.NET Framework應用,部署在IIS上面呢?
老黃曾經遇到過在一台服務器上面,IIS部署了五六個站點。
其中一個站點,占用了 5、6G 的內存,然而服務器只有8G的內存,甚至胡時候會把其他一兩個站點的應用程序池逼停了。
想想就可怕,資源的隔離沒有做好,導致其他應用也受到了影響。
其實對IIS來說,還是可以對站點做限制的。
如何處理
應用程序池中,有兩個關於內存的配置:
- 虛擬內存限制(KB)
- 專用內存限制(KB)
虛擬內存限制指的是,工作進程可以使用的最大虛擬內存量,超過這個內存量就會導致應用程序池回收。默認值是0,表示不限制。
專用內存限制指的是,工作進程可以使用的最大專用內存量,超過這個內存量就會導致應用程序池回收。默認值是0,表示不限制。
正常來說,我們常說的,應用占用了多少內存其實說的就是這個專用內存。
我們打開的任務管理器,上面看到的內存,也是專用工作集。
所以針對這上面說的情況,我們只要限制這個程序池的專用內存限制即可。
好比說限制為100MB,就把專用內存限制填102400。
當應用的內存達到這個限制的時候,它會重新拉起一個進程,然后把老的進程kill掉。
可以通過事件查看器捕獲到對應的事件。
這樣就可以在一定程度上緩解多個應用之間互相影響。
當然最終的解決辦法還是要把內存泄露的bug處理掉。