CN101645032A - 应用服务器的性能分析方法和应用服务器 - Google Patents
应用服务器的性能分析方法和应用服务器 Download PDFInfo
- Publication number
- CN101645032A CN101645032A CN200910171812A CN200910171812A CN101645032A CN 101645032 A CN101645032 A CN 101645032A CN 200910171812 A CN200910171812 A CN 200910171812A CN 200910171812 A CN200910171812 A CN 200910171812A CN 101645032 A CN101645032 A CN 101645032A
- Authority
- CN
- China
- Prior art keywords
- performance
- affairs
- log pattern
- application server
- notice
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Abstract
本发明公开了一种应用服务器的性能分析方法和应用服务器,主要通过开启性能日志模块来收集在进行远程调用时或HTTP请求应答时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而可以实现提高分析效率的目的,使其可以在生产环境中使用。
Description
技术领域
本发明涉及通信技术领域,具体涉及应用服务器的性能分析方法和应用服务器。
背景技术
在Java领域,分析性能问题的主要工具就是性能剖析器(Profiler),用于分析应用程序的响应时间及内存占用,从而实现对应用服务器的性能分析。性能剖析器主要使用步骤如下:
应用程序启动时,增加某个Java虚拟机(JVM,Java Virtual Machine)启动参数,开启虚拟机工具接口代理(JVMTI Agent,JVM Tool Interface Agent)服务以启动虚拟机工具接口。在运行待分析功能点前,性能剖析器指定一个分析范围,例如某个命名空间某些类的所有方法等,然后通过虚拟机的接口,附加到正在运行的应用程序上,之后即可以运行待分析功能点,由性能剖析器记录该待分析功能点执行过程中的Java指令执行或对象创建等明细信息,直至待分析功能点运行结束,此时,性能剖析器根据明细信息生成性能图表,然后再根据性能图表,分析该功能点性能缺陷的性质,给出优化方案。
在对现有技术的研究和实践过程中,本发明的发明人发现,采用性能剖析器来实现对应用服务器的性能分析时,由于性能剖析器必须记录分析范围内的每个Java指令,所以会使所有Java指令的执行时间增加,从而降低应用程序的整体运行速度,特别是随着分析范围的增大,可能会几倍甚至几十倍地增加功能的响应时间,导致分析效率较低,使得其只能在开发环境中使用,而无法在生产环境中使用,但是许多性能缺陷只在生产环境中出现,开发环境中无法重现,因此很难实现性能优化。
发明内容
本发明实施例提供应用服务器的性能分析方法和应用服务器,可以实现较高的分析效率,使其可以在生产环境中使用。
一种应用服务器的性能分析方法,包括:
接收到远程调用请求或超文本传输协议(HTTP,Hypertext TransferProtocol)请求应答时,通知性能日志模块(PerformaceLog)开始性能事务;
发送所述性能事务请求给业务组件;
通过业务组件执行数据库连接(JDBC,Java Data Base Connectivity)以访问数据库;
记录在访问数据库的过程中的性能数据;
将所述性能数据发送给性能日志模块,从而完成一次性能事件;
在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。
一种应用服务器,包括:
开始通知单元,用于接收到远程调用请求或HTTP请求应答时,通知性能日志模块开始性能事务;
启动单元,发送所述性能事务请求给业务组件;
访问单元,用于通过启动单元启动的业务组件执行JDBC以访问数据库;
记录单元,用于记录在访问单元访问数据库的过程中的性能数据;
发送单元,将所述记录单元记录的性能数据发送给开始通知单元所通知的性能日志模块,从而完成一次性能事件;
结束通知单元,用于在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的发送单元所发送的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。
本发明实施例采用了一种与现有技术中完全不同的性能分析方法,主要通过开启性能日志模块来收集在进行远程调用时或HTTP请求应答时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而可以实现提高分析效率的目的,使其可以在生产环境中使用。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一所提供的方法的方法流程图;
图2是本发明实施例二所提供的方法的方法流程图;
图3是本发明实施例三所提供的方法的方法流程图;
图4是是本发明实施例所提供的应用服务器的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例提供一种应用服务器的性能分析方法和应用服务器。以下分别进行详细说明。
实施例一、
本实施例将从应用服务器的角度进行描述。
一种应用服务器的性能分析方法,包括:接收到远程调用请求或超文本传输协议(HTTP,Hypertext Transfer Protocol)请求应答时,通知性能日志模块(PerformaceLog)开始性能事务,其中,性能事务包括性能事件(当然,性能事务中也可能没有性能事件);发送该性能事务请求给业务组件,通过业务组件执行数据库连接(JDBC,Java Data Base Connectivity)以访问数据库;记录在访问数据库的过程中的性能数据;将所记录的性能数据发送给性能日志模块,从而完成一次性能事件;在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。如图1所示,其具体流程可以如下:
101、接收到远程调用请求或HTTP请求应答时,通知性能日志模块开始性能事务,其中,性能事务可以包括性能事件;
例如,通过开始远程调用消息(startInvoke)通知性能日志模块开始性能事务;或者,通过开始HTTP消息(startHttp)通知性能日志模块开始性能事务。
102、发送该接收到的性能事务请求给业务组件,比如BizControllerBean;
103、通过业务组件执行JDBC以访问数据库;
例如:通过业务组件调用第一JDBC驱动模块,比如多数据库SQL翻译模块(KSQL,其中,SQL为Structured Quevy Language,即结构化查询语言),由第一JDBC驱动模块通过第二JDBC驱动模块,比如数据库驱动程序模块(Oracle JDBC Driver)访问数据库。
其中,KSQL为一种特殊的JDBC驱动(Driver),主要用于将一套标准SQL语法翻译为不同数据库类型的本地语法,然后将SQL交给不同数据库的JDBCDriver来处理。KSQL不仅负责翻译,也监视具体JDBC操作的性能,分发监视器事件给注册的监听器。本文描述的性能日志,就是KSQL的监听器之一。
当然,在通过业务组件执行JDBC以访问数据库时还可以通过业务组件执行一些不需要访问数据库的逻辑,只消耗CPU和占用内存。
104、记录在访问数据库的过程中的性能数据;
105、将记录下来的性能数据发送给性能日志模块,从而完成一次性能事件;例如,可以通过JDBC运行模块(jdbcPerformed)将这些性能数据发送给性能日志模块。
需说明的是,若还有其他的性能事件,则重复步骤103至105的步骤,直至完成该性能事务。
106、在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的性能数据转换成性能事务、性能事件及其参数后,输出到日志文件中。
例如,可以通过结束远程调用消息(endInvoke)通知性能日志模块结束性能事务;或者,通过结束HTTP消息(endHttp)通知性能日志模块结束性能事务。
需说明的是,除了上述所描述的可以通过业务组件访问数据库,并收集在此过程中的性能数据,最终生成性能日志的方案之外,也可以直接在各个业务组件的逻辑增加额外的日志逻辑,但是这样的话,需要对各个业务组件逐个开发日志,增加了开发成本,而且缺乏统一的分析方法,无法快速分析,以及分析的内容有限,因此,相对而言,前述方案比在业务组件中增加日志更优。
由上可知,本发明实施例采用了一种与现有技术中完全不同的性能分析方法,主要通过开启性能日志模块来收集在进行远程调用时或HTTP请求应答时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而实现提高分析效率的目的,使其可以在生产环境中使用。
实施例二、
根据实施例所描述的方法,以下将举例作详细说明。在本实施例中,将以应用服务器的远程调用性能日志的生成为例进行说明。
其中,应用服务器中可以包括有远程调用服务端框架(RPCService,主要负责处理和分发客户端的远程调用)、性能日志模块PerformanceLog、业务组件BizControllerBean、第一JDBC驱动模块KSQL和第二JDBC驱动模块OracleJDBC Driver。
生成远程调用的性能日志,需要完成以下几步;
(1)记录性能事务(在本实施例中该性能事务即为该远程调用);
RPCService在远程调用处理开始前,需要通知PerformanceLog性能事务开始,并在远程调用处理结束后,将记录的性能数据转发给PerformanceLog,以及通知PerformanceLog性能事务结束。
(2)量化每个性能事务与下一层的交互,即应用服务器与数据库服务器(即本发明实施例所说的数据库所在的服务器)的交互;
所有访问数据库的JDBC操作,都通过KSQL转发给具体数据库的JDBCDriver,在本实施例中即为Oracle JDBC Driver,并记录性能数据,转发给PerformanceLog。在完成远程调用后,通知性能日志类PerformanceLog。
(3)量化每个性能事件在本层的资源消耗,即中央处理器(CPU,CentralProcessing Unit)、内存的消耗等等;
在性能事务开始和结束时,分别记录当前线程的CPU时间(CPU Time)、全局内存回收次数(GC Count,Garbage Collection Count)、全局内存回收时间(GC Time,Garbage Collection Time)。在性能事件结束后,PerformanceLog计算出差值,即为此性能事件在本层的资源消耗。
其中,性能日志中的CPU Time主要指CPU处理当前性能事务所花费的时间。固定型号的CPU,单位时间能够输出的CPU Time是有限的,所以任何一个性能事务,都不应该过度地消耗CPU Time。
GC Time和GC Count则是JVM的内存回收机制,性能日志中的GC Time,是一个性能事务执行过程中,JVM做内存回收的总时间。性能日志中的GCCount,是一个性能事务执行过程中,JVM做内存回收的总次数。GC Time和GC Count较大,往往说明当前性能事务对内存的使用有不合理之处,例如大量创建对象、申请大块连续内存等等。
(4)在性能事务结束时,PerformanceLog将所有上述记录,通过开源日志工具包Log4j,输出到一个日志文件中。
以下将举例作详细说明,如图2所示,一次远程调用执行后,产生性能日志的流程可以如下:
201、RPCService接收到一次远程调用请求时,首先通过startInvoke通知PerformaceLog开始性能事务。
202、RPCService发送该远程调用请求给具体的业务组件,比如BizControllerBean。
203、BizControllerBean接收到该远程调用请求后,可以执行一些不需要访问数据库的逻辑,比如在此可以将这段不需要访问数据库的逻辑块命为biz2(其他实施例同,不再赘述),执行这些操作时只消耗CPU和占用内存。
当然,如果此时不需要执行这些操作,则可以直接执行步骤204。
204、BizControllerBean执行JDBC如jdbc1访问数据库,比如可以利用KSQL通过Oracle JDBC Driver访问数据库服务器,并记录在访问数据库的过程中的性能数据。
205、KSQL可以通过jdbcPerformed,把性能数据转发给PerformanceLog。
206、BizControllerBean可以执行一些不需要访问数据库的逻辑,比如在此可以将这段不需要访问数据库的逻辑块命为biz3(其他实施例同,不再赘述),执行这些操作时只消耗CPU和占用内存,当然,如果此时不需要执行这些操作,则可以直接执行步骤207。
207、BizControllerBean执行JDBC如jdbc2访问数据库,比如可以利用KSQL通过Oracle JDBC Driver访问数据库服务器,并记录在访问数据库的过程中的性能数据。
208、KSQL可以通过jdbcPerformed,把性能数据转发给PerformanceLog。
209、BizControllerBean完成远程调用处理,返回到RPCService,RPCService通过endInvoke通知PerformaceLog结束性能事务。
210、PerformaceLog可以通过输出日志消息(outputLog),将上述过程中积累的所有性能数据,转换为性能事务、事件及其参数,输出到日志文件中。
其中,输出的性能日志,可以采用如下格式。
假设客户端通过远程调用,获取一个实体集合,则其性能日志如表一所示;
表一:
com.kingdee.eas.fi.gl.IVoucher.getVoucherCollection(java.lang.String)com.kingdee.eas.fi.gl.VoucherCollection:4timescurrent thread:RPC-5==============start sql==============15:57:38FROM″T_GL_VOUCHER″″T0″WHERE(″T0″.″FCOMPANYID″=?AND″T0″.″FPERIODID″=?)timespan:16sql_id:-41193762 startTime:15:57:38conn_id:25049155----------KDResultSet.nexttimespan:765sql_id:-1startTime:15:57:38conn_id:25049155FROM ″T_GL_VOUCHERENTRY″″T0″INNER JOIN″T_GL_VOUCHER″″T1″ON ″T0″.″FBILLID″=″T1″.″FID″WHERE(″T1″.″FCOMPANYID″=?AND ″T1″.″FPERIODID″=?)ORDER BY″T0″.″FBILLID″ASC,″T0″.″FSEQ″ASCtimespan:94sql_id:-53160382startTime:15:57:40conn_id:25049155----------KDResultSet.next |
timespan:1295sql_id:-1startTime:15:57:40conn_id:25049155==============end sql==============15:57:44sql time:110sql execute number:2next time:2060next number:2db totaltime:2170invoke time:4172cpu time:2015gc count:5gc time:511 |
其中,该日志(即表一)中的各种性能参数的说明如下:
◆com.kingdee.eas.fi.gl.IVoucher.getVoucherCollection(java.lang.String)com.kingdee.eas.fi.gl.VoucherCollection:4times:表示服务端方法及其数据库查询和程序设计语言(sql,Structured Query Language)执行数
◆current thread:RPC-5:表示服务线程名
◆FROM″T_GL_VOUCHER″″T0″WHERE(″T0″.″FCOMPANYID″=?AND″T0″.″FPERIODID″=?)timespan:16:表示sql及其执行耗时。为了防止大量的选择字段(selector)影响快速浏览,对于超过100字符的selector不输出。
◆sql_id:-41193762:这是根据sql的散列码(hashcode)生成的sql标志
◆startTime:9:34:37:这是sql执行开始时间。
◆conn_id:25049155:这是执行sql或遍历结果集的数据库连接的唯一标识
◆---------KDResultSet.next timespan:1295sql_id:-1startTime:15:57:40conn_id:7749423:JDBC遍历结果集时,并不是一次把所有行取回服务端,而是建立了一个内存缓存区,逐页获取,比如,oracle(Oracle是一种数据库品牌)一页10行,db2(db2是一种数据库品牌)一页64行,下一次(next)时如果跨页就需要进行应用服务器(APP Server)和数据库服务器(DB Server)间的网络通讯,获取下一页的若干行结果。这个性能参数,记录了遍历一个结果集的总时间。
◆sql time:31:表示这个服务端方法执行sql的总耗时。
sql execute number:3:表示数据库访问次数。我们关注的不是sql执行次数,而是应用服务器与数据库服务器的交互次数。所以,需要把addBatch(addBatch是JDBC的一种操作类型,它可以将一组参数添加到批处理命令集合中,并延迟到另一个操作类型executeBatch时才一次性提交给数据库服务器)
◆的sql次数排除。
◆next time:2060:表示遍历多个结果集的总耗时。
◆next number:2:表示遍历的结果集总个数
◆db total time:2170:等于sql time和next time的和,是应用服务器与数据库服务器交互的总时间。
◆invoke time:687:表示这个远程调用的执行总耗时。
◆cputime:2015:表示这个远程调用消耗的CPU时间
◆gc count:5gc time:511:表示服务端处理一次远程调用这段时间内,GC总次数和总时间,可用于分析服务端内存占用情况。
在某次远程调用响应时间较长时,日志中的参数invoke time就会很大,为了分析详细原因,可以按如下方法分析性能日志:
(1)dbTotalTime过大,可以有如下两种情况;
如果sqlTime过大,则可以定位到几个耗时sql,分析sql的执行计划,改写sql或优化数据库索引;
如果nextTime过大,则可以减少结果集中的行和列。
(2)sqlExeNumber过大,可以有如下两种情况;
如果select过多,则可以逐个取数改为批量取数;
如果update、insert或delete过多,则可以采用临时表或将addBatch和executeBatch组合起来使用。
(3)如果cpu time过大,则可以优化算法,减少循环,例如可以参考InvokeEntry.startTime,定位缺陷逻辑。
(4)如果GC Time或GC Count过大,则可以优化内存占用,例如减少对象创建,不申请大块连续内存,减少非连续内存占用等等。
(5)如果上述时间都不大,则可以等待某种资源,例如数据库连接、CPU、线程同步锁等等,或者等待文件系统的输出/输入接口(IO,Input/Output),,比如加载类、图标、资源、配置文件等。
由上可知,本发明实施例采用了一种与现有技术中完全不同的性能分析方法,主要通过开启性能日志模块来收集在进行远程调用时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而实现提高分析效率的目的。
相对于现有技术只能在特定的生产环境中使用而言,本发明实施例所提供的方案可以在多种生产环境下使用,可以很方便地由用户或实施人员打开性能日志,而且由于对运行速度影响很小,可以在用户的日常操作中长时间打开,便于在第一现场搜集性能数据。进一步的,在进行远程调用时,本发明实施例日志中一个性能事件的时间组成,可以真实地反映一次远程调用处理时间的组成,不存在现有技术中对每个Java指令增加一个延时导致的失真问题。
实施例三、
根据实施例所描述的方法,以下将举例作详细说明。在本实施例中,将以应用服务器的HTTP请求应答性能日志的生成为例进行说明。
其中,应用服务器中可以包括有服务端小程序过滤器(Servlet Filter)、性能日志模块PerformanceLog、业务组件BizControllerBean、第一JDBC驱动模块KSQL和第二JDBC驱动模块Oracle JDBC Driver。
生成HTTP请求应答的性能日志,需要完成以下几步;
(1)记录性能事务,在本实施例中该性能事务即为HTTP请求应答;
Servlet Filter在HTTP请求应答开始前,通知PerformanceLog性能事务开始,并在HTTP请求应答处理结束后,记录性能数据,将记录的性能数据转发给PerformanceLog,以及通知PerformanceLog性能事务结束。
(2)量化每个性能事务与下一层的交互,即量化应用服务器与数据库服务器的交互;
所有访问数据库的JDBC操作,都通过KSQL转发给具体数据库的JDBCDriver,在本发明实施例中即为Oracle JDBC Driver,并记录性能数据,转发给PerformanceLog。在完成远程调用后,通知性能日志类PerformanceLog。
(3)量化每个性能事件在本层的资源消耗,即CPU、内存的消耗等等;
在性能事务开始和结束时,分别记录当前线程的CPU时间、全局GC次数、全局GC时间。在性能事件结束后,PerformanceLog计算出差值,即为此性能事件在本层的资源消耗。
(4)在性能事务结束时,PerformanceLog将所有上述记录,通过开源日志工具包Log4j,输出到一个日志文件中。
以下将举例作详细说明,如图3所示,一次HTTP请求应答后,产生性能日志的流程可以如下:
301、ServletFilter接收到一次HTTP请求时,首先通过startHttp通知PerformaceLog开始性能事务。
302、ServletFilter发送该HTTP请求给具体的业务组件,比如先发送给业务组件的接口BizServlet,执行BizServlet.service()。
303、BizServlet接收到该HTTP请求后,可以执行一些不需要访问数据库的逻辑,比如biz2,执行这些操作时只消耗CPU和占用内存。
当然,如果此时不需要执行这些操作,则可以直接执行步骤304。
304、BizServlet执行JDBC如jdbc1访问数据库,比如可以利用KSQL通过Oracle JDBC Driver访问数据库服务器,并记录在访问数据库的过程中的性能数据。
305、KSQL可以通过jdbcPerformed,把性能数据转发给PerformanceLog。
306、BizServlet可以执行一些不需要访问数据库的逻辑,比如biz3,执行这些操作时只消耗CPU和占用内存,当然,如果此时不需要执行这些操作,则可以直接执行步骤307。
307、BizServlet可以本地调用服务端业务组件(BizControllerBean),由BizControllerBean来执行JDBC如jdbc2以访问数据库,比如可以利用KSQL通过Oracle JDBC Driver访问数据库服务器,并记录在访问数据库的过程中的性能数据。
需说明的是,BizServlet是业务组件的接口,负责处理HTTP请求应答,而BizControllerBean是真正的业务逻辑,即在本实施例中,业务组件包括BizServlet和BizControllerBean。
308、KSQL可以通过jdbcPerformed,把性能数据转发给PerformanceLog。
309、BizServlet处理完HTTP请求并生成应答,返回到ServletFilter,ServletFilter通过endHttp通知PerformaceLog结束性能事务。
310、PerformaceLog可以通过outputLog,将上述过程中积累的所有性能数据,转换为性能事务、事件及其参数,输出到日志文件中。
其中,输出的性能日志,可以采用如下格式,参见表二;
表二:
http://localhost:6888/easportal/messagecenter/messageQuery.do:3timesthread:Running HTTPHandler-1param:limit=22;start=0;customNodeId=;ifCombine=true;ifSendView=false;ifCurrentOrg=false;pageSize=22;msgDate=;ifHistory=;==============start sql==============9:13:38SELECT count(*)FROM T_WFR_Assign A,T_BAS_AssignRead BWHERE(a.FASSIGNID=b.FASSIGNID AND(((a.FSTATE IN(1,2))ANDa.FIsSendMsg =1)AND a.FPERSONUSERID =′256c221a-0106-1000-e000-10d7c0a813f413B7DE7F′))timespan:16 sql_id:-2060567761 startTime:9:13:38 conn_id:25049155SELECT count(*)FROM T_WFR_Assign A,T_BAS_AssignRead BWHERE(a.FASSIGNID=b.FASSIGNID AND(((a.FSTATE IN(1,2))ANDa.FIsSendMsg =1)AND a.FPERSONUSERID =′256c221a-0106-1000-e000-10d7c0a813f413B7DE7F′))timespan:156sql_id:-2060567761startTime:9:13:38 conn_id:25049155----------KDResultSet.nexttimespan:0sql_id:-1startTime:9:13:38 conn_id:25049155==============end sql==============9:13:38dbTime:172sqlTime:172sqlExeNumber:2nextTime:0nextNumber:1invokeTime:624 cpuTime:78 gcCount:0 gcTime:0 |
其中,该日志(即表二)中的各种性能参数的说明如下:
◆http://localhost:6888/easportal/messagecenter/messageQuery.do:3times:该语句表示HTTP请求的URL及其sql执行数
◆thread:Running HTTPHandler-1:表示服务线程名
◆param:
limit=22;start=0;customNodeId=;ifCombine=true;ifSendView=false;ifCurrentOrg=false;pageSize=22;msgDate=;ifHistory=;:表示HTTP请求的参数
◆SELECT count(*)FROM T_WFR_Assign A,T_BAS_AssignRead BWHERE(a.FASSIGNID=b.FASSIGNID AND(((a.FSTATE IN(1,2))ANDa.FIsSendMsg =1)AND a.FPERSONUSERID =′256c221a-0106-1000-e000-10d7c0a813f413B7DE7F′))timespan:16:表示sql及其执行耗时。为了防止大量的selector影响快速浏览,对于超过100字符的selector不输出。
◆sql_id:-2060567761:这是根据sql的hashcode生成的sql标志
◆startTime:9:13:38:表示sql执行开始时间。
◆conn_id:25049155:这是执行sql或遍历结果集的数据库连接的唯一标识
◆----------KDResultSet.next timespan:0 sql_id:-1startTime:9:13:38conn_id:25049155:JDBC遍历结果集时,并不是一次把所有行取回服务端,而是建立了一个内存缓存区,逐页获取。oracle一页10行,db2一页64行,next时如果跨页就需要进行app server和db server间的网络通讯,获取下一页的若干行结果。这个性能参数,记录了遍历一个结果集的总时间和开始时间。
◆sqlTime:172:表示处理这个HTTP请求应答过程中,执行sql的总耗时。
◆sqlExeNumber:2:表示数据库访问次数。我们关注的不是sql个数,而是应用服务器与数据库服务器的交互次数。所以,需要把addBatch的sql次数排除。
◆nextTime:0:表示遍历多个结果集的总耗时。
◆nextNumber:1:表示遍历的结果集总个数
◆dbTime:172:等于sql time和next time的和,是应用服务器与数据库服务器交互的总时间。
◆invokeTime:624:表示这个HTTP请求应答的总耗时。
◆cpuTime:78:表示这个HTTP请求应答消耗的CPU时间
◆gcCount:0gcTime:0:表示服务端处理一次HTTP请求应答这段时间内,GC总次数和总时间,可用于分析服务端内存占用情况。
在某次HTTP请求应答响应时间较长时,日志中的参数invoke time就会很大,为了分析详细原因,可以按如下方法分析性能日志:
(1)dbTime过大,可以有如下两种情况;
如果sqlTime过大,则可以定位到几个耗时sql,分析sql的执行计划,改写sql或优化数据库索引。
如果nextTime过大,则可以减少结果集中的行和列。
(2)sqlExeNumber过大,可以有如下两种情况;
如果select过多,则可以逐个取数改为批量取数;
如果update、insert或delete过多,则可以采用临时表或将addBatch和executeBatch组合在一起使用
(3)如果cpuTime过大,则可以优化算法,减少循环;例如可以参考InvokeEntry.startTime,定位缺陷逻辑。
(4)如果GC Time或GC Count过大,则可以优化内存占用,例如可以减少对象创建,不申请大块连续内存,减少非连续内存占用等等。
(5)如果上述时间都不大,则可以等待某种资源,例如数据库连接、CPU、线程同步锁等等,或者等待文件系统IO,例如加载类、图标、资源、配置文件等。
由上可知,本发明实施例采用了一种与现有技术中完全不同的性能分析方法,主要通过开启性能日志模块来收集在进行HTTP请求应答时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而实现提高分析效率的目的。
相对于现有技术只能在特定的生产环境中使用而言,本发明实施例所提供的方案可以在多种生产环境下使用,可以很方便地由用户或实施人员打开性能日志,而且由于对运行速度影响很小,可以在用户的日常操作中长时间打开,便于在第一现场搜集性能数据。进一步的,在进行远程调用时,本发明实施例日志中一个性能事件的时间组成,可以真实地反映一次远程调用处理时间的组成,不存在现有技术中对每个Java指令增加一个延时导致的失真问题。
实施例四、
为了更好地实施以上方法,本发明实施例还相应地提供一种应用服务器,如图4所示,该应用服务器包括开始通知单元401、启动单元402、访问单元403、记录单元404、发送单元405和结束通知单元406;
开始通知单元401,用于接收到远程调用请求或HTTP请求应答时,通知性能日志模块开始性能事务,其中,性能事务可以包括性能事件;
启动单元402,发送所述性能事务请求给业务组件,比如BizControllerBean;
访问单元403,用于通过启动单元402启动的业务组件执行JDBC以访问数据库;
记录单元404,用于记录在访问单元403访问数据库的过程中的性能数据;
发送单元405,将所述记录单元404记录的性能数据发送给开始通知单元401所通知的性能日志模块,从而完成一次性能事件;
结束通知单元406,用于在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的发送单元405所发送的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。
其中,所述访问单元403,用于通过启动单元402启动的业务组件调用第一JDBC驱动模块,比如KSQL,由第一JDBC驱动模块通过第二JDBC驱动模块,比如Oracle JDBC Driver访问数据库。
所述发送单元405,用于通过JDBC运行模块(jdbcPerformed)将所述记录单元404记录的性能数据发送给性能日志模块。
所述开始通知单元401,用于通过开始远程调用消息(startInvoke)通知性能日志模块开始性能事务;或者,通过开始HTTP消息(startHttp)通知性能日志模块开始性能事务。
所述结束通知单元406,用于通过结束远程调用消息(endInvoke)通知性能日志模块结束性能事务;或者,通过结束HTTP消息(endHttp)通知性能日志模块结束性能事务。
该应用服务器还可以包括执行单元;
所述执行单元,用于通过启动单元402启动的业务组件执行一些不需要访问数据库的逻辑。
以上各个单元的具体实施可参见前面的实施例,在此不再赘述。
由上可知,本发明实施例采用了一种与现有技术中完全不同的性能分析方法,主要通过开启性能日志模块来收集在进行远程调用时或HTTP请求应答时应用服务器的性能数据,然后将这些性能数据以日志的形式输出;相比较于现有技术中采用性能剖析器来进行应用服务器的性能分析而言,本方案不存在必须记录分析范围内的每个Java指令的情况,其时间消耗主要在输出日志时的文件系统接口,但这可以通过日志工具包,比如Log4j使得该部分的消耗降到最低,从而实现提高分析效率的目的。
相对于现有技术只能在特定的生产环境中使用而言,本发明实施例所提供的方案可以在多种生产环境下使用,可以很方便地由用户或实施人员打开性能日志,而且由于对运行速度影响很小,可以在用户的日常操作中长时间打开,便于在第一现场搜集性能数据。进一步的,在进行远程调用时,本发明实施例日志中一个性能事件的时间组成,可以真实地反映一次远程调用处理时间的组成,不存在现有技术中对每个Java指令增加一个延时导致的失真问题。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取记忆体(RAM,Random Access Memory)、磁盘或光盘等。
以上对本发明实施例所提供的应用服务器的性能分析方法和应用服务器进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1、一种应用服务器的性能分析方法,其特征在于,包括:
接收到远程调用请求或超文本传输协议HTTP请求应答时,通知性能日志模块开始性能事务;
发送所述性能事务请求给业务组件;
通过业务组件块执行数据库连接JDBC以访问数据库;
记录在访问数据库的过程中的性能数据;
将所述性能数据发送给性能日志模块,从而完成一次性能事件;
在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。
2、根据权利要求1所述的方法,其特征在于,所述通过业务组件执行JDBC以访问数据库包括:
通过业务组件调用第一JDBC驱动模块,由第一JDBC驱动模块通过第二JDBC驱动模块访问数据库。
3、根据权利要求1所述的方法,其特征在于,所述将所述性能数据发送给性能日志模块包括:
通过JDBC运行模块将所述性能数据发送给性能日志模块。
4、根据权利要求1所述的方法,其特征在于,
所述通知性能日志模块开始性能事务包括:
通过开始远程调用消息startInvoke通知性能日志模块开始性能事务;或者,通过开始HTTP消息startHttp通知性能日志模块开始性能事务。
所述通知性能日志模块结束性能事务包括:
通过结束远程调用消息endInvoke通知性能日志模块结束性能事务;或者,通过结束HTTP消息endHttp通知性能日志模块结束性能事务。
5、根据权利要求1至4任一项所述的方法,其特征在于,在通过业务组件执行JDBC以访问数据库时还包括:
通过业务组件执行一些不需要访问数据库的逻辑。
6、一种应用服务器,其特征在于,包括:
开始通知单元,用于接收到远程调用请求或超文本传输协议HTTP请求应答时,通知性能日志模块开始性能事务;
启动单元,发送所述性能事务请求给业务组件;
访问单元,用于通过启动单元启动的业务组件执行数据库连接JDBC以访问数据库;
记录单元,用于记录在访问单元访问数据库的过程中的性能数据;
发送单元,将所述记录单元记录的性能数据发送给开始通知单元所通知的性能日志模块,从而完成一次性能事件;
结束通知单元,用于在完成远程调用处理或生成HTTP应答时,通知性能日志模块结束性能事务,以便性能日志模块将接收到的发送单元所发送的性能数据转换成性能事务、性能事件及其参数后,输出日志文件。
7、根据权利要求6所述的应用服务器,其特征在于,
所述访问单元,用于通过启动单元启动的业务组件调用第一JDBC驱动模块,由第一JDBC驱动模块通过第二JDBC驱动模块访问数据库。
8、根据权利要求6所述的应用服务器,其特征在于,
所述发送单元,用于通过JDBC运行模块jdbcPerformed将所述记录单元记录的性能数据发送给性能日志模块。
9、根据权利要求6所述的应用服务器,其特征在于,
所述开始通知单元,用于通过开始远程调用消息startInvoke通知性能日志模块开始性能事务;或者,通过开始HTTP消息startHttp通知性能日志模块开始性能事务;
所述结束通知单元,用于通过结束远程调用消息endInvoke通知性能日志模块结束性能事务;或者,通过结束HTTP消息endHttp通知性能日志模块结束性能事务。
10、根据权利要求6至9任一项所述的应用服务器,其特征在于,还包括执行单元;
所述执行单元,用于通过启动单元启动的业务组件执行一些不需要访问数据库的逻辑。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101718121A CN101645032B (zh) | 2009-08-31 | 2009-08-31 | 应用服务器的性能分析方法和应用服务器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101718121A CN101645032B (zh) | 2009-08-31 | 2009-08-31 | 应用服务器的性能分析方法和应用服务器 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101645032A true CN101645032A (zh) | 2010-02-10 |
CN101645032B CN101645032B (zh) | 2011-08-10 |
Family
ID=41656926
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101718121A Active CN101645032B (zh) | 2009-08-31 | 2009-08-31 | 应用服务器的性能分析方法和应用服务器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101645032B (zh) |
Cited By (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102306119A (zh) * | 2011-06-30 | 2012-01-04 | 北京新媒传信科技有限公司 | 捕获全局异常的系统及方法 |
CN103745317A (zh) * | 2013-12-31 | 2014-04-23 | 金蝶软件(中国)有限公司 | 业务处理性能分析方法和装置 |
CN104216943A (zh) * | 2014-06-24 | 2014-12-17 | 用友优普信息技术有限公司 | 自动收集阻塞信息方便事后分析数据库阻塞的方法及装置 |
CN104426945A (zh) * | 2013-08-27 | 2015-03-18 | 腾讯科技(深圳)有限公司 | 一种获取应用性能数据的方法、设备和系统 |
CN104598348A (zh) * | 2015-02-28 | 2015-05-06 | 南京途牛科技有限公司 | 一种远程实时分析外部系统接口性能的方法及系统 |
CN103780679B (zh) * | 2014-01-03 | 2016-10-19 | 电子科技大学 | 基于http协议的长延时远程调用方法 |
CN106250292A (zh) * | 2016-08-11 | 2016-12-21 | 上海泛微网络科技股份有限公司 | 一种办公管理系统性能监控平台 |
CN106372135A (zh) * | 2016-08-26 | 2017-02-01 | 深圳市卓讯信息技术有限公司 | 一种结构化查询语言sql执行效率跟踪方法及装置 |
CN107181633A (zh) * | 2017-07-27 | 2017-09-19 | 郑州云海信息技术有限公司 | 一种远程获取业务日志的方法及系统 |
CN108763052A (zh) * | 2018-04-11 | 2018-11-06 | 福建天晴数码有限公司 | 一种虚拟现实软件内存回收机制的性能检测方法及系统 |
CN111897522A (zh) * | 2020-06-16 | 2020-11-06 | 中科驭数(北京)科技有限公司 | 面向硬件数据库的开发展示系统及方法 |
CN112887354A (zh) * | 2019-11-29 | 2021-06-01 | 贵州白山云科技股份有限公司 | 一种性能信息的获取方法和装置 |
CN113448742A (zh) * | 2020-03-25 | 2021-09-28 | 北京京东振世信息技术有限公司 | 一种接口数据采集方法和装置 |
US20220179680A1 (en) * | 2019-05-06 | 2022-06-09 | Zte Corporation | Application state control method apparatus, and terminal and computer-readable storage medium |
-
2009
- 2009-08-31 CN CN2009101718121A patent/CN101645032B/zh active Active
Cited By (19)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102306119A (zh) * | 2011-06-30 | 2012-01-04 | 北京新媒传信科技有限公司 | 捕获全局异常的系统及方法 |
CN104426945A (zh) * | 2013-08-27 | 2015-03-18 | 腾讯科技(深圳)有限公司 | 一种获取应用性能数据的方法、设备和系统 |
CN104426945B (zh) * | 2013-08-27 | 2019-08-13 | 腾讯科技(深圳)有限公司 | 一种获取应用性能数据的方法、设备和系统 |
CN103745317B (zh) * | 2013-12-31 | 2018-12-21 | 金蝶软件(中国)有限公司 | 业务处理性能分析方法和装置 |
CN103745317A (zh) * | 2013-12-31 | 2014-04-23 | 金蝶软件(中国)有限公司 | 业务处理性能分析方法和装置 |
CN103780679B (zh) * | 2014-01-03 | 2016-10-19 | 电子科技大学 | 基于http协议的长延时远程调用方法 |
CN104216943A (zh) * | 2014-06-24 | 2014-12-17 | 用友优普信息技术有限公司 | 自动收集阻塞信息方便事后分析数据库阻塞的方法及装置 |
CN104598348A (zh) * | 2015-02-28 | 2015-05-06 | 南京途牛科技有限公司 | 一种远程实时分析外部系统接口性能的方法及系统 |
CN106250292B (zh) * | 2016-08-11 | 2018-06-08 | 上海泛微网络科技股份有限公司 | 一种办公管理系统性能监控平台 |
CN106250292A (zh) * | 2016-08-11 | 2016-12-21 | 上海泛微网络科技股份有限公司 | 一种办公管理系统性能监控平台 |
CN106372135A (zh) * | 2016-08-26 | 2017-02-01 | 深圳市卓讯信息技术有限公司 | 一种结构化查询语言sql执行效率跟踪方法及装置 |
CN107181633A (zh) * | 2017-07-27 | 2017-09-19 | 郑州云海信息技术有限公司 | 一种远程获取业务日志的方法及系统 |
CN108763052A (zh) * | 2018-04-11 | 2018-11-06 | 福建天晴数码有限公司 | 一种虚拟现实软件内存回收机制的性能检测方法及系统 |
US20220179680A1 (en) * | 2019-05-06 | 2022-06-09 | Zte Corporation | Application state control method apparatus, and terminal and computer-readable storage medium |
CN112887354A (zh) * | 2019-11-29 | 2021-06-01 | 贵州白山云科技股份有限公司 | 一种性能信息的获取方法和装置 |
CN113448742A (zh) * | 2020-03-25 | 2021-09-28 | 北京京东振世信息技术有限公司 | 一种接口数据采集方法和装置 |
CN113448742B (zh) * | 2020-03-25 | 2023-11-03 | 北京京东振世信息技术有限公司 | 一种接口数据采集方法和装置 |
CN111897522A (zh) * | 2020-06-16 | 2020-11-06 | 中科驭数(北京)科技有限公司 | 面向硬件数据库的开发展示系统及方法 |
CN111897522B (zh) * | 2020-06-16 | 2021-09-03 | 中科驭数(北京)科技有限公司 | 面向硬件数据库的开发展示系统及方法 |
Also Published As
Publication number | Publication date |
---|---|
CN101645032B (zh) | 2011-08-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101645032B (zh) | 应用服务器的性能分析方法和应用服务器 | |
US10684990B2 (en) | Reconstructing distributed cached data for retrieval | |
US7424470B2 (en) | Local data repository generation | |
CN104572122A (zh) | 一种软件应用数据的生成装置及方法 | |
CN111639114A (zh) | 一种基于物联网平台的分布式数据融合管理系统 | |
CN102929899A (zh) | 一种基于中间表的分布式报表系统 | |
CN107133903B (zh) | 随机抽查系统及污染源日常环境一键随机抽查方法 | |
CN106502875A (zh) | 一种基于云计算的日志生成方法及系统 | |
Caldarola et al. | Big data: A survey-the new paradigms, methodologies and tools | |
Chen et al. | Metadata-based information resource integration for research management | |
US20170195449A1 (en) | Smart proxy for datasources | |
Meoni et al. | Exploiting Apache Spark platform for CMS computing analytics | |
CN115168474B (zh) | 一种基于大数据模型的物联中台系统搭建方法 | |
US8930426B2 (en) | Distributed requests on remote data | |
CN115509693A (zh) | 一种基于集群Pod调度结合数据湖的数据优化方法 | |
CN114281494A (zh) | 数据全生命周期管理方法、系统、终端设备及存储介质 | |
KR20220054992A (ko) | Dcat 기반 메타데이터 변환 시스템 | |
Shao et al. | Optimization research of information management system based on big data technology | |
Dai et al. | The Hadoop stack: new paradigm for big data storage and processing | |
CN110928938B (zh) | 一种接口中间件系统 | |
Tian et al. | RETRACTED: Research on Big Data Analysis Platform of Power Grid Enterprise Accounting Based on Cloud Computing | |
CA2918472C (en) | A method and process for enabling distributing cache data sources for query processing and distributed disk caching of large data and analysis requests | |
Reddy et al. | Research issues on data warehouse maintenance | |
CN113515494B (zh) | 基于分布式文件系统的数据库处理方法和电子设备 | |
US20240045884A1 (en) | System and method for cloud-based replication of data |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |