当前位置:首页 > 技术知识 > 正文内容

云智慧透视宝.NET代码性能监控实现原理

maynowei7个月前 (09-23)技术知识96

一、.NET平台及现状

1、.NET

.NET框架是一个多语言组件开发和执行环境,它提供了一个跨语言的统一编程环境,多语言包括:C#、VB、C++(CLI)、J#等。

.NET为创建HTML页面提供了一种编程模型,称为ASP.NET,在ASP.NET的编程模型里也有多种编程模型:如MVC、WebAPI、WebForm等。

.Net架构模型图

这张图基本描述了.NET的平台架构。

2、平台及开源(不得不说的痛)

基于.NET2015之前版本编写的应用程序只能运行在Windows 平台上,如果想移值到Linux上则只能依赖开源框架(Mono)且需要重新编译。

而按照微软在2015年Build大会上发布的.NET开发路线图,在5.0 及之后版本基于.NETCore 编写的应用程序将可以直接实现跨平台部署和运行,不再需要重新编译。

5.0的正式版本会在2016春季正式发布,目前已经发布到Beta 7(2015年9月2日发布),这个版本的重要意义在于它第一次实现了.NET程序不依赖于Mono即可在Mac和Linux上运行。

微软已将.NET平台下除Form之外的Core开源(在JAVA开源8年后,微软终于迈出了艰难的一步,但要走的路还很长)

上图是微软对.NET平台的全新构建。

3、基本概念

CLR(Common Language Runtime,通用语言运行时)

和Java虚拟机一样它是.NET应用程序的运行时环境,它负责程序的资源管理(内存分配和垃圾收集等等),并保证应用和底层操作系统之间必要的分离。

MSIL(Microsoft Intermediate Language,微软中间语言)

IL是微软.NET平台上衍生出来的一门中间语言,.NET平台上各种高级语言(如C#,VB,F#)的编译器会将各自的文字表述方式转化为IL。各种不同的文字形式最终被统一到了IL的表述方式,包含了.NET平台上的各种元素,如“范型”,“类”、、“接口”、“模块”、“属性”等等。

JIT(Just In Time,即时编译)

使用高级语言编写的应用被编译为IL后,JIT编译器会将IL编译为本地指令并执行,从而最大限度的实现了平台无关性。

.NET平台框架具备天然的跨平台优势,但微软却把它打造成了windows平台独享的版本,还好的是他现在迈出了开源和跨平台的第一步。

二、透视宝之.NET应用性能监控实现及原理

1、基本原理

.NET 应用程序编译后会被编译为IL,它们通常会被打包为后缀名为“.dll”的文件,即动态链接库,这些文件里包含了应用程序元数据、IL及程序链接信息等,JIT负责编译这些DLL中的IL语言,将它们转换成机器可执行的机器码。

在JIT第一次编译IL之前,我们的 .NETAgent 会拦截并改写这些IL并注入探针,拦截方法执行,抓去程序运行堆栈,收集应用程序上下文数据(包括SQL等任何想要的数据)。

2、.NET ProfilingAgent 的实现

透视宝 .NETAgent 由两部分组成:

(1)、探针注入核心组件

它是一个使用 C++ 语言编写的组件。理论上可以附加到任何想要拦截的.NET应用运行时环境里(包括ASP.NET、.NET桌面应用程序及Service、甚至 Windows Phone 的移动应用里),它负责IL改写且只会在任何方法被JIT前执行一次,一旦执行完成,将不会再执行。

探针注入核心组件要求高效、稳定、安全,因为任何对IL的改写出错和操作失误,都会导致整个应用程序崩溃。

(2)、探针

探针是一组方法,主要完成上下文数据收集,包括堆栈、SQL、API等透视宝关注的数据。

这是.NET ProfilingAgent 实现的原理图,图中绿色的部分即为.NET ProfilingAgent存在的两个层面。

(3)、举例(我们依然从不变的Hello world! 程序开始)

源程序:

编译后:

Instrumented IL:

三、安装及部署

透视宝.NET ProfilingAgent 遵循Smart Agent组件的标准开发规范,配置和安装也非常简单,只需要执行一个.bat文件即可,且不受应用及机器重启的影响,只要安装后它便会一直存在。

这是.NETAgent的安装生命周期流程图,图中深蓝色的部分是需要手动干预的部分,其它都自动完成。

以上是云智慧透视宝.NET代码监控的实现原理和部署方法,除此之外透视宝还支持PHP、Java、Python等主流Web语言的监控,在单次请求追踪中提供针对代码执行情况的详细追踪,包括:查看执行最慢的10个元素,包括元素执行次数、持续时长和占用时长百分比;查看HTTP请求参数,包括请求的响应状态、链接页面、具体的请求参数及返回结果;查看代码执行堆栈的详细树状信息,包括每个方法的计算时间、总耗时和被调用的次数,您能直接看到特殊标识的最慢方法;查看涉及SQL语句的总耗时排序,包括SQL执行总耗时、执行次数和具体的查询语句等。

目前透视宝APM的标准版功能永久免费,企业版提供30天免费试用,有需要的开发者和运维同学可以访问透视宝官网:http://toushibao.com/ ,申请注册。

相关文章

去哪儿暑期PM实习一月记:在互联网公司做产品实习是怎样一种体验

人人都是产品经理旗下【起点学院】推出产品经理“365天”成长计划,BAT大牛带你学产品! 在毕业前的最后一个暑假,缘分使然找了几个月暑期实习之后进入了去哪儿,申请提前入职工作至今正好满一个月。原先有在...

Objective-C :Category(category什么意思)

Category 引入在日常的开发中,可能会碰到这样的需求:给某个类增加方法。比如说,需要给NSString类增加一个打印的方法。当然,我们可以新建一个类比如TestString,并继承NSStrin...

Android监听滚动视图(监听页面滚动)

Android UI Libs之Android-ObservableScrollView1. 说明Android-ObservableScrollView,顾名思义,Android上观察滚动的视图,可...

C++11 同步机制:互斥锁和条件变量

前段时间,我研究了 ROS2(Jazzy)机器人开发系统,并将官网中比较重要的教程和概念,按照自己的学习顺序翻译成了中文,进行了整理和记录。到目前为止,已经整理了20多篇文章。如果你想回顾之前的内容,...

Linux系统编程:条件变量为什么要用锁

条件变量可以解决线程同步和共享资源访问的问题,条件变量是对互斥锁的补充,它允许一个线程阻塞并等待另一个线程发送的信号,当收到信号时,阻塞的线程被唤醒并试图锁定与之相关的互斥锁。具体定义如下:等待:in...

本地配置plsql远程连接oracle数据库

由于Oracle的庞大,有时候我们需要在只安装Oracle客户端如plsql、toad等的情况下去连接远程数据库,可是没有安装Oracle就没有一切的配置文件去支持。最后终于发现一个很有效的方法,O...