2012-02-23 126 views
1

在ASP.NET MVC3應用程序中檢查內存使用情況的最佳方法是什麼?MVC3內存管理

我的託管服務提供商告訴我每隔一段時間就要循環IIS應用程序池以提高網站的速度。這是「推薦的做法」嗎?當然,我不應該每隔一段時間重新啓動我的應用程序?我寧願找出在我的應用程序中是否存在內存使用問題並進行更正。因此,您使用的任何提示&也是非常有用的。

該應用程序基於ASP.NET MVC3,C#和EF Code First。任何指導,鏈接表示讚賞。

編輯: 我發佈後發現這個頁面,這是非常有用的。但我仍然想聽聽其他意見。

ASP.NET MVC and EF Code First Memory Usage

謝謝

+0

非常有用,您找到的鏈接 – MikeSW 2012-02-23 08:04:52

回答

0

默認情況下,IIS會自動回收的應用程序池的間隔(我想在29個小時左右),但是這確實是由主機,設置再好一點或如何你正在使用的內存很多。回收觸發可以是一個時間間隔,也可以是進程達到某個內存使用限制的時間。我確定任何共享主機都設置了它們。

關於內存使用情況,您可以使用GC.GetTotalMemory方法,它會給你一個近似的用法。即使使用Perfmon,讀數也不是很準確,但它給了你一個想法。

//global.asax.cs 
void Application_EndRequest(object o,EventArgs a) 
{ 
    var ctype=Context.Response.Headers["Content-Type"]; 
    if (ctype == null || !ctype.Contains("text/html")) return; 
    Context.Response.Write(string.format("<p>Memory usage: {0}</p>",GC.GetTotalMemory(false))); 
} 

請注意,在GC啓動之前,您會看到使用量不斷增加,並且使用量將下降到更「真實」的值。

如果你有沒有錢,我建議一個專門的工具,如Memory profiler

其他的事情可以做,至少要準備,如果應用程序有內存或性能問題:

  • 的正確分層應用程序,意味着您可以重構更低效的部分而不影響其他部分。
  • Repository模式將非常有幫助,因爲您可以開始使用EF,找出EF使用多少內存(如在您找到的鏈接中),但是您可以切換存儲庫實現以使用PetaPoco或Dapper 。淨。
  • 一般來說,OR \ M更像是一個沉重的庫,如果應用程序不需要ORM功能,而只需要一個快速的方式來使用數據庫,就可以從頭開始使用上述的mico-Orm。
  • 始終處理實現IDisposable的對象。
  • 當處理大型db記錄時,使用分頁。這是很好的服務器資源的使用都和用戶體驗
  • 應用YAGNI(你是不是要去需要它)原則上儘可能,這在某種程度上意味着一點TDD :)
3

我有一個網站,從來沒有回收(直到機器每週重新啓動)

您的應用程序一般應保持良好狀態。如果沒有,就會有一些泄漏。 這可以發生,因爲

  1. 緩存永不過期
  2. 緩存永不過期
  3. 會話存儲持續增長和永遠不會超時
  4. ObjectContexts是從未配置並保持在所述會話等
  5. 對象應設置都不是經由依賴注入容器AR創建

  6. 對象不能在每次請求後發佈,因此可能會有不斷增長的內部集合。

還有更多的原因 - 但這些是一些主要的原因。

所以,真正的問題是「沒有最好的做法 - 這取決於你的應用程序」

如果你擔心重新啓動時,當前會話,牢記重新啓動即可快速當前請求被允許以完成(有時)並且形成認證令牌將在重新啓動後存活,但是除非您配置了進程外狀態服務器,否則會話不會。

如果你的內存使用量不斷增加,然後設置一個時間表重啓,否則做每週一次或從未 - 或設置一次記憶去XYZ然後復位。根據主機在memoryLimit上設置的內容,ASP.NET將自動重啓一次: http://msdn.microsoft.com/en-us/library/7w2sway1.aspx