一种分析ASP.NET应用软件性能及故障的诊断方法与流程

文档序号:14554608阅读:126来源:国知局

本发明涉及应用性能管理领域,具体为一种分析asp.net应用软件性能及故障的诊断方法。



背景技术:

asp.net语言是微软公司开发的服务器端运行脚本平台,用来构建动态web服务网页,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具,基于它所开发的网站主要由windows下internetinformationservices(iis)程序所管理,intermediatelanguage(il)是微软中间语言,asp.net源代码通过编译转为il代码,il主要包含一些元数据和中间语言指令;网站运行时,jit编译器再把il代码转为可以本地执行的机器代码,微软底层jit编译器提供了il代码转为本地代码的转换事件接口,利用此接口可以修改对应的il代码,从而达到改写il功能的目的,为了监控服务器应用的性能及错误信息,发展出了几类性能监测工具:一类是主动拨测工具,此类工具从服务器外部发起、模拟用户发起网络请求,通过追踪http的请求过程来监控应用的性能、网络信息和故障,此类工具的主要缺点是采样数量少,且仅能记录应用的总响应性能和故障信息,无法更深入的追踪到代码级别,出现服务器应用性能问题时无法定位具体原因;另外一类是日志分析类工具,通过分析系统产生的或应用产生的各类日志来监控应用性能及故障,其中包括研发人员在代码中主动记录的业务日志,此类工具的主要缺点是严重依赖日志格式及内容,无法分析没有被记录为日志的代码行为,且需要研发人员主动记录业务日志。



技术实现要素:

(一)解决的技术问题

针对现有技术的不足,本发明提供了一种分析asp.net应用软件性能及故障的诊断方法,解决了现有的技术在实施时需要开发人员介入,出现bug容易对原有的系统造成影响,并且解决故障后无法提供直观数据的问题。

(二)技术方案

为实现以上目的,本发明通过以下技术方案予以实现:一种分析asp.net应用软件性能及故障的诊断方法,其特征在于:包括以下步骤

(1)、asp.net应用程序启动时通过环境变量加载il代码改写模块;

(2)、asp.net应用程序动态编译il代码时,触发il代码改写功能,加载监控功能模块息进行异步处理;

(3)、在处理http请求的过程中,采集代码段的执行过程和错误信息;

(4)、创建独立的线程,对采集的性能信息和错误信息进行异步处理。

优选的,利用il代码改写机制自动在代码段插入具有监控功能的il代码。

采用以下模块,

改写模块:用于改写特定的程序,并在触发改写程序后加载监控模块实现检测功能;

监控模块:用于监控软件的异常状况,便于记录异常程序段;

记录模块:用于将触发监控模块的采集数据库、中间件、网络io、用户自定义的方法的执行过程和错误信息采集;

分析模块:用于创建独立的线程,对采集的性能信息和错误信息进行异步处理。

优选的,所述代码段包括数据库、中间件、网络io或用户自定义的方法。

优选的,所述一种分析asp.net应用软件性能及故障的诊断方法,其特征在于:所述改写模块的实现包括如下具体步骤,

(1)、在动态编译il代码事件jitcompilationstarted中获取代码对应的程序集名称、命名空间以及方法名称;

(2)、根据不同的程序集名称、命名空间以及方法名称,在配置文件内匹配相应的监控代码入口、监控代码出口和监控代码异常方法;

(3)、如果可以获取监控代码入口方法,则对原有il代码进行改写。

优选的,所述监控模块的实现包括以下步骤:

(1)、当http请求开始时,记录当前http请求的url及其参数;

(2)、在监控代码入口记录代码开始时间,获取当前线程对应的http请求,并根据代码名称对代码功能进行分类为数据库、中间件、网络io或用户自定义的方法。

(3)、在监控代码出口记录代码结束时间,并计算代码执行时间,将性能超过阈值的代码及其堆栈记录到当前线程对应的http请求。

优选的,所述改写模块如果不能获取监控代码入口方法,则不需要改写,直接忽略。

优选的,所述改写模块的改写规则为在原有代码前插入监控入口代码,在原有代码后插入监控出口代码,并且将监控入口代码、原有代码、监控出口代码均用try…catch进行包裹,在异常处理内插入监控代码异常逻辑。

优选的,所述监控模块在监控代码异常处记录错误信息,并将信息存储到当前线程对应的http请求。

优选的,所述监控模块当http请求结束时,将当前http请求记录的性能数据和响应状态码添加到异步队列。

(三)有益效果

本发明提供了一种分析asp.net应用软件性能及故障的诊断方法。具备以下有益效果:

(1)、该分析asp.net应用软件性能及故障的诊断方法,通过asp.net应用程序动态编译il代码时,触发il代码改写功能,加载监控功能模块息进行异步处理,无需开发人员的介入,减少了实施难度。

(2)、该分析asp.net应用软件性能及故障的诊断方法,通过改写模块如果可以获取监控代码入口方法,则对原有il代码进行改写,如果不能获取监控代码入口方法,则不需要改写,直接忽略,改写规则简单易用,并且拦截了异常,即使出现bug,对原有系统也不会造成影响。

(3)、该分析asp.net应用软件性能及故障的诊断方法,通过在处理http请求的过程中,采集代码段的执行过程和错误信息,通过归类的应用组件和应用错误处理,提高了数据直观性。

附图说明

图1为本发明模块构架图。

具体实施方式

下面将结合一个本发明的具体实例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参阅图1,本发明提供一种技术方案:

一种分析asp.net应用软件性能及故障的诊断方法,其特征在于:包括以下步骤

(1)、asp.net应用程序启动时通过环境变量加载il代码改写模块;

(2)、asp.net应用程序动态编译il代码时,触发il代码改写功能,加载监控功能模块息进行异步处理;

(3)、在处理http请求的过程中,采集代码段的执行过程和错误信息;

(4)、创建独立的线程,对采集的性能信息和错误信息进行异步处理。

优选的,利用il代码改写机制自动在代码段插入具有监控功能的il代码。

采用以下模块,

改写模块:用于改写特定的程序,并在触发改写程序后加载监控模块实现检测功能;

监控模块:用于监控软件的异常状况,便于记录异常程序段;

记录模块:用于将触发监控模块的采集数据库、中间件、网络io、用户自定义的方法的执行过程和错误信息采集;

分析模块:用于创建独立的线程,对采集的性能信息和错误信息进行异步处理。

优选的,所述代码段包括数据库、中间件、网络io或用户自定义的方法。

优选的,改写模块的实现包括如下具体步骤,

(1)、在动态编译il代码事件jitcompilationstarted中获取代码对应的程序集名称、命名空间以及方法名称;

(2)、根据不同的程序集名称、命名空间以及方法名称,在配置文件内匹配相应的监控代码入口、监控代码出口和监控代码异常方法;

(3)、如果可以获取监控代码入口方法,则对原有il代码进行改写。

假设原有的il代码如下:

改写后的il代码如下:

优选的,所述监控模块的实现包括以下步骤:

(1)、当http请求开始时,记录当前http请求的url及其参数;

(2)、在监控代码入口记录代码开始时间,获取当前线程对应的http请求,并根据代码名称对代码功能进行分类为数据库、中间件、网络io或用户自定义的方法。

(3)、在监控代码出口记录代码结束时间,并计算代码执行时间,将性能超过阈值的代码及其堆栈记录到当前线程对应的http请求。

改写模块如果不能获取监控代码入口方法,则不需要改写,直接忽略。

改写模块的改写规则为在原有代码前插入监控入口代码,在原有代码后插入监控出口代码,并且将监控入口代码、原有代码、监控出口代码均用try…catch进行包裹,在异常处理内插入监控代码异常逻辑。

监控模块在监控代码异常处记录错误信息,并将信息存储到当前线程对应的http请求。

监控模块当http请求结束时,将当前http请求记录的性能数据和响应状态码添加到异步队列。

本发明提供了一种直观的分析asp.net应用性能和故障的诊断方法,下面将结合一个本发明的具体实例作进一步的详细描述。

(1)asp.net应用程序启动时通过环境变量加载il代码改写模块。

利用配置界面工具设置环境变量,将cor_profiler设置为il代码改写功能模块的路径,将cor_enable_profiling设置为1。asp.net应用的宿主进程为w3wp进程,当w3wp进程启动时,会读取上述2个环境变量,并加载il代码改写功能模块。

(2)asp.net应用程序动态编译il代码时,触发il代码改写功能,加载监控功能模块。

(2.1)在动态编译il代码事件jitcompilationstarted中获取代码对应的程序集名称、命名空间以及方法名称。

il代码动态编译jitcompilationstarted事件包含参数functionid,functionid指明了所编译的函数id,再利用icorprofilerinfo2接口的getmoduleinfo、getassemblyinfo、getmethodprops等函数获取函数id对应的程序集名称、命名空间以及方法名称。

(2.2)根据不同的程序集名称、命名空间以及方法名称,在配置文件内匹配相应的监控代码入口、监控代码出口和监控代码异常方法。

本实例使用json格式的配置文件,配置文件内容为监控功能模块的方法以及对应的目标程序集名称、命名空间以及方法名称,匹配模式支持程序集名称、命名空间以及方法名称的模糊匹配,*代表模糊匹配。

配置文件内容片段如下:

(2.3)如果不能获取监控代码入口方法,则不需要改写,直接忽略;如果可以获取监控代码入口方法,则对原有il代码进行改写。

对于步骤(2.2)中配置文件指定需要监控的system.web.httpapplication::initmodulescommon方法代码如下:

改写后的il代码如下:

(3)在处理http请求的过程中,采集数据库、中间件、网络io、用户自定义方法的执行过程和错误信息。

(3.1)当http请求开始时,记录当前http请求的url及其参数。

通过映射system.web.httpapplication::initmodulescommon函数创建一个httpmodule,并监听httpapplication的beginrequest事件,在beginrequest事件中记录httpcontext的url及其request参数。

(3.2)在监控代码入口记录代码开始时间,获取当前线程对应的http请求,并根据代码名称对代码功能进行分类为数据库、中间件、网络io等。

通过目标程序集名称、命名空间以及方法名称映射到不同的监控功能模块,将代码功能分类为数据库、中间件、网络io等。

(3.3)在监控代码出口记录代码结束时间,并计算代码执行时间,将性能超过阈值的代码及其堆栈记录到当前线程对应的http请求。

用户代码执行完毕后,记录代码返回时间,并且计算此段代码的总执行时间,如果代码执行时间大于等于阈值,则记录此段代码执行堆栈。

通过目标程序集名称、命名空间以及方法名称映射到不同的监控功能模块,如果当前代码对应相应组件,则累计当前请求的外部组件及其操作性能。在此实例中,组件分为sql、redis、memcached、mongodb等,sql组件下分类为select、insert、update、delete操作,redis组件下分类为get、set、sort操作。

(3.4)在监控代码异常处记录错误信息,并将信息存储到当前线程对应的http请求。

通过步骤(3.1)映射system.web.httpapplication::initmodulescommon函数创建的httpmodule,监听httpapplication的error事件,在error事件中记录异常发生的时间、消息和堆栈,并将信息存储到当前线程对应的httpcontext。

(3.5)当http请求结束时,将当前http请求记录的性能数据和响应状态码添加到异步队列。

通过步骤(3.1)映射system.web.httpapplication::initmodulescommon函数创建的httpmodule,监听httpapplication的endrequest事件,在endrequest事件中记录httpcontext的性能数据和响应状态码,并将数据添加到异步队列。

(4)创建独立的线程,对采集的性能信息和错误信息进行异步处理。

汇总线程从异步队列中获取各类性能数据并计算应用性能结果,将超过阈值的http请求发生的函数调用序列化为调用过程树。

工作时,通过il代码改写规则在原有代码前插入监控入口代码,在原有代码后插入监控出口代码,并且将监控入口代码、原有代码、监控出口代码均用try…catch进行包裹,在异常处理内插入监控代码异常逻辑进行监控,在监控代码内根据代码名称对代码功能进行分类,分为数据库、中间件、网络io等多个组件,创建独立的线程,对采集的性能信息和错误信息进行异步处理即可。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下。由语句“包括一个......限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素”。

尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1