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

一、. NET平台及现状

1、.NET

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

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


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

.Net架构模型图

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

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

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

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

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

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


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

上图是微软对.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之前,我们的 .NET Agent 会拦截并改写这些IL并注入探针,拦截方法执行,抓去程序运行堆栈,收集应用程序上下文数据(包括SQL等任何想要的数据)。

2、.NET Profiling Agent 的实现

透视宝 .NET Agent 由两部分组成:

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

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

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

(2)、探针

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


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

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

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

源程序:


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

编译后:


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

Instrumented IL:


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

三、安装及部署

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


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

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

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

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