• 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)


    前言

    Entity Framework 延伸系列目录

    今天来说说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的时候才会有监控的显示):

    写在最后

    至此,文章就全部结束了,欢迎各位大神拍砖.

  • 相关阅读:
    Spring的事务 之 9.4 声明式事务 ——跟我学spring3
    我对AOP的理解
    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。
    我对IoC/DI的理解
    Spring对事务管理的支持的发展历程(基础篇)
    Tomcat一个BUG造成CLOSE_WAIT
    用dubbo时遇到的一个序列化的坑
    只写完功能代码仅仅只是开始
    事物隔离级别和乐观锁
    关于ubuntu实机与虚机互相copy
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/5408632.html
Copyright © 2020-2023  润新知