基于内存队列的网站动态性能监控方法及系统与流程

文档序号:13909954阅读:226来源:国知局
基于内存队列的网站动态性能监控方法及系统与流程

本发明属于互联网技术领域,涉及对网站系统的监控技术,具体是指网站系统的动态性能监控系统。



背景技术:

现有的网站系统的动态性能监控系统,通常的实现方式为:采集完整的访问请求数据,并存储进数据库或者其他数据文件。在需要展示时,再从数据库或者数据文件中使用sql方式或者io流读写方式,获取到想要的数据,再行统计和计算。优点是:1、存入的信息量大,可以获取更多的请求相关数据,可以做更多扩展性的分析。2、数据可以持久化,保存较长的时间。3、获取数据后进行统计类计算相对简单。缺点是:1、数据存储入数据库或者数据文件需要额外依赖(数据库或者数据文件的依赖)。2、监控数据的读写,反应速度较慢,依赖于io性能,无法满足高并发的需求,监控系统的运行对网站系统运行的直接构成影响。3、监控系统相对重量级,监控系统需要额外部署。4、采用先行记录完整的访问请求数据,然后在性能分析时再从中提取有价值的信息用于分析的方式,监控并记录的包含大量分析计算时不会被使用到的数据,严重浪费了存储资源。同时,监控数据中还包含虽然会被使用但使用频率极低的数据,同样占用大量存储资源。



技术实现要素:

针对基于数据库或数据文件存储的网站系统动态性能监控反应慢等问题,本发明提出一种新的性能监控方法,基于该监控方法,监控系统即可以满足网站系统性能监控的一般需求,又不依赖数据库或者数据文件运行,反应快速,可以满足网站系统高并发需求。

本发明提出的具体技术方案是:一种基于内存队列的网站动态性能监控方法,在内存中创建一个定长的监控队列;针对网站系统的每一个访问请求,获取监控指标数据,并封装成经定义的数据结构对象,在监控队列中根据fifo规则保存一定数量的数据结构对象;当请求查看监控数据时,在内存中另外申请一块与监控队列大小相等的内存空间创建计算队列,将当前监控队列中的数据对象复制到计算队列,对计算队列中的数据对象进行处理并输出处理结果。

该监控方法针对访问请求定义一个通用的数据结构对象,包含请求资源uri、请求参数、请求客户端ip、请求时间、请求耗费时长等。在内存维护一个有界阻塞队列,按照队列fifo(先进先出)的规则对访问请求的数据结构对象进行存储,根据有界缓存区规则,可以保存一段时间内所有访问请求的执行情况。在请求查看时,临时申请一块内存空间,根据队列fifo排序的逻辑计算,把有界阻塞队列的内容重新计算,最后输出报表,从中可以看到各种性能情况,包含各个请求的最频繁的操作排序,最耗时的操作排序,历史操作记录等等。

本发明另一目的是进一步提出一种基于内存队列的网站动态性能监控系统,该监控系统包括请求触发模块、数据结构化模块、数据存储模块和输出计算模块。

所述请求触发模块,用于针对每一次访问请求分别在请求开始时和请求即将结束时两次触发性能监控系统,性能监控系统在被触发时临时获取系统控制权,获取请求信息并进行监控记录。

当网站系统接收一个新的http请求时,一次触发性能监控系统,性能监控系统暂时获取网站系统控制权,并且记录初始触发的时间,以服务器当前时间为准,精确到毫秒。性能监控系统获取当前http请求的线程thread,并把初始触发时间存入该线程,并向原系统移交控制权,系统继续执行。

当网站系统完成一个http请求时,二次触发性能监控系统,性能监控系统将暂时获取系统控制权,并且记录二次触发的时间,以服务器当前时间为准,精确到毫秒。性能监控系统将调用监控主程序,把整个访问请求的信息发送到数据结构化模块,并向原系统移交系统控制权,系统继续执行。

所述数据结构化模块,用于把访问请求的信息中和性能相关的信息抽取出来,并封装成方便进行性能计算和排序的数据结构对象,包括:

提取请求资源uri:获取当前http请求中request域的requesturi值。判断是否携带字符串,如果携带,则去除及以后的字符串。判断是否携带字符串;jsessionid,如果携带,则去除;jsessionid及以后的字符串。余下的值做为请求资源uri。

提取请求参数:获取当前http请求中request域的querystring值,当querystring不为空,则对其进行urldecoder编码,防止因为中文而出现的乱码问题。

提取客户端ip:取当前http请求中request域的x-forwarded-for值。如果为空,则依次尝试获取如下几个值:proxy-client-ip、wl-proxy-client-ip、http_client_ip、http_x_forwarded_for、remoteaddr。当获取到一个正确的ip,则停止余下几个值的尝试获取,获取到的ip做为正确的值。

提取请求时间:以初始触发时间为请求时间。

提取请求耗费时长:以初始触发时间和二次触发时间两者之间的差值做为请求耗费时长。

所述数据结构化模块向内存申请一块空间,创建一个固定数据结构funitem对象,把从访问请求的信息中提取的请求资源uri、请求参数、客户端ip、请求时间、请求耗费时长数据分别存入该数据对象。并将该数据对象发送给数据存储模块。

所述数据存储模块用于在内存中创建并维护一个定长的监控队列,并把结构化的数据对象存储入监控队列中;当存储空间满时,数据存储模块根据队列fifo原则,提出存入时间最早的数据对象。

所述数据存储模块接收到数据结构化模块发送过来的funitem对象后,判断是否为第一次接收数据,若是数据存储模块第一次接收数据,则在内存中申请一块空间,创建并维护一个定长的有界阻塞队列作为监控队列;所述数据存储模块调用数据存储方法,把funitem对象存储入监控队列;所述数据存储方法首先判断队列的长度是否是否到达临界点,如果到达临界点,则根据fifo原则去除队列头部首元素,并把funitem对象存入队列的列尾。

作为改进,为了保证监控队列(有界阻塞队列)的正常运行,防止因并发操作而造成的数据溢出,为数据存储方法加同步锁。

所述输出计算模块用于根据监控到的数据计算并输出性能监控结果;当用户请求查看监控数据时,所述输出计算模块根据当前监控队列的实际数据存储大小,在内存申请一个相同大小的空间,并创建计算队列,然后把监控队列中的当前数据复制到计算队列中,然后根据计算队列进行性能计算。

进一步地,所述输出计算模块由用户查看操作触发,性能计算前执行:

创建方法计数器列表,列表用于存储countitem对象,包含方法名、执行次数、最大耗时、最小耗时、平均耗时,并且设置默认排序字段为执行次数。

和创建历史列表,列表用于存储funitem对象,默认按照存入时间进行排序。

所述输出计算模块进行性能计算包括如下步骤:

步骤一、循环取出计算队列里的对象的步骤:根据计算队列fifo原则,从队列首元素开始,按顺序取出funitem对象,并循环执行第二、三步骤;

步骤二、存入历史列表:把funitem对象存入历史列表;

步骤三、存入方法计数器:首先判断funitem对象代表的方法在方法计数器内是否存在,如果funitem对象代表的方法在方法计数器内已经存在,则取出方法计数器里的countitem对象,对countitem对象进行更新:执行次数累积+1,判断当前funitem对象的耗费时间是否满足最大耗时和最小耗时的条件,如果满足则更新数值,重新计算平均耗时,最后把更新后的countitem对象存回方法计数器;

如果funitem对象代表的方法在方法计数器内不存在,则创建新的countitem对象,并设置方法名为funitem对象方法名,设置执行次数为1,最大耗时、最小耗时、平均耗时均为funitem对象的耗费时间,最后把countitem对象存入方法计数器;

步骤四、获取最频繁的操作排序:根据countitem对象定义的排序规则,调用collections的sort方法针对方法计数器进行排序获取根据执行次数按大到小排列顺序;

步骤五、获取最耗时的操作排序:根据funitem对象定义的排序规则,调用collections的sort方法针对历史列表进行排序获取根据耗费时间按大到小排列顺序;

步骤六、获取历史操作记录:默认历史列表即是按照时间顺序的操作记录列表。

本发明基于内存队列的动态监控系统基于被监控网站系统的服务器内存运行,具有如下优点:1、反应快,满足高并发需求,尽量减少对原系统的影响。2、系统运行要轻量级,不需要额外部署和资源依赖。3、设计基于内存的动态监控,只存储一定量的数据,不存储过多的历史监控数据,不需要定期清理。4、只采集必要的数据,只进行核心指标监控。5、设计有具有针对性的存储对象和存储队列,并可进行一定的逻辑计算,具有完整的性能监控功能。

附图说明

图1是本发明基于内存队列的网站动态性能监控系统工作流程框图。

图2是请求触发模块工作流程图。

图3是数据结构化模块工作流程框图。

图4是数据存储模块工作流程框图。

图5是输出计算模块工作流程框图。

具体实施方式

下面结合附图,对本发明所述基于内存队列的网站动态性能监控系统的工作原理做进一步说明。

本发明所述监控系统被配置在被监控网站系统的服务器中,依托服务器的内存实现运行,该监控系统主要包括请求触发模块、数据结构化模块、数据存储模块和输出计算模块四大功能模块。上述四大功能模块分别用于完成请求触发、数据结构化、数据存储、及输出计算四大流程步骤。该四大流程步骤一起构成本发明监控系统的一个完整的监控流程,如图1所示。下面分别对请求触发、数据结构化、数据存储、输出计算四个步骤的工作流程做出详细说明。

参照图2,所述请求触发步骤具体包括一次触发、一次触发时间存储、二次触发、调用主程序4个子步骤。

1、请求一次触发:当网站系统接收一个新的http请求时(一次触发),会触发性能监控系统,性能监控系统将暂时获取网站系统控制权,并且记录初始触发的时间,以服务器当前时间为准,精确到毫秒。

2、存储初始触发时间:性能监控系统会获取当前http请求的线程thread,并把初始触发时间存入该线程,并向原系统移交控制权,系统继续执行。

3、请求二次触发:当系统完成一个http请求时(二次触发),会二次触发性能监控系统,性能监控系统将暂时获取系统控制权,并且记录二次触发的时间,以服务器当前时间为准,精确到毫秒。

4、调用性能监控主程序:性能监控系统将调用监控主程序,把整个请求的信息发送到数据结构化模块,并向原系统移交系统控制权,系统继续执行。

参照图3,所述数据结构化步骤共包括下列7个子步骤。

1、获取请求资源uri:获取当前http请求中request域的requesturi值。判断是否携带字符串“”,如果携带,则去除“”以后的字符串(包含本身)。判断是否携带字符串“;jsessionid”,如果携带,则去除“;jsessionid”以后的字符串(包含;jsessionid本身)。余下的值即为请求资源uri。

2、获取请求参数:获取当前http请求中request域的querystring值,如果querystring不为空,则需要对其进行urldecoder编码,防止因为中文而出现的乱码问题。

3、获取请求客户端ip:获取当前http请求中request域的x-forwarded-for值。如果为空,则依次尝试获取如下几个值:proxy-client-ip、wl-proxy-client-ip、http_client_ip、http_x_forwarded_for、remoteaddr。每次尝试获取后,均进行判断是否获取到一个正确的ip,如果获取到一个正确的ip,则停止余下几个值的尝试获取,获取到的ip则为正确的值。

4、获取请求时间:以初始触发时间为请求时间。

5、获取请求耗费时长:根据初始触发时间和二次触发时间,两者之间的差值即为请求耗费时长。

6、申明数据结构对象:监控系统向内存申请一块空间,并创建固定数据结构funitem对象,并把前5步获取数据分别存入该数据对象。

7、发送数据结构对象:监控系统向数据存储模块发送funitem对象。

参照图4,所述数据存储步骤具体包括下列4个子步骤。

1、接收数据:接收到步骤二发送过来的funitem对象。判断:如果是数据存储模块第一次接收数据,则在内存中申请一块空间,创建并维护一个定长的有界阻塞队列作为监控队列。调用数据存储方法,把funitem对象传入监控队列。

2、数据存储方法加同步锁,为了保证监控队列(有界阻塞队列)的正常运行,防止因并发操作而造成的数据溢出,在数据存储方法加同步锁。

3、判断队列长度:数据存储方法首先判断队列的长度是否是否到达临界点,如果到达临界点,则根据fifo原则去除队列头部首元素。

4、把数据存入队列:在数据存储方法中把funitem对象存入队列的列尾。

参照图5,所述的输出计算步骤具体包括下列8个子步骤。

1、触发输出计算:根据用户查看操作触发,监控系统执行输出计算。

2、申请计算内存空间:根据现有监控队列的实际数据存储情况,在内存申请相同大小的空间,并创建计算队列,把监控队列中的数据复制入计算队列。

创建方法计数器列表,列表存储countitem对象,包含方法名、执行次数、最大耗时、最小耗时、平均耗时,并且设置默认排序字段为执行次数。

创建历史列表,列表存储funitem对象,默认按照存入时间进行排序。

3、循环取出计算队列里的对象:根据计算队列fifo原则,从队列首元素开始,按顺序取出funitem对象,并循环执行第4—第5步。

4、存入历史列表:把funitem对象存入历史列表。

5、存入方法计数器:首先判断funitem对象代表的方法在方法计数器内是否存在,如果funitem对象代表的方法在方法计数器内已经存在,则取出方法计数器里的countitem对象,对countitem对象进行更新:执行次数累积+1。判断当前funitem对象的耗费时间是否满足最大耗时和最小耗时的条件,如果满足则更新数值,重新计算平均耗时。最后把更新后的countitem对象存回方法计数器。

如果funitem对象代表的方法在方法计数器内不存在,则创建新的countitem对象,并设置方法名为funitem对象方法名,设置执行次数为1,设置最大耗时、最小耗时、平均耗时均为funitem对象的耗费时间。最后把countitem对象存入方法计数器。

6、获取最频繁的操作排序:根据countitem对象定义的排序规则,调用collections的sort方法针对方法计数器进行排序即可获取根据执行次数按大到小排列顺序。

7、获取最耗时的操作排序:根据funitem对象定义的排序规则,调用collections的sort方法针对历史列表进行排序即可获取根据耗费时间按大到小排列顺序。

8、获取历史操作记录:默认历史列表即是按照时间顺序的操作记录列表。

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