背景

NanoProfiler是一个EF Learning Labs出品的免费性能监控类库(即将开源)。它的思想和使用方式类似于MiniProfiler的。但是,设计理念有较大差异。

MiniProfiler更像是一个面向开发和测试环境的性能监控类库,它的关注点(我说的不一定对,仅代表一家之言),更多的是提供了对微软的ASP.NET MVC,EntityFramework,WCF等主流前后端类库的封装和整合,如果你的项目恰巧从前端到后端都用到这些类库,它可以将从前端到后端的性能监控数据合并到一个视图里,还是挺方便的。它的主要问题是:

  • 运行时性能,尤其是并发环境下性能较差,占用的资源较多
  • 不能很好的支持多线程和异步代码的性能监控(事实上,MiniProfiler的核心类都不是线程安全的,只能通过粗暴的全局加锁来实现部分的多线程和异步线程支持,性能也就可想而知了)

NanoProfiler项目的起源(大约半年前),最初,其实只是希望向MiniProfiler贡献代码,弥补以上的缺点,主要是内存数据结构的变化能够带来的性能的优化,和对多线程和异步编程模型的支持。不过,很可惜,在提交给他们我们关于如何改进的代码示例,甚至是直接的Pull Request之后,后续的沟通中(不想背地里谈他们团队的技术水平),只能说,也许是他们的设计理念和关注点,并不在此吧。

所以,首先,上面提到的MiniProfiler的缺点,正是NanoProfiler的优点:

  • NanoProfiler实现了对多线程代码和异步代码,包括基于PLINQ,Parallel库在内的各种异步代码的完美支持
  • 性能方面,由于内部实现不需要像MiniProfiler那样,对每个请求,在内存中维护一个树形结构的数据结构,而用一个无锁的队列存储每一步性能监控的原始数据,因此,性能上几乎对被监控应用没有影响

另一方面,相对于MiniProfiler仅仅满足于实现一个用于开发环境的类似Fiddler的代码性能视图。NanoProfiler,首先,当然,也支持类似的功能,并且提供了更强大和直观的查看性能数据的UI;同时,我们的设计理念,更偏向大数据和生产环境。说到底,我们认为,只对于开发环境的话,前端也好后端也好,我们有太多可替代的性能监控工具;将性能监控集成到代码里,真正的优势,应该是生产环境的大数据。所以,我们希望,不仅仅能监控单个请求的性能瓶颈,也能基于大数据,分析整个应用,应用和应用之间,服务器,甚至集群和集群之间的宏观性能瓶颈。

举例来说,如果说MiniProifiler的监控视图对于一个页面请求,就像是Fiddler对于一个页面上所有资源和AJAX请求序列的性能描述;那么,NanoProfiler,除此之外,结合其他大数据分析工具,既能分析生产环境所有页面产生的Fiddler请求数据,从而知道哪些资源的整体的访问频率和消耗最高,从而能够找到应用,服务器,甚至集群上整体的性能瓶颈;还能,跨应用,跨服务器和集群,分析微观(如单个请求,或单个用户的相关请求)或者宏观的各种性能指标。

安装

http://nuget.org/packages?q=NanoProfiler

目前,已经上传到nuget.orgd的至少有以下5个package:

  • NanoProfiler - 核心库,可单独用于非Web应用,没有DB性能监控支持
  • NanoProfiler.Data - DB性能监控支持
  • NanoProfiler.Web - Web项目支持
  • NanoProfiler.Unity - 基于Unity IoC的AOP式监控扩展
  • NanoProfiler.Wcf - WCF监控支持

如何使用?

对一个典型的Web项目,首先,我们需要在Global.asax.cs的BeginRequest和EndRequest事件处理,添加下面的代码:

接下来,就可以在代码里添加类似下面的代码(类似MiniProfiler,不过MiniProfiler可不支持async),监控制定代码块的执行性能:

执行包含这段代码的请求,然后访问当前应用下的 ~/nanoprofiler/view 页面, 应该能看到类似Fiddler视图的,刚才访问的请求的每一步的执行性能。

如果你想设置一些全局参数,比如,过滤某些请求,可以这样:

DB性能监控

DB性能监控的使用方式和MiniProfiler也比较类似,简单地说,只需要用NanoProfiler提供的ProfiledConnection或者ProfiledDbCommand这样的类,包装原有的DbConnection和DbCommand对象。例如,假设你有下面这样一个DataService:

我们只需要,用ProfiledDbConnection包装,这个SqlConnection实例:

查看实时性能监控数据

前面说过,默认情况下,访问~/nanoprofiler/view 就能查看最近的请求的性能监控数据。下面是某个请求的性能视图示例,红色是DB请求,绿色是WCF请求,蓝色是其他代码步骤:

如果显示有问题,比如报treeview-timeline.css 404错误,请确保Web.config包含runAllManagedModulesForAllRequests="true":

  <system.webServer>
<modules runAllManagedModulesForAllRequests="true">
</modules>
</system.webServer>

如果,想做一些参数定制,可以在application_start事件处理里,通过下面的代码设置:

ProfilingSession.ProfilingStorage = new CircularBufferedProfilingStorage(100, profiler => false, new JsonProfilingStorage());

默认的查看监控数据的功能是基于CircularBufferedProfilingStorage实现的,它有三个可选参数:

  • 第一个参数代表,最多在内存保留多少个最近的请求的监控数据
  • 第二个参数是一个Func<IProfiler, bool> delegate,可以指定一个方法,过滤不想显示的监控结果,比如,只保留请求处理时间大于100ms的数据
  • 第三个参数指定一个真正持久化监控数据的provider,比如,默认的JsonProfilingStorage将监控数据,通过任意支持slf4net的类库(比如log4net),持久化到文件系统或者DB

WCF监控

WCF性能监控主要通过WcfProfilingBehavior这个类,他是一个标准的WCF EndpointBehavior实现,只要通过代码或者XML配置,将它配到指定的service就行,比如,是一个XML配置的示例:

<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IWcfDemoService" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:64511/WcfDemoService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWcfDemoService"
contract="DemoService.IWcfDemoService" name="BasicHttpBinding_IWcfDemoService" />
</client>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior>
<tinyprofiler />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<extensions>
<behaviorExtensions>
<add name="tinyprofiler" type="EF.Diagnostics.Profiling.ServiceModel.Configuration.WcfProfilingBehaviorElement, NanoProfiler.Wcf"/>
</behaviorExtensions>
</extensions>
</system.serviceModel>

基于Unity AOP的性能监控

Unity扩展,主要提供两种基于Unity AOP的支持。

第一种,通过ContainerExtension。例如:

上面的代码,将自动监控所有注册到Unity容器的接口名称带DemoDBService的service的每个方法调用的性能。

第二种,通过Unity的policy injection。简单地说,可以通过Attribute标注的方式,自动监控方法的执行性能:

要开启,Unity的policy injection支持,需要在Global.asax.cs,添加下面这样的初始化代码:

NanoProfiler的基本功能先讲到这儿,下期预告:NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇

BTW, 发句牢骚,博客园这个Markdown解析器太烂,对于插入代码翻译成的HTML很糟糕,所以只能全都插图片了。

NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇的更多相关文章

  1. NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...

  2. NanoProfiler - 适合生产环境的性能监控类库 之 实践ELK篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇 上次介绍了NanoProfiler的大数据分析理念,一晃已经时隔一年多了,真是罪过! 有朋友问到何时开源的问题 ...

  3. Java生产环境下性能监控与调优详解视频教程 百度云 网盘

    集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...

  4. Java生产环境下性能监控与调优详解

    1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...

  5. Android 性能监控系列一(原理篇)

    欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 一. 前言 性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿.响应速度慢.发热严重.流量电 ...

  6. 性能利器 Takin 来了!首个生产环境全链路压测平台正式开源

    6 月 25 日,国内知名的系统高可用专家数列科技宣布开源旗下核心产品能力,对外开放生产全链路压测平台产品的源代码,并正式命名为 Takin. 目前中国人寿.顺丰科技.希音.中通快递.中国移动.永辉超 ...

  7. Linux系统和性能监控之CPU篇

    Linux系统和性能监控之CPU篇 性能优化就是找到系统处理中的瓶颈以及去除这些的过程.本文由sanotes.net站长tonnyom在2009年8月翻译自Linux System and Perfo ...

  8. 生产环境全链路压测平台 Takin

    什么是Takin? Takin是基于Java的开源系统,可以在无业务代码侵入的情况下,嵌入到各个应用程序节点,实现生产环境的全链路性能测试,适用于复杂的微服务架构系统. Takin核心原理图 Taki ...

  9. Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署

    一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...

随机推荐

  1. 转载:java 中对类中的属性使用set/get方法的意义和用法

    经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...

  2. jquery修改table某列的值

    开发的过程中,我们经常会遇到一些数和值之间的转换,比如本例:学部:1.小学,2.初中,3.高中;当然实现方法很多种,可以后台代码,也可以使用脚本... 修改前: 修改后: 代码: $("#t ...

  3. easyui tree onloadsuccess事件的心得

    在onloadSuccess事件中不能apeed新节点,否则又会触发noloadsuccess事件,形成死循环. 公司电话:028-87657875           13060063607 淘宝店 ...

  4. Python 第五天 模块(2)

    模块,用一砣代码实现了某个功能的代码集合. 有两种存在的方式 1.写到一个文件夹里面 2.py文件 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和 ...

  5. XAMARIN +VS2015 ANDROID 开发禁止屏幕自动转动 Portrait,Nosensor

    网上有很多java的写法,但是放在C#中都无法使用,其实有时候还是安下心来认真的去看官网文档比在百度或者google来的快的多 this.RequestedOrientation = Android. ...

  6. iOS 状态栏设置

    1. 软件启动瞬间即弹出启动图的时候隐藏状态栏的方法 修改<YOUR_APP>-Info.plist,在Xcode中修改,在根结点Iinfo下面新加一项“Status bar is ini ...

  7. mysql下载安装

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/ 根据电脑配置来选,我选了 windows(x86,64-bit),ZIP Archive这个,点击Dow ...

  8. BNUOJ 51279[组队活动 Large](cdq分治+FFT)

    传送门 大意:ACM校队一共有n名队员,从1到n标号,现在n名队员要组成若干支队伍,每支队伍至多有m名队员,求一共有多少种不同的组队方案.两个组队方案被视为不同的,当且仅当存在至少一名队员在两种方案中 ...

  9. 8.4.4 Picasso

    Picasso 收到加载及显示图片的任务,创建 Request 并将它交给 Dispatcher,Dispatcher 分发任务到具体 RequestHandler,任务通过 MemoryCache ...

  10. 润乾报表之制作List列表

    一般情况洗啊,如果sql查到多条数据,使用表格扩展的方式在一张表格里面(横展.纵展):目前的需求是,以报表为单位,做成List.例如,如果查出3条数据,预览的时候,要有3张格式相同内容有异的报表.如图 ...