使用MiniProfiler調試ASP.NET MVC網站性能


MVC MiniProfiler是Stack Overflow團隊設計的一款對ASP.NET MVC的性能分析的小程序。可以對一個頁面本身,及該頁面通過直接引用、Ajax、Iframe形式訪問的其它頁面進行監控,監控內容包括數據庫內容,並可以顯示數據庫訪問的SQL(支持EF、EF CodeFirst等 )。並且以很友好的方式展現在頁面上。

該Profiler的一個特別有用的功能是它與數據庫框架的集成。除了.NET原生的 DbConnection類,profiler還內置了對實體框架(Entity Framework)以及LINQ to SQL的支持。任何執行的Step都會包括當時查詢的次數和所花費的時間。為了檢測常見的錯誤,如N+1反模式,profiler將檢測僅有參數值存在差 異的多個查詢。

MiniProfiler是以Apache License V2.0協議發布的,你可以在NuGet找到。配置及使用可以看這里:http://code.google.com/p/mvc-mini-profiler

為建立快速的網站黃金參考標准,雅虎2007年為網站提高速度的13個簡易規則

mvcminiprofiler

Stack Overflow 用MVC Mini Profiler來促進開源,而在把每一頁的右上角服務器渲染時間的簡單行來迫使我們解決我們所有的性能衰退和遺漏。如果你在使用.NET開發應用,一定要使用上這個工具。

包括以下核心組件:

  • MiniProfiler
  • MiniProfiler.EntityFramework

如何安裝?

一、環境准備
  • Visual Studio 2010
  • ASP.NET MVC項目
  • 如果需要調試EF,建議升級到Entity Framework 4.2
二、安裝

推薦使用NuGet方式進行安裝,參考文章《使用 NuGet 管理項目庫

  • 第一步:在引用上右鍵選擇“Manage NuGet Packages”
    • 第二步:Online搜索miniprofiler

    image

    MiniProfiler、MiniProfiler.EF、MiniProfiler.MVC3,同時會自動安裝依賴組件:WebActivator, 同時也會自動在項目里面添加代碼文件:MiniProfiler.cs

    • 第三步:修改代碼使MiniProfiler生效

    在global.cs的Application_Start事件里面增加代碼: StackExchange.Profiling.MiniProfilerEF.Initialize();
    修改View的layout文件,在head區域增加如下代碼:@StackExchange.Profiling.MiniProfiler.RenderIncludes()

     

    如果安裝步驟一切順利的話,打開站點的時候,就可以在左上角看到頁面執行時間了,點開可以看到更詳細的信息,如果有SQL的話,還會顯示SQL語句信息,非常的方便。 頁面上如果有ajax請求,也會同時顯示到左上角。如果左上角顯示紅色提示,則表示可能存在性能問題需要處理:

    image

    點開SQL部分,可以看到詳細的SQL語句

    image

    標記為duplicate的部分,代表在一次請求當中,重復執行了查詢,可以優化。

    問題:

    1、在結合使用EF 4.3的時候發生如下錯誤:

    Invalid object name 'dbo.__MigrationHistory'.
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
       at System.Data.SqlClient.SqlDataReader.get_MetaData()
       at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
       at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
       at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
       at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
       at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
       at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
       at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
       at MvcMiniProfiler.Data.ProfiledDbCommand.ExecuteDbDataReader(CommandBehavior behavior) in \mvc-mini-profiler\MvcMiniProfiler\Data\ProfiledDbCommand.cs:line 155
       at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
       at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)

    需要在EF 4.3上關閉數據庫初始化策略:

    public class SettingContext : DbContext
    {
            static SettingContext()
            {
                Database.SetInitializer<SettingContext>(null);
            }


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM