一种输出预警信息的方法和装置
技术领域
本发明涉及计算机技术领域,特别涉及一种输出预警信息的方法和装置。
背景技术
Java虚拟机Java Virtual Machine是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码,就可以在多种平台上不加修改地运行。基本上来说,可以将Java虚拟机当做是一种专为Java而生的特殊的操作系统,它的工作是管理运行Java应用程序的运行时环境。
Java虚拟机内存作为重要的运行资源,对于Java系统稳定运行和高效运行起到了关键的作用,Java虚拟机自动管理Java对象内存的分配以及对象内存的回收,这对于开发人员来说确实大大降低了编写程序的难度,但带来的一个副作用就是,在系统运行过程中很难知道什么时候可能会出现Java虚拟机抛出的内存异常,例如:内存溢出Out OfMemory Error和内存泄漏memory leak。所以,基于Java语言开发的应用系统在运行时,对Java虚拟机运行数据(特别是内存数据)的监控、管理,并且实现一套完整的提前预警报警机制是系统维护者和系统管理者一直期望的。
目前,有一些开源产品是针对Java虚拟机的内存运行进行监控的,例如,Javamelody等等。Java语言的软件开发工具包JDK(JavaDevelopment Kit)自带了故障检测工具Jconsole和后期的Jvisualvm都可以远程对Java虚拟机进行监控,后者甚至可以在线提供ThreadDump和HeapDump文件,以及提供了可扩展插件功能。但是,现在市面上还没有一套完整成熟的Java虚拟机内存监控的解决方案。很多企业基于这个方面的监控都是人工进行,这不仅造成大量人力的开支同时也无法保证监控的实时性,而且还无法做到提前预警。如果要对Java虚拟机内存使用进行不间断监控,并提前做出预警报警,就需要一个低延迟,可扩展,高可靠的处理引擎。传统的、典型的计算机分析和数据整理方式,首先是收集数据,然后储存在数据库程序中,通过调度批量任务来对数据库进行静态监控数据的搜索操作,以便找出相应的模型,再进行系统分析和数据挖掘。尽管这种方法比较有效,但通常也很耗时。对于时间及时性要求很高的监控领域,传统的计算机分析和数据整理方式显然无法满足要求。
现在,很多公司都有自己的运维团队,虽然使用了上述的Java虚拟机监控检测工具,但是某些时候未必会把查看Java虚拟机相关数据的权限交给Java系统的研发工程师。基于Java虚拟机内存监控的框架虽然众多,但是在使用过程中,也会带来一些问题:
1)类似于Javamelody一类的工具,它的入口仅仅是一个filter(过滤器),长时间使用会给运行中的Java应用带来性能问题;
2)如果维护的Java应用服务器很多,使用Java虚拟机监控工具会缺乏统一管理,此外安全性等等因素也是不可排除的。
3)现有的大多数Java虚拟机内存监控工具都是基于远程的操作,其原理是在目标服务器上形成快照文件,因为一般服务器上设置的Java虚拟机内存都比较大,生成的快照文件也比较大,通常做法是将对应的快照文件拷贝下来,通过其他可视化的工具进行分析,这样使用过程中很不方便,而且不具备预警报警的功能。
4)即便像JDK自带的可视化监控工具Jconsole,查看Java虚拟机内存使用的相关数据时也是会有时间上的延迟,并且人工7*24小时不间断的观察Java虚拟机内存运行情况也是不现实的。
5)现有的Java虚拟机内存的监控工具基本上不可能做到在Java虚拟机内存出现问题之前进行预判而进行提前预警告警。
发明内容
有鉴于此,本发明提供一种输出预警信息的方法和装置,能够在系统运行时,实时对系统运行时的内存使用数据进行采集和分析,并输出预警信息,从而实现了对系统内存使用的实时监控,不仅能够在系统内存出现问题之前进行预判而输出预警信息,同时还避免了大量人力资源的浪费,也在一定程度上提高了在安全监视等领域的决策速度和精度。
为实现上述目的,根据本发明的一个方面,提供了一种输出预警信息的方法。
本发明的输出预警信息的方法包括:数据分析中心每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据;所述运行数据包括系统标识、内存信息、以及数据时间;数据分析中心对所述运行数据中的内存信息进行计算,从而得到所述应用系统对应于所述数据时间的内存占用比;数据分析中心根据所述运行数据中的系统标识获取该应用系统的历史运行数据;所述历史运行数据包括报警阈值、累加值、以及连续次数;数据分析中心将所述内存占用比与所述历史运行数据进行比对,然后根据比对结果对该历史数据进行更新,并根据预设的预警条件以及更新后的历史数据输出预警信息。
可选地,数据分析中心对所述运行数据中的内存信息进行计算,从而得到所述应用系统对应于所述数据时间的内存占用比的步骤包括:按照接收顺序将所述运行数据存入分析队列;监听并获取所述分析队列中的运行数据;从所述运行数据中得到内存信息中所述应用系统的最大内存容量和所述数据时间所对应的内存使用容量;根据设定的计算公式计算得到所述应用系统的内存占用比;所述计算公式为:内存占用比=内存使用量/最大内存容量。
可选地,数据分析中心将所述内存占用比与所述历史运行数据进行比对,然后根据比对结果对该历史数据进行更新,并根据预设的预警条件以及更新后的历史数据给出预警信息的步骤包括:数据分析中心将所述内存占用比与该应用系统的报警阈值进行比对,如果内存占用比大于等于所述报警阈值,则在累加值的基础上加一得到更新后的累加值;当更新后的累加值达到所述连续次数时,则输出预警信息;如果所述内存占用比小于所述报警阈值,则对累加值进行清零。
可选地,数据分析中心每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据的步骤之后包括:将所述运行数据按照系统标识存入数据库,并根据预警信息提供对应于系统标识的运行数据。
可选地,数据分析中心每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据的步骤之后包括:确定所接收到的运行数据的格式与预设的数据格式相同。
根据本发明的另一方面,提供一种输出预警信息的装置。
本发明的输出预警信息的装置,该装置设置于数据分析中心,包括:接收模块,用于每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据;所述运行数据包括系统标识、内存信息、以及数据时间;计算模块,用于对所述运行数据中的内存信息进行计算,从而得到所述应用系统对应于所述数据时间的内存占用比;获取模块,用于根据所述运行数据中的系统标识获取该应用系统的历史运行数据;所述历史运行数据包括报警阈值、累加值、以及连续次数;信息输出模块,用于将所述内存占用比与所述历史运行数据进行比对,然后根据比对结果对该历史数据进行更新,并根据预设的预警条件以及更新后的历史数据输出预警信息。
可选地,所述计算模块还用于:按照接收顺序将所述运行数据存入分析队列;监听并获取所述分析队列中的运行数据;从所述运行数据中得到内存信息中所述应用系统的最大内存容量和所述数据时间所对应的内存使用容量;根据设定的计算公式计算得到所述应用系统的内存占用比;所述计算公式为:内存占用比=内存使用量/最大内存容量。
可选地,所述信息输出模块还用于:将所述内存占用比与该应用系统的报警阈值进行比对,如果内存占用比大于等于所述报警阈值,则在累加值的基础上加一得到更新后的累加值;当更新后的累加值达到所述连续次数时,则输出预警信息;如果所述内存占用比小于所述报警阈值,则对累加值进行清零。
可选地,还包括存储模块,用于将所述运行数据按照系统标识存入数据库,并根据预警信息提供对应于系统标识的运行数据。
可选地,还包括格式确认模块,用于确定所接收到的运行数据的格式与预设的数据格式相同。
根据本发明的技术方案,通过对接收到的系统运行时的内存使用数据进分析,不仅实现了对系统内存使用的实时监控,而且能够在系统内存出现问题之前进行预判而输出预警信息;同时,由于并行增加了对所接收数据的存储功能,因而,为查找和分析应用系统的相关运行信息提供了数据支持;同时还避免了大量人力资源的浪费,也在一定程度上提高了在安全监视等领域的决策速度和精度。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的一种输出预警信息的方法的示意图;
图2是根据本发明实施例的一种输出预警信息的装置的示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施例的一种输出预警信息的方法的示意图。如图1所示,该方法由数据分析中心作为执行主体,主要步骤包括S10至S13。
步骤S10:数据分析中心每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据。在该步骤中,客户端安装于所要监控的应用系统中,当应用系统启动时,客户端开始每隔设定的周期(例如,设定的周期为5秒)获取所在应用系统的运行数据;然后客户端将获取到的运行数据发送给数据分析中心;数据分析中心对所接收到的运行数据的格式进行确认,如果收到的运行数据的格式与预设的数据格式相同,则继续对该运行数据进行处理,否则,直接将运行数据丢弃;然后数据分析中对运行数据并行进行两种处理,一种是将所述运行数据按照系统标识存入数据库,并在数据分析中心输出预警信息后,根据预警信息提供对应于系统标识的运行数据,为查找和分析应用系统的相关运行信息提供了数据支持;另一种是执行步骤S11至S13;其中,运行数据包括系统标识、内存信息、以及数据时间;系统标识为唯一标识一个系统的信息,比如系统的IP地址;内存信息包括该系统的最大内存容量和在数据时间所对应的该系统的内存使用量;数据时间即为获取该系统内存使用容量的时间点。
步骤S11:数据分析中心对所述运行数据中的内存信息进行计算,从而得到所述应用系统对应于所述数据时间的内存占用比。数据接收中心接收到客户端发来的运行数据后,按照接收顺序将所述运行数据存入分析队列,此分析队列为数据缓存队列,并且在该缓存队列的出口设置有监听线程,用于监听并获取所述分析队列中的运行数据,当监听线程监听到分析队列中有运行数据时,立即获取该运行数据,并从运行数据中的内存信息中得到所述应用系统的最大内存容量和所述数据时间所对应的内存使用容量;然后根据设定的计算公式计算得到所述应用系统的内存占用比;所述计算公式为:内存占用比=内存使用量/最大内存容量。
步骤S12:数据分析中心根据所述运行数据中的系统标识获取该应用系统的历史运行数据。在此步骤中,数据分析中心根据运行数据中的系统标识查找系统标识所对应的应用系统的历史运行数据,其中,历史运行数据包括报警阈值、累加值、以及连续次数。
步骤S13:数据分析中心将所述内存占用比与所述历史运行数据进行比对,然后根据比对结果对该历史数据进行更新,并根据预设的预警条件以及更新后的历史数据输出预警信息。在此步骤中,数据分析中心将步骤S11中计算得到的内存占用比与步骤S12中得到的该应用系统的报警阈值进行比对,如果内存占用比大于等于所述报警阈值,则在累加值的基础上加一得到更新后的累加值;当更新后的累加值达到所述连续次数时,则输出预警信息;如果所述内存占用比小于所述报警阈值,则对累加值进行清零。
下面以Java系统运行中虚拟机为例,对本发明实施例的技术方案做详细的说明,该实施例的技术方案实现了在Java虚拟机内存使用即将出现异常时第一时间输出预警信息,达到报警的目的;其中,Profiler包即为客户端。
Profiler包被引入在Java应用系统中,当Java应用系统启动时,profiler包调用JDK自带的方法获取以下数据:服务器IP、jvm最大内存容量。Profiler包启动自身的定时器,每次间隔5秒调用JDK自带的方法获取当前JVM运行时内存使用大小的数据。
Profiler以JSON格式组装以下数据,然后实时发送到数据分析中心:
服务器IP:ServerIp;
jvm最大内存容量:MaxMemory(单位:Mb);
JVM运行时内存使用大小:UsedMemory(单位:Mb);
数据时间:DataTime(精确到秒);
以JSON格式拼装数据后如下:
{ServerIp:10.10.10.1,MaxMemory:512,UsedMemory:128,DataTime:yyyyMMddHHmmss};
在本实施例中,Profiler采用TCP/IP网络协议将JSON数据发送到数据分析中心的接口。
数据分析中心接收来自N个Profiler发送的JSON数据,并解析数据,判断所接收的数据的格式与预设的数据格式是否相同,相同则继续对接收的数据进行处理,否则,丢弃该数据。
为了保证数据处理的实时性,数据分析中心采用了Pipeline的设计模式,数据分析中心完成数据接收解析后,把数据放在本地缓存队列中。该模式采用一种流水式的管道模型把接收到的不同客户端传来的数据组成一条直线的工作数据流,根据先进先出的机制进行排队,在队列出口端得到唯一的最终输出。数据与数据之间没有任何关联关系,降低了数据之间的耦合程度。本实施例在对数据进行分析的时候,采用这种Pipeline的模型,同时可以接受多元的数据流和输入,保证处理速度最快。
与此同时,针对于同一条数据,并行的放在两个不同队列中进行处理,即数据存储队列和数据分析队列,将存储和分析这两个不同处理逻辑的业务进行分离,如果其中的一个业务在处理过程中出现故障,那么另一个业务依然可以进行,业务(即存储业务和分析业务)之间互相不影响,因而,降低了处理失败的风险。
在数据分析中心的缓存队列的出口一端,采用多线程监听的方式对队列中的数据监听,只要还有任务在处理队列中,处理线程及时从队列中获得任务并进行及时处理。
针对于流程中的存储业务逻辑,将Java虚拟机运行时的内存数据按照源数据的基本格式存储在hbase组件中,可以被其他的所有组件访问,实现数据共享,并对运行数据的查询提供了数据基础。
在分析预警报警的业务逻辑中,先实时计算出Java虚拟机内存使用的占比,计算规则为:UsedMemory/MaxMemory,然后按照IP为条件,查询redis缓存中该IP的报警阈值和连续次数;其中,报警阈值为设定的内存占用比的警戒值,连续次数则是记录达到报警阈值的一个连续性的数值,此时分为两种情况:
1)如果实时计算出的内存占比大于该IP的报警阈值规则,则进行一次累加计数。当这个累加的计数值达到连续次数时,则判定该IP的Java虚拟机内存使用达到了预警报警的条件,那么需要调用报警中心的接口进行预警报警。
2)如果实时计算出的内存占比小于该IP的报警阈值规则,那么对累加计数的值进行清零。
假设,本实施例中Profiler采集数据的频率为5秒,并且估算网络延迟和数据处理的时间为2秒的话,那么按照本发明实施例的技术方案,数据分析中心最快的情况下能在7秒内发现Java虚拟机内存使用异常,并进行预警和报警,从而到达本方案需要实现的目标,就是在即将出现异常时第一时间进行预警,并且可以不间断的对Java虚拟机的内存使用进行监控和管理。
图2是根据本发明实施例的一种输出预警信息的装置的示意图。如图2所述,该装置设置于数据分析中心,所述输出预警信息的装置20主要包括:接收模块21、计算模块22、获取模块23、以及信息输出模块24;接收模块21用于每隔设定的周期接收客户端所获取的当前监控的应用系统的运行数据;所述运行数据包括系统标识、内存信息、以及数据时间;计算模块22用于对所述运行数据中的内存信息进行计算,从而得到所述应用系统对应于所述数据时间的内存占用比;获取模块23用于根据所述运行数据中的系统标识获取该应用系统的历史运行数据;所述历史运行数据包括报警阈值、累加值、以及连续次数;信息输出模块24用于将所述内存占用比与所述历史运行数据进行比对,然后根据比对结果对该历史数据进行更新,并根据预设的预警条件以及更新后的历史数据输出预警信息。
本发明实施例的输出预警信息的装置20的计算模块22还可用于:按照接收顺序将所述运行数据存入分析队列;监听并获取所述分析队列中的运行数据;从所述运行数据中得到内存信息中所述应用系统的最大内存容量和所述数据时间所对应的内存使用容量;根据设定的计算公式计算得到所述应用系统的内存占用比;所述计算公式为:内存占用比=内存使用量/最大内存容量。
本发明实施例的输出预警信息的装置20的信息输出模块24还可用于:将所述内存占用比与该应用系统的报警阈值进行比对,如果内存占用比大于等于所述报警阈值,则在累加值的基础上加一得到更新后的累加值;当更新后的累加值达到所述连续次数时,则输出预警信息;如果所述内存占用比小于所述报警阈值,则对累加值进行清零。
本发明实施例的输出预警信息的装置20还可包括存储模块(图中未示出),用于将所述运行数据按照系统标识存入数据库,并根据预警信息提供对应于系统标识的运行数据。
本发明实施例的输出预警信息的装置20还可包括格式确认模块(图中未示出),用于确定所接收到的运行数据的格式与预设的数据格式相同。
根据本发明实施例的技术方案,通过对接收到的系统运行时的内存使用数据进分析,不仅实现了对系统内存使用的实时监控,而且能够在系统内存出现问题之前进行预判而输出预警信息;同时,由于并行增加了对所接收数据的存储功能,因而,为查找和分析应用系统的相关运行信息提供了数据支持;同时还避免了大量人力资源的浪费,也在一定程度上提高了在安全监视等领域的决策速度和精度。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。