采用MiniProfiler監控EF與.NET MVC項目(Entity Framework 延伸系列1)
今天來說說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)