1. 程式人生 > >采用MiniProfiler監控EF與.NET MVC項目(Entity Framework 延伸系列1)

采用MiniProfiler監控EF與.NET MVC項目(Entity Framework 延伸系列1)

ice tac cal 允許 sin oos 簡單 height hand

今天來說說EF與MVC項目的性能檢測和監控

首先,先介紹一下今天我們使用的工具吧.

MiniProfiler~

這個東西的介紹如下:

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個簡易規則。

以上這一段是照抄的張善友的博客,原文地址:http://www.cnblogs.com/shanyou/archive/2012/04/03/2430977.html

當然 國內百度也能百度出一大把的教程,但是教程都比較老與現在的新版本還是差距很大,而且博文中講的並不是很詳細,所以本屌就來詳細的講講吧..

本文采用的環境與技術

系統:WIN7

數據庫:SQL Server2008

相關技術:MVC5+EF6.1.3

第一章:開始監控

首先,明確一下本博文的目標,監控EF的Sql和執行時間,監控MVC頁面的執行時間

那麽我們開始.

第一步,從NuGet上下載所需要的包,下載內容如圖:

MiniProfiler核心(所有的MiniProfiler相關資源都需要先有他)

技術分享

這裏需要註意,新版本的MiniProfiler.EF是需要根據你的EF版本來下載的,分為MiniProfiler.EF6,MiniProfiler.EF5,MiniProfiler.EF(EF4以下)三個版本

根據你的EF版本自行下載對應的包.

技術分享

MiniProfiler.MVC4(註:這裏的MVC4是可以分析MVC4,5兩個版本的,使用MVC3的同學請自行下載MiniProfiler.MVC3)

技術分享

至此,我們所需要安裝的程序包就全部OK了,

下面我們開始監控:

首先,給你的Global.asax文件中加入:

技術分享
       protected void Application_BeginRequest()
        {
            if (Request.IsLocal)//這裏是允許本地訪問啟動監控,可不寫
            {
                MiniProfiler.Start();
               
            }
        }

        protected void Application_EndRequest()
        {
            MiniProfiler.Stop();
        }
技術分享

然後找到你需要監控的頁面,在頁面中加入:

@using StackExchange.Profiling;
@MiniProfiler.RenderIncludes();

當然,我們一般是想監控所有的頁,所以我推薦加在你的布局頁(_Layout)中,比如以下這種結構:

技術分享
<html>
<head>
    @using StackExchange.Profiling;
</head>
<body>
        @RenderBody()

    @MiniProfiler.RenderIncludes();
</body>
</html>
技術分享

然後在配置文件中加入(註意,這裏很重要):

技術分享
  <system.webServer>
      <handlers>
        <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
      </handlers>
  </system.webServer>
技術分享

這樣,我們的基礎監控就已經完成了,我們來看看效果.

技術分享

第二章:監控EF,並對某次操作進行針對性監控

首先我們在Global.asax文件中添加代碼如下:

技術分享
  protected void Application_Start()
        {
  ....
               
            StackExchange.Profiling.EntityFramework6.MiniProfilerEF6.Initialize();
          ....
        }
技術分享

因為這是一個簡單的demo,所以我們隨意找一個Controller,寫一些EF的查詢,代碼如下:

技術分享
 public class HomeController : Controller
    {
        public ActionResult Index()
        {
           
                using (StudentInfoEntities us = new StudentInfoEntities())
                {
                    ViewBag.data = us.LogData.Where(a => 1 == 1).ToList();
                }
            

            
            return View();
        }
}
技術分享

我們來看看效果.

技術分享

可以看出來,這次查詢用了56.2MS,占用整個頁面的加載時間71%的比例.,點擊藍色的56.2可以看到詳細的SQL語句,如下:

技術分享

這樣,我們就可以隨時監控到頁面中EF所使用的SQL語句並進行分析.

針對性監控(重要)

當然,這只是簡單的操作,我們在分析的過程中肯定會碰到詭異,或者後臺代碼更復雜的情況(比如一個頁面10個查詢),這個時候頁面上的監控就會很混亂,不方便讀,我們就需要進行針對性的監控.

我們把剛剛的代碼修改如下(這裏我們進行兩次查詢操作,用MiniProfiler進行分類):

技術分享
  public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var profiler = MiniProfiler.Current;
            using (profiler.Step("查詢數據LogData的數據"))
            {
                using (StudentInfoEntities us = new StudentInfoEntities())
                {
                    ViewBag.data = us.LogData.Where(a => 1 == 1).ToList();
                }
            }

            using (profiler.Step("查詢數據LogOperate的數據"))
            {
                using (StudentInfoEntities us = new StudentInfoEntities())
                {
                    ViewBag.data = us.LogOperate.Where(a => 1 == 1).ToList();
                }
            }
            return View();
        }
}
技術分享

得到監控效果如下:

技術分享技術分享

這樣,我們就可以根據我們的需要來詳細的跟蹤某一次EF操作的結果了.

第三章:監控的權限(給管理員分配監控的權限)

在實際的項目開發中,我們不可能對所有的用戶全部開放監控的權限,所以我們要對他進行顯示的控制.

在MiniProfiler中,提供了兩個委托,如下:

MiniProfiler.Settings.Results_Authorize //配置監控的權限

MiniProfiler.Settings.Results_List_Authorize //配置歷史信息監控的權限(在~/mini-profiler-resources/results-index中可以查看最近100次的請求分析)

這裏我們簡單的做一下權限控制,

我們在Global.asax文件中添加代碼如下:

技術分享
  protected void Application_Start()
        {
        ....
            MiniProfiler.Settings.Results_Authorize = Request =>
            {
                string name = Request.Cookies["name"] == null ? "" : Request.Cookies["name"].Value;
                if (name.Equals("admin"))
                    return true;
                else
                    return false;
            };
               
            StackExchange.Profiling.EntityFramework6.MiniProfilerEF6.Initialize();

        }
技術分享

這樣就只有cookie的name屬性為admin的用戶才能有監控顯示了

效果如下(我們可以看到,當cookie中的name等於admin的時候才會有監控的顯示):

技術分享技術分享

寫在最後

至此,文章就全部結束了,歡迎各位大神拍磚.

采用MiniProfiler監控EF與.NET MVC項目(Entity Framework 延伸系列1)