MiniProfiler性能监控分析工具在.NET项目中的使用

MiniProfiler是一款针对.NET, Ruby, Go and Node.js 的性能分析的轻量级程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe 形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的 SQL(支持 EF、EF CodeFirst 等 )。并且以很友好的方式展现在页面上。

MiniProfiler官网:http://miniprofiler.com/

MiniProfiler的一个特别有用的功能是它与数据库框架的集成。除了.NET 原生的 DbConnection 类,MiniProfiler还内置了对实体框架(Entity Framework)以及 LINQ to SQL、RavenDb 和 MongoDB 的支持。任何执行的 Step 都会包括当时查询的次数和所花费的时间。为了检测常见的错误,如 N+1 反模式,profiler 将检测仅有参数值存在差异的多个查询。

MiniProfiler是以 Apache License V2.0 协议发布的,你可以在 NuGet 找到。

过去一直使用 Sqlserver Profiler,但是发现实在是太痛苦了,你不得不进行新建、过滤、清除、关闭等操作,而且过滤筛选往往比较难以控制。后来发现MiniProfiler工具非常好用。

同类监控工具有 NanoProfiler,下载地址:https://github.com/ef-labs/nanoprofiler/issues/1

Demo 开发环境

  • Win10
  • VS2013

准备工作

新建 MVC 项目 WebAppEF,使用 Northwind 数据库。

1、先安装 MiniProfiler

MiniProfiler 性能监控分析工具在.NET 项目中的使用

2、安装 MiniProfiler.MVC4

MiniProfiler 性能监控分析工具在.NET 项目中的使用

3、安装 MiniProfiler.EF

MiniProfiler 性能监控分析工具在.NET 项目中的使用

4、修改 Global.asax 文件

我这里只需要在开发环境使用 SQL 性能监控,所以使用了#if DEBUG,因为生产环境,我们一般是采用 release 模式。同时,MiniProfiler 还支持授权,这里不做介绍。

using StackExchange.Profiling;
using StackExchange.Profiling.EntityFramework6;
using System;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace WebAppEF
{
    publicclassMvcApplication: System.Web.HttpApplication
    {
        protectedvoid Application_Start()
        {#
            if DEBUG
            MiniProfilerEF6.Initialize();#
            endif
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
        protectedvoid Application_BeginRequest(Object source, EventArgs e)
        {#
            if DEBUG
            MiniProfiler.Start();#
            endif
        }
        protectedvoid Application_EndRequest()
        {#
            if DEBUG
            MiniProfiler.Stop();#
            endif
        }
    }
}

5、修改布局页(_Layout)

在你的布局页(_Layout)中,比如以下这种结构,修改 _Layout.cshtml
@using StackExchange.Profiling;
<head>
 ..
</head>
<body>
  ...
  @MiniProfiler.RenderIncludes()
</body>

6、修改配置文件 Web.config

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

MiniProfiler 性能监控分析工具在.NET 项目中的使用

7、添加控制器测试代码

public ActionResult Index()
{
    // create the entity object 
    using(NorthwindEntities mobjentity = new NorthwindEntities())
    {
        ViewBag.SelectCustomer = mobjentity.Customers.Select(x => x.City == "Delhi").ToList();
    }
    var profiler = MiniProfiler.Current;
    using(profiler.Step("查询 Customers 的数据"))
    {
        using(NorthwindEntities entity = new NorthwindEntities())
        {
            ViewBag.data = entity.Customers.ToList();
        }
    }
    return View();
}

8、按 F5 调试运行

MiniProfiler 性能监控分析工具在.NET 项目中的使用MiniProfiler 性能监控分析工具在.NET 项目中的使用MiniProfiler 性能监控分析工具在.NET 项目中的使用

说明:标记为 duplicate 的部分,代表在一次请求当中,重复执行了查询,可以进行优化。通过 Step 可以对独立的 sql 块进行标记。

常见错误

1、The Entity Framework was already using a DbConfiguration instance before an attempt was made to add an ‘Loaded’ event handler. ‘Loaded’ event handlers can only be added as part of application start up before the Entity Framework is used. See http://go.microsoft.com/fwlink/?LinkId=260883 for more information.

MiniProfiler 性能监控分析工具在.NET 项目中的使用

分析:错误提示的大意是在试图为 DbConfiguration 实例加 Loaded 事件之前已经在其它地方使用了这个实例了

解决方案:把 MiniProfiler.EF6.Initialize()在放在 Database.SetInitializer<WebAppEF.Models.NorthwindEntities>(null); 之前。

2、Could not load file or assembly ‘MiniProfiler, Version=3.0.11.0, Culture=neutral, PublicKeyToken=b44f9351044011a3’ or one of its dependencies. The located assembly’s manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

MiniProfiler 性能监控分析工具在.NET 项目中的使用

分析:找不到 MiniProfiler 程序集或者它的依赖项。程序集定义和引用不匹配。

解决方案:查看 Web.config 中是否存在如下配置节点

<dependentAssembly>
    <assemblyIdentityname="MiniProfiler" publicKeyToken="b44f9351044011a3" culture="neutral" />
    <bindingRedirectoldVersion="0.0.0.0-3.2.0.157" newVersion="3.2.0.157" /> 
</dependentAssembly>

 

如果不存在则添加,如果存在,则检查 MiniProfiler 版本号和 packages.config 中的版本号是否一致,如果不一致就要对版本号进行修改。


来源:https://www.cnblogs.com/nepulgh/p/10766235.html

© 版权声明

☆ END ☆
喜欢就点个赞吧
点赞20 分享
图片正在生成中,请稍后...