用于预测性诊断的方法和装置转让专利

申请号 : CN201480020584.7

文献号 : CN105190564B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : E·S·钱R·阿哈德A·戈内米A·C·圣托斯

申请人 : 甲骨文国际公司

摘要 :

数据可以被归类为事实、信息、假设和指令。通过应用知识、基于某些类别的数据产生其他类别的数据的活动可以被归类为分类、评估、解析和实施。活动可以由分类‑评估‑解析‑实施(CARE)控制引擎驱动。CARE控制和这些归类可以用于诸如通过历史记录保存、机器学习和自动化来增强众多系统,例如诊断系统。这种诊断系统可以包括基于将知识应用于系统生命表征(诸如线程或栈段强度和内存堆使用)来预报计算系统故障的系统。这些生命表征是可以被分类为生成诸如内存泄漏、护送效应或其它问题之类的信息的事实。分类可以涉及类、状态、观察、预测、规范、目标的自动产生以及具有不规则持续时间的采样间隔的处理。

权利要求 :

1.一种计算机实现的用于预测性诊断的方法,包括:通过在一系列时间间隔中的每个特定时间间隔期间产生分开的线程转储,获得一系列线程转储样本;

基于所述一系列线程转储样本,产生一组栈段分类,其中,产生所述一组栈段分类包括:识别第一栈段内的第一组栈框架,所述第一组栈框架中的每个栈框架均具有对应的强度值;

确定所述第一栈段内的所述第一组栈框架的对应的强度随着时间发散超出指定的阈值;

基于确定所述第一栈段内的所述第一组栈框架的对应的强度随着时间发散超出指定的阈值,将所述第一栈段划分为多个组成栈段;和对于所述多个组成栈段中的每个组成栈段产生新栈段分类;

对于所述一系列线程转储样本中所表示的每个特定线程,至少部分基于特定栈段中的代码块的调用数量乘以所述代码块的执行时间,从所述一组栈段分类选择用于所述特定线程的特定栈段分类;

通过测量资源的变化速率,确定所述一组栈段分类中的每个栈段分类的趋势,由此产生一组趋势,所述一组趋势中的每个趋势均表示资源的变化速率;

确定具有大于所述一组趋势中所表示的预测误差残留偏差的移动平均值的指定百分比的预测误差残留的一组异常;和至少部分基于所述一组异常来产生输出。

2.根据权利要求1所述的方法,还包括:

确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器是否分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同;

响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同,阻止第二线程转储中所表示的线程被计数用于强度统计。

3.根据权利要求2所述的方法,还包括:

确定第一线程转储中所表示的线程的CPU时间与第二线程转储中所表示的线程的CPU时间相同;和响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同并且第一线程转储中所表示的线程的CPU时间与第二线程转储中所表示的线程的CPU时间相同,将第一线程转储和第二线程转储中所表示的同一线程识别为黏联线程。

4.根据权利要求3所述的方法,还包括:

至少部分基于第一线程在所述一系列线程转储样本中的分开的线程转储样本内的多个CPU时间没有变化,确定第一线程是黏联的。

5.根据权利要求2所述的方法,还包括:

确定第一线程转储中所表示的线程的CPU时间不同于第二线程转储中所表示的线程的CPU时间;和响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同并且第一线程转储中所表示的线程的CPU时间不同于第二线程转储中所表示的线程的CPU时间,将第一线程转储和第二线程转储中所表示的同一线程识别为拖延线程。

6.根据权利要求5所述的方法,还包括:

至少部分基于第一线程在所述一系列线程转储样本中的分开的线程转储样本内的多个线程名称、执行上下文ID(ECID)或历元计数器没有变化,确定第一线程是拖延的。

7.根据权利要求1所述的方法,还包括:

维护所述一系列线程转储样本中的线程转储样本的第一采样间隔的第一强度统计;

响应于确定特定线程在第一采样间隔和所述一系列线程转储样本中的线程转储样本的第二采样间隔上被确定为黏联或拖延,调整第二采样间隔的第二强度统计,其中,第二采样间隔避免重复计数黏联线程或拖延线程。

8.根据权利要求1所述的方法,其中,从所述一组栈段分类选择用于所述特定线程的特定栈段分类的步骤包括:确定特定栈踪迹中的特定栈框架的强度值;

确定紧接在所述特定栈踪迹中的所述特定栈框架之前出现的前承栈框架的强度值;

确定紧接在所述特定栈踪迹中的所述特定栈框架之后出现的后继栈框架的强度值;

响应于确定所述特定栈框架的强度值与所述前承栈框架的强度值相同,将特定分类分配给所述特定栈框架和所述前承栈框架两者;和响应于确定所述特定栈框架的强度值与所述后继栈框架的强度值相同,将所述特定分类分配给所述特定栈框架和所述后继栈框架两者。

9.根据权利要求1所述的方法,还包括:

创建新的栈段信息项;

将所述新的栈段信息项分配给当前栈段信息项的值;

响应于所述新的栈段信息项的分类,产生新的季节性趋势信息项;和将所述当前栈段信息项的趋势属性的值设置为所述新的季节性趋势信息项。

10.根据权利要求1所述的方法,还包括:

将合并的栈段划分为第一新栈段和第二新栈段;

创建所述合并的栈段的季节性趋势信息项的第一克隆;

创建所述合并的栈段的季节性趋势信息项的第二克隆;

将所述第一新栈段的趋势属性的值设置为所述第一克隆;和将所述第二新栈段的趋势属性的值设置为所述第二克隆。

11.根据权利要求1所述的方法,还包括:

至少部分基于一串栈段分类,产生线程分类;

其中所述一组异常包括以下中的至少一个:等级尖峰、等级移位、等级漂移、方差变化、饱和、黏联线程、拖延线程、死锁状况、拥塞上游、拥塞下游、资源池中的拥塞、护送效应、阻抗失配、离群测量或离群测量的突发。

12.根据权利要求11所述的方法,还包括:

产生一组线程分类;

至少部分基于线程之间的调用链、依赖链以及客户端-服务器链之一,产生一串线程的分类。

13.根据权利要求1所述的方法,还包括:

通过将所述一组栈段分类中的一个或多个栈段分类分配给某一维度来组织所述一个或多个栈段分类;

设置所述特定栈段分类的名称;和

设置特定维度的名称。

14.根据权利要求13所述的方法,还包括:

通过获取所述特定栈段分类被分配的维度的叉积来下挖到所述特定栈段分类的类层次结构。

15.根据权利要求13所述的方法,还包括:

至少部分基于默会知识,将所述一个或多个栈段分类分配给维度,分配给以下中的至少一个:域维度、服务器维度、信道维度、应用维度、库维度以及操作维度。

16.根据权利要求15所述的方法,还包括:

至少部分基于所述默会知识来设置所述特定栈段分类的名称;和至少部分基于所述默会知识来设置特定维度的名称;

其中,至少部分基于默会知识,分配给维度,分配给以下中的至少一个:域维度、服务器维度、信道维度、应用维度、库维度以及操作维度。

17.根据权利要求1所述的方法,还包括:

基于人类默会知识来对一个或多个栈段进行分类;

至少部分基于所述人类默会知识来将一个或多个分类分配给一个或多个维度。

18.根据权利要求1所述的方法,还包括:

至少部分基于归纳学习处理,将所述一组栈段分类中的一个或多个栈段分类分配给在产生所述一个或多个栈段分类之前定义的一个或多个维度。

19.根据权利要求1所述的方法,还包括:

存储包括多个子类的依赖关系的广义依赖关系,所述多个子类的依赖关系中的每个依赖关系包括客户端部分和服务器部分;

对特定子类依赖关系的广义客户端部分下挖到强度高于所述特定子类的广义服务器部分的客户端部分;和对所述特定子类依赖关系的广义服务器部分下挖到强度高于所述特定子类的广义客户端部分的服务器部分。

20.根据权利要求1所述的方法,还包括:

至少部分基于默会知识,产生线程依赖关系的知识基础;和至少部分基于所述线程依赖关系,使至少一个发生越过一对服务实体相互关联,以作为分析问题的根本原因的一部分;

其中,所述一对服务实体是以下中的至少一个:一对客户端和服务器、一对服务器或一对客户端。

21.根据权利要求20所述的方法,还包括:

至少部分基于所述一对服务实体之间的信道,执行阻抗匹配;

其中,所述信道支持用于所述一对服务实体中的第一服务实体的栈段类和用于所述一对服务实体中的第二服务实体的栈段类之间的客户端-服务器依赖关系。

22.根据权利要求1所述的方法,还包括:

基于栈段的子分类的栈段强度的组成,确定所述特定栈段分类的栈段强度;和将所述特定栈段分类的栈段的期望响应时间分割为栈段的子分类的栈段的响应时间;

其中,分割期望响应时间的步骤至少部分基于栈段强度的组成。

23.一种用于预测性诊断的装置,包括:

用于通过在一系列时间间隔中的每个特定时间间隔期间产生分开的线程转储,获得一系列线程转储样本的单元;

用于基于所述一系列线程转储样本而产生一组栈段分类的单元,其中,产生所述一组栈段分类包括:识别第一栈段内的第一组栈框架,所述第一组栈框架中的每个栈框架均具有对应的强度值;

确定所述第一栈段内的所述第一组栈框架的对应的强度随着时间发散超出指定的阈值;

基于确定所述第一栈段内的所述第一组栈框架的对应的强度随着时间发散超出指定的阈值,将所述第一栈段划分为多个组成栈段;和对于所述多个组成栈段中的每个组成栈段产生新栈段分类;

用于对于所述一系列线程转储样本中所表示的每个特定线程,至少部分基于特定栈段中的代码块的调用数量乘以所述代码块的执行时间,从所述一组栈段分类选择用于所述特定线程的特定栈段分类的单元;

用于通过测量资源的变化速率,确定所述一组栈段分类中的每个栈段分类的趋势,由此产生一组趋势的单元,所述一组趋势中的每个趋势均表示资源的变化速率;

用于确定具有大于所述一组趋势中所表示的预测误差残留偏差的移动平均值的指定百分比的预测误差残留的一组异常的单元;和用于至少部分基于所述一组异常来产生输出的单元。

24.根据权利要求23所述的装置,还包括:

用于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器是否分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同的单元;

用于响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同,阻止第二线程转储中所表示的线程被计数用于强度统计的单元。

25.根据权利要求24所述的装置,还包括:

用于确定第一线程转储中所表示的线程的CPU时间与第二线程转储中所表示的线程的CPU时间相同的单元;和用于响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同并且第一线程转储中所表示的线程的CPU时间与第二线程转储中所表示的线程的CPU时间相同,将第一线程转储和第二线程转储中所表示的同一线程识别为黏联线程的单元。

26.根据权利要求25所述的装置,还包括:

用于至少部分基于第一线程在所述一系列线程转储样本中的分开的线程转储样本内的多个CPU时间没有变化,确定第一线程是黏联的的单元。

27.根据权利要求24所述的装置,还包括:

用于确定第一线程转储中所表示的线程的CPU时间不同于第二线程转储中所表示的线程的CPU时间的单元;和用于响应于确定第一线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器分别与第二线程转储中所表示的线程的线程名称、执行上下文ID(ECID)或历元计数器相同并且第一线程转储中所表示的线程的CPU时间不同于第二线程转储中所表示的线程的CPU时间,将第一线程转储和第二线程转储中所表示的同一线程识别为拖延线程的单元。

28.根据权利要求27所述的装置,还包括:

用于至少部分基于第一线程在所述一系列线程转储样本中的分开的线程转储样本内的多个线程名称、执行上下文ID(ECID)或历元计数器没有变化,确定第一线程是拖延的的单元。

29.根据权利要求23所述的装置,还包括:

用于维护所述一系列线程转储样本中的线程转储样本的第一采样间隔的第一强度统计的单元;

用于响应于确定特定线程在第一采样间隔和所述一系列线程转储样本中的线程转储样本的第二采样间隔上被确定为黏联或拖延,调整第二采样间隔的第二强度统计的单元,其中,第二采样间隔避免重复计数黏联线程或拖延线程。

30.根据权利要求23所述的装置,其中,用于从所述一组栈段分类选择用于所述特定线程的特定栈段分类的单元包括:用于确定特定栈踪迹中的特定栈框架的强度值的单元;

用于确定紧接在所述特定栈踪迹中的所述特定栈框架之前出现的前承栈框架的强度值的单元;

用于确定紧接在所述特定栈踪迹中的所述特定栈框架之后出现的后继栈框架的强度值的单元;

用于响应于确定所述特定栈框架的强度值与所述前承栈框架的强度值相同,将特定分类分配给所述特定栈框架和所述前承栈框架两者的单元;和用于响应于确定所述特定栈框架的强度值与所述后继栈框架的强度值相同,将所述特定分类分配给所述特定栈框架和所述后继栈框架两者的单元。

31.根据权利要求23所述的装置,还包括:

用于创建新的栈段信息项的单元;

用于将所述新的栈段信息项分配给当前栈段信息项的值的单元;

用于响应于所述新的栈段信息项的分类,产生新的季节性趋势信息项的单元;和用于将所述当前栈段信息项的趋势属性的值设置为所述新的季节性趋势信息项的单元。

32.根据权利要求23所述的装置,还包括:

用于将合并的栈段划分为第一新栈段和第二新栈段的单元;

用于创建所述合并的栈段的季节性趋势信息项的第一克隆的单元;

用于创建所述合并的栈段的季节性趋势信息项的第二克隆的单元;

用于将所述第一新栈段的趋势属性的值设置为所述第一克隆的单元;和用于将所述第二新栈段的趋势属性的值设置为所述第二克隆的单元。

33.根据权利要求23所述的装置,还包括:

用于至少部分基于一串栈段分类,产生线程分类的单元;

其中所述一组异常包括以下中的至少一个:等级尖峰、等级移位、等级漂移、方差变化、饱和、黏联线程、拖延线程、死锁状况、拥塞上游、拥塞下游、资源池中的拥塞、护送效应、阻抗失配、离群测量或离群测量的突发。

34.根据权利要求33所述的装置,还包括:

用于产生一组线程分类的单元;

用于至少部分基于线程之间的调用链、依赖链以及客户端-服务器链之一,产生一串线程的分类的单元。

35.根据权利要求23所述的装置,还包括:

用于通过将所述一组栈段分类中的一个或多个栈段分类分配给某一维度来组织所述一个或多个栈段分类的单元;

用于设置所述特定栈段分类的名称的单元;和

用于设置特定维度的名称的单元。

36.根据权利要求35所述的装置,还包括:

用于通过获取所述特定栈段分类被分配的维度的叉积来下挖到所述特定栈段分类的类层次结构的单元。

37.根据权利要求35所述的装置,还包括:

用于至少部分基于默会知识,将所述一个或多个栈段分类分配给维度的单元,分配给以下中的至少一个:域维度、服务器维度、信道维度、应用维度、库维度以及操作维度。

38.根据权利要求37所述的装置,还包括:

用于至少部分基于所述默会知识来设置所述特定栈段分类的名称的单元;和用于至少部分基于所述默会知识来设置特定维度的名称的单元;

其中,至少部分基于默会知识,分配给维度,分配给以下中的至少一个:域维度、服务器维度、信道维度、应用维度、库维度以及操作维度。

39.根据权利要求23所述的装置,还包括:

用于基于人类默会知识来对一个或多个栈段进行分类的单元;

用于至少部分基于所述人类默会知识来将一个或多个分类分配给一个或多个维度的单元。

40.根据权利要求23所述的装置,还包括:

用于至少部分基于归纳学习处理,将所述一组栈段分类中的一个或多个栈段分类分配给在产生所述一个或多个栈段分类之前定义的一个或多个维度的单元。

41.根据权利要求23所述的装置,还包括:

用于存储包括多个子类的依赖关系的广义依赖关系的单元,所述多个子类的依赖关系中的每个依赖关系包括客户端部分和服务器部分;

用于对特定子类依赖关系的广义客户端部分下挖到强度高于所述特定子类的广义服务器部分的客户端部分的单元;和用于对所述特定子类依赖关系的广义服务器部分下挖到强度高于所述特定子类的广义客户端部分的服务器部分的单元。

42.根据权利要求23所述的装置,还包括:

用于至少部分基于默会知识,产生线程依赖关系的知识基础的单元;和用于至少部分基于所述线程依赖关系,使至少一个发生越过一对服务实体相互关联,以作为分析问题的根本原因的一部分的单元;

其中,所述一对服务实体是以下中的至少一个:一对客户端和服务器、一对服务器或一对客户端。

43.根据权利要求42所述的装置,还包括:

用于至少部分基于所述一对服务实体之间的信道,执行阻抗匹配的单元;

其中,所述信道支持用于所述一对服务实体中的第一服务实体的栈段类和用于所述一对服务实体中的第二服务实体的栈段类之间的客户端-服务器依赖关系。

44.根据权利要求23所述的装置,还包括:

用于基于栈段的子分类的栈段强度的组成,确定所述特定栈段分类的栈段强度的单元;和用于将所述特定栈段分类的栈段的期望响应时间分割为栈段的子分类的栈段的响应时间的单元;

其中,分割期望响应时间至少部分基于栈段强度的组成。

说明书 :

用于预测性诊断的方法和装置

[0001] 优先权
[0002] 在35U.S.C.§119(e)下,本申请还要求以下申请的优先权:2013年4月11日提交的美国临时专利申请No.61/811106,标题为“PREDICTIVE DIAGNOSIS OF SLA VIOLATIONS IN CLOUD SERVICES BY SEASONAL TRENDING AND FORECASTING WITH THREAD INTENSITY 
ANALYTICS”,其内容通过引用并入本文;以及2013年12月17日提交的美国专利申请No.14/
109578,标题为“PREDICTIVE DIAGNOSIS OF SLA VIOLATIONS IN CLOUD SERVICES BY 
SEASONAL TRENDING AND FORECASTING WITH THREAD INTENSITY ANALYTICS”,其内容通过引用并入本文。在35U.S.C.§119(e)下,本申请还要求以下申请的优先权:2013年4月11日提交的美国临时专利申请No.61/811102,标题为“SEASONAL TRENDING,FORECASTING,ANOMALY DETECTION,AND ENDPOINT PREDICTION OF JAVA HEAP USAGE”,其内容通过引用并入本文;
以及2013年12月17日提交的美国专利申请No.14/109546,标题为“SEASONAL TRENDING,
FORECASTING,ANOMALY DETECTION,AND ENDPOINT PREDICTION OF JAVA HEAP USAGE”,其内容通过引用并入本文。在35U.S.C.§119(e)下,本申请要求以下申请的优先权:2013年10月1日提交的美国临时专利申请No.61/885424,标题为“DATA DRIVEN BUSINESS PROCESS 
AND CASE MANAGEMENT”,其内容通过引用并入本文;以及2013年12月17日提交的美国专利申请No.14/109651,标题为“KNOWLEDGE INTENSIVE DATA MANAGEMENT SYSTEM FOR 
BUSINESS PROCESS AND CASE MANAGEMENT”,其内容通过引用并入本文。

技术领域

[0003] 本发明涉及通过用线程强度分析进行季节性趋向和预报来对云服务中的SLA违反进行用于预测性诊断。

背景技术

[0004] 个体和组织面临数量快速增长的数据。这种数据在复杂性和紧迫性方面可能快速增加。个体和组织经常需要分析这些数据以便按照数据以适当且及时的方式行动。在一些
领域中,个体和组织所采取的行动由同样趋于变得越来越复杂的规则管理。例如,如果某种问题可能会发生,则规则可以要求维护对审计敏感的谨慎的历史记录。可替代地,在企业组织之间签订的服务等级协议(service level agreement,SLA)可能要求:系统地分析数据,并且主动地按照数据中的可行动信息行动,以避免SLA违反以及确定协议是否满足。遵照规则,服务等级协议和其它要求可能非常繁重,并且可能随着时间的过去而变得越来越繁重。
[0005] 因为监管要求和SLA要求已经变得如此的复杂度,所以计算机软件适用于帮助个体和组织尽力遵从要求。然而,由于规则和SLA趋向于演进,所以计算机软件本身也需要紧跟步伐地演进。不幸的是,用于开发和更新计算机软件的惯用过程缓慢且笨重。软件开发周期通常较长。烦扰计算机软件演进的这些困难可能部分归因于这一事实:数据经常被隐藏
在程序性软件代码中。数据经常与可以应用于该数据的知识分离。

发明内容

[0006] 根据本发明的一个方面,提供了一种计算机实现的用于预测性诊断的方法,包括:通过在一系列时间间隔中的每个特定时间间隔期间产生分开的线程转储,获得一系列线程
转储样本;基于所述一系列线程转储样本,产生一组栈段分类;对于所述一系列线程转储样本中所表示的每个特定线程,至少部分基于特定栈段中的代码块的调用数量乘以所述代码
块的执行时间,从所述一组栈段分类选择用于所述特定线程的特定栈段分类;通过测量资
源的变化速率,确定所述一组栈段分类中的每个栈段分类的趋势,由此产生一组趋势,所述一组趋势中的每个趋势均表示资源的变化速率;确定具有大于所述一组趋势中所表示的预
测误差残留偏差的移动平均值的指定百分比的预测误差残留的一组异常;和至少部分基于
所述一组异常来产生输出。其中,产生所述一组栈段分类包括:识别第一栈段内的第一组栈框架,所述第一组栈框架中的每个栈框架均具有对应的强度值;确定所述第一栈段内的所
述第一组栈框架的对应的强度随着时间发散超出指定的阈值;基于确定所述第一栈段内的
所述第一组栈框架的对应的强度随着时间发散超出指定的阈值,将所述第一栈段划分为多
个组成栈段;和对于所述多个组成栈段中的每个组成栈段产生新栈段分类。
[0007] 根据本发明的另一个方面,提供了一种装置,包括:用于通过在一系列时间间隔中的每个特定时间间隔期间产生分开的线程转储,获得一系列线程转储样本的单元;用于基于所述一系列线程转储样本而产生一组栈段分类的单元;用于对于所述一系列线程转储样
本中所表示的每个特定线程,至少部分基于所述特定栈段中的代码块的调用数量乘以所述
代码块的执行时间,从所述一组栈段分类选择用于所述特定线程的特定栈段分类的单元;
用于通过测量资源的变化速率,确定所述一组栈段分类中的每个栈段分类的趋势,由此产
生一组趋势的单元,所述一组趋势中的每个趋势均表示资源的变化速率;用于确定具有大
于所述一组趋势中所表示的预测误差残留偏差的移动平均值的指定百分比的预测误差残
留的一组异常的单元;和用于至少部分基于所述一组异常来产生输出的单元。其中,产生所述一组栈段分类包括:识别第一栈段内的第一组栈框架,所述第一组栈框架中的每个栈框
架均具有对应的强度值;确定所述第一栈段内的所述第一组栈框架的对应的强度随着时间
发散超出指定的阈值;基于确定所述第一栈段内的所述第一组栈框架的对应的强度随着时
间发散超出指定的阈值,将所述第一栈段划分为多个组成栈段;和对于所述多个组成栈段
中的每个组成栈段产生新栈段分类。

附图说明

[0008] 图1A-1B示出了例示根据本发明实施例的用于应用线程或栈段(stack segment)强度分析的技术示例的流程图。
[0009] 图2A-2B示出了例示根据本发明实施例的用于更新栈框架统计的技术示例的流程图。
[0010] 图3A-3J示出了例示根据本发明的实施例的用于对线程和这些线程的栈段进行分类的技术示例的流程图。
[0011] 图4是例示根据本发明实施例的用于应用季节性趋势过滤器的技术示例的流程图。
[0012] 图5A-5C示出了例示根据本发明实施例的用于在栈框架之前或之后的分支点处分割栈段的技术示例的流程图。
[0013] 图6A-6E示出了例示根据本发明实施例的用于合并线程的栈段的技术示例的流程图。
[0014] 图7A-7B示出了例示根据本发明实施例的用于登记关于指定的栈踪迹(stack trace)和指定的一组合并段的线程分类项的技术示例的流程图。
[0015] 图8是例示了根据本发明实施例的用于更新关于指定的线程分类信息项的线程分类统计的技术示例的流程图。
[0016] 图9是例示了根据本发明实施例的用于更新关于指定的段信息项的栈段统计的技术示例的流程图。
[0017] 图10是例示了根据本发明实施例的可以使用的系统环境的部件的简化框图。
[0018] 图11是根据本发明实施例的可以使用的计算机系统的简化框图。
[0019] 图12是根据本发明实施例的使用各种函数来变换数据的各种状态的构架的框图。
[0020] 图13是根据本发明实施例的示出趋势的图。
[0021] 图14是示出了根据本发明的实施例的已经被自动分类的一组数据点的示例的图。

具体实施方式

[0022] 概述
[0023] 数据可以被归类为事实(fact)、信息(information)、假设(hypothesis)和指令(directive)。通过应用知识基于其它类别的数据来产生某些类别的数据的活动可以被归
类为分类(classification)、评估(assessment)、解析(resolution)和实施(enactment)。
这些归类方法可以用来增强诊断系统,诸如通过历史记录保持。这种诊断系统可以包括基
于将知识应用于系统生命表征(system vital sign)(诸如线程或栈段强度以及虚拟机对
内存堆的使用)来预报计算系统故障的系统。这些生命表征是可以被分类为生成诸如内存
泄漏、黏联线程(stuck thread)、死锁、拥塞或其它问题之类的信息的事实。分类可以包括类的自动产生以及采样间隔具有不规律时长的时间序列数据的趋向(trending)。
[0024] 维护数据和活动之间的关系
[0025] 根据本发明的实施例,公开了用于维护活动和激励这些活动的数据之间的形式关系的技术。更具体地说,在形式上被识别为事实的数据可以在形式上与基于这些事实推导
信息的分类活动相关或者被映射到该分类活动。这种信息也是一般意义上的数据,但是与
事实不同的是可以在形式上被识别为信息。基于这种信息推导假设的评估活动可以在形式
上与该假设相关或者被映射到该假设。基于这种信息和假设推导指令的解析活动可以在形
式上与该指令相关或者被映射到该指令。指令也是数据,但是与事实和信息不同的是可以
在形式上被识别为指令。基于这种指令推导进一步的事实的实施活动可以在形式上与这些
进一步的事实相关或者被映射到这些进一步的事实。
[0026] 因此,在本发明的实施例中,每个数据项可以被标记为事实、信息、假设或指令。每个活动可以被标记为分类、评估、解析或实施。从系统的外部源(诸如传感器)接收的原始数据可以被标记为事实,这些事实一般是定量的,而非定性的。对这种事实应用的基于知识的自动化处理或人类判断可以被标记为分类。由分类得到的数据可以被标记为信息。信息一般指示事实经判断或确定为定性表示是什么。对这种信息应用的基于知识的自动化处理或
人类判断可以被标记为评估。由评估得到的数据可以被标记为假设。类似地,对这种假设应用的基于知识的自动化处理或人类判断可以被标记为解析。由解析得到的数据可以被标记
为指令。指令一般规定被视为适合于在努力改正或改善信息所指示的状态时执行的操作。
对这种指令应用的基于知识的自动化处理或人类操作可以被标记为实施。实施一般执行指
令所规定的操作。由实施得到的数据可以通过关于由实施生成的状态而进行的测量来获
得,也可以被标记为事实。可以关于这些事实进行进一步的分类,所以上述序列可以迭代地重复。在每次迭代中,可以观察到附加的事实、信息和指令。在每次迭代中,可以执行附加的分类、评估、解析和实施。因此,本发明的实施例可以涉及循环的生成信息的事实分类、生成假设的信息评估、生成指令的信息解析、以及生成进一步的事实的指令实施。该循环被称为CARE(分类-评估-解析-实施)环。
[0027] 在本发明的实施例中,对于在系统中发生的每个分类,可以产生并存储分类和激励该分类的事实之间的映射。对于在系统中进行的每个评估,可以产生并存储该评估和激
励该评估的信息之间的映射。对于在系统中进行的每个解析,可以产生并存储该解析和激
励该解析的信息之间的映射。对于在系统中执行的每个实施,可以产生并存储该实施和激
励该实施的指令之间的映射。此外,可以产生并存储每个分类和由该分类得到的信息之间
的映射。此外,可以产生并存储每个评估和由该评估得到的假设之间的映射。此外,可以产生并存储每个解析和由该解析得到的指令之间的映射。此外,可以产生并存储每个实施和
由该实施得到的事实之间的映射。
[0028] 在本发明的实施例中,建立一组面向对象的类,以便对事实、分类、信息、评估、假设、解析、指令和实施的实例进行归类。这些类中的每一个的领域特定的子类可以从这些类推导得出。例如,对于特定领域(例如,数据中心健康监视、诊断和管理),事实类的领域特定的子类可以从事实类推导得出,分类类的领域特定的子类可以从分类类推导得出,评估类的领域特定的子类可以从评估类推导得出,假设类的领域特定的子类可以从假设类推导得
出,解析类的领域特定的子类可以从解析类推导得出,指令类的领域特定的子类可以从指
令类推导得出,实施类的领域特定的子类可以从实施类推导得出。这些领域特定的子类中
的每一个均可以被给予适合于它们适用的领域的标记和属性。例如,在数据中心健康监视、诊断和管理领域中,事实类的领域特定的子类可以是线程转储类。又例如,信息类的领域特定的子类可以是黏联线程类。又例如,指令类的领域特定的子类可以是负载均衡类。
[0029] 在本发明的实施例中,对于作为事实的每个数据项,可以对作为事实类的领域特定的子类的实例的对象进行实例化(instantiate)以存储从属于该数据项的属性的值。对
于作为信息的每个数据项,可以对作为信息类的领域特定的子类的实例的对象进行实例化
以存储从属于该数据项的属性的值。对于作为指令的每个数据项,可以对作为指令类的领
域特定的子类的实例的对象进行实例化以存储从属于该数据项的属性的值。
[0030] 在本发明的实施例中,对于作为分类的每个活动,可以对作为分类类的领域特定的子类的实例的对象进行实例化以存储从属于该活动的属性的值。对于作为评估的每个活
动,可以对作为评估类的领域特定的子类的实例的对象进行实例化以存储从属于该活动的
属性的值。对于作为解析的每个活动,可以对作为解析类的领域特定的子类的实例的对象
进行实例化以存储从属于该活动的属性的值。对于作为实施的每个活动,可以对作为实施
类的领域特定的子类的实例的对象进行实例化以存储从属于该活动的属性的值。
[0031] 在本发明的实施例中,可以产生并存储这些对象之间的映射。这种映射稍后可以被调回(recall),可能是通过针对其中可以存储这种映射的数据库执行查询。
[0032] 分类-评估-解析-实施环
[0033] 在本发明的实施例中,定义了四个单独的数据类:事实、信息、假设和指令。在实施例中,定义四个单独的知识类:分类、评估、解析和实施。信息实例可以包括通过分类处理而从事实中提取的观察和/或预测和/或规范和/或目标。假设实例可以从通过评估处理而做出的观察和/或预测推导得出。指令实例可以从通过解析处理而做出的假设推导得出。实施处理可以产生新的事实。
[0034] 在实施例中,可以通过应用分类知识来将事实(系统的原始输入)归纳为观察和/或预测和/或规范。可以将事实映射到分离的标签性质,这些标签性质表示所建立的观察术语。观察可以用来执行评估以便推导假设。这种假设可以具有概率、量级和反应紧迫性。观察、预测、规范和/或假设可以用来确定用于处理情况的指令(行动计划)。指令可以通过应用实施知识来执行。当指令被实施时,可以对新出现的事实进行分类。可以执行进一步的评估来确定情况是否已经被解析或者进一步的指令是否应被查明。
[0035] 本文中所公开的技术可以用来开发应用程序。本文中所公开的知识、信息、处理和社会互动模型(social interaction model)可以用来开发数据驱动的应用程序。通过将数据区分为事实、信息、假设和指令,可以将语义与数据相关联。可以使用CARE环来将如此区分的这些数据与分类、评估、解析和实施知识相互关连。数据库技术可以用来实现本文中所公开的技术并且实现本文中所公开的模型。
[0036] 知识、信息、处理和社会互动模型
[0037] 通过使用本文中所公开的模型作为总体设计模式,可以开发演进的应用程序。可以通过逐渐注入经编码的知识处理来开发这种应用程序。这种经编码的知识处理可以用来
使人工处理自动化。可以将指令类关联到必要的默会知识(tacit knowledge)的简档以执
行指令。行动者类可以与默会知识简档相关联。通过匹配指令的默会知识要求和行动者的
默会知识简档,最佳的人力资源可被选择和被分配给每个任务。CARE环可以用作构建动态
反应系统的引擎。
[0038] 知识、数据和行动者
[0039] 在本发明的实施例中,可以定义三个面向对象的类:数据类、知识类和行动者类。对象可以从这些类中实例化。这些对象可以被存储在用于应用程序的数据库中。每个对象
的多个版本可以被维护在时间数据库中,使得必要时,可以获得每个对象的历史。
[0040] 数据对象(数据类的实例)可以表示结构化的、半结构化的和非结构化的原始内容,诸如事实、事件流、关系、可扩展标记语言(XML)文档、文本等。数据对象还可以表示元数据,诸如类别、标签、关系和容器。数据对象还可以表示通过获取处理捕捉的内容,诸如用户接口表单、指令表单(prescription form)和通知模板。
[0041] 知识对象(知识类的实例)可以表示算法、脚本、处理、查询、资源描述框架(RDF)公理、产生式规则、决策树、支持矢量机、神经网络、贝叶斯网络、隐马尔可夫模型、Hopfield模型、默会人类知识等。当数据对象被添加、改变或删除时,可以将知识应用于这些数据对象。知识对象的升级可以触发该知识对象中的知识所应用的数据对象的追溯处理。知识对象一
旦被部署,这些知识对象中的知识就可以被应用。
[0042] 行动者对象(行动者类的实例)可以表示个体、个体群体或组织。行动者对象可以具有诸如组织上下文、技能简档、知识简档、兴趣简档和偏好简档之类的属性。这种知识简档可以指示行动者对象拥有的、但是系统可能不会以编码的方式拥有的默会知识。当行动
者对象表示个体时,那么行动者对象可以指定该对象所表示的行动者的实时存在。当行动
者对象表示个体时,那么行动者对象可以指定该对象所表示的行动者的实时活动。可以基
于这些行动者对象的属性来最佳地将这些行动者对象分配给待定指令。
[0043] 在本发明的一个实施例中,数据类、知识类和行动者类全都可以从同一个基本类推导得到。
[0044] 事实、信息、假设和指令
[0045] 在本发明的实施例中,可以从以上所讨论的数据类推导三个单独的面向对象的类:事实类、信息类、假设类和指令类。可以从这些类实例化对象。对象可以被存储在用于应用程序的数据库中。
[0046] 事实对象(事实类的实例)可以表示系统的输入。这种输入可以包括例如来自JVM中的垃圾收集器的数据流、来自周期性线程转储的栈踪迹、内存堆转储、数据库AWR报告等。
事实对象可以表示从装置收集的定量测量结果、非结构化的转换或表单输入。
[0047] 信息对象(信息类的实例)可以表示对来自事实的观察或预测的定性解释。在本发明的实施例中,可以从信息类推导三个单独的面向对象的类:观察类、预测类、规范类和目标类。可以实例化每个类的对象。观察对象可以将事实的个体化(individuation)表示成离散值。例如,阻挡数据库连接事实(数字)的线程强度可以被个体化为具有诸如正常、受保
护、严重或临界之类的定性值的观察对象。预测对象可以表示根据变化的状况而预报的定
性值。预测对象可以表示由观察模型可能通过仿真而内插或外插的定性值。规范对象可以
表示历史基线的定性值。目标对象可以表示目标定性值,应当针对观察对象和预测对象寻
求达成所述目标定性值以便实现总体目标和解决。可以对目标和观察之间的差异进行分
类。目标和观察之间的差异程度可以影响指令的确定。
[0048] 假设对象(假设类的实例)可以表示观察和/或预测的诊断或原因。例如,假设的一个领域特定的示例是负载均衡器故障,该负载均衡器故障造成:在两个服务器的集群中,一类线程的线程强度在第一服务器中被分类为压力过高状态(强度明显高于规范),而在第二
个服务器中被分类为压力过低状态(强度明显低于规范)。
[0049] 指令对象(指令类的实例)可以表示要被执行的活动。指令的一个领域特定的示例是用于进行堆转储或者配置内存管理策略的命令。
[0050] 分类、评估、解析和实施
[0051] 在本发明的实施例中,可以从以上所讨论的知识类推导四个单独的面向对象的类:分类类、评估类、解析类和实施类。可以从这些类实例化对象。对象可以被存储在用于应用程序的数据库中。这些对象可以共同表示制度性知识的抽象。这种知识可以被编码在例
如自动化的软件程序中,或者这种知识可以是人类知识。知识可以采取算法、技术、处理或方法的形式。可以将知识应用于数据来推导其它种类的数据。
[0052] 分类对象(分类类的实例)可以表示将定量事实归纳为定性观察的技术。分类技术的应用可以产生从事实池获取的重要事实的紧凑表示。
[0053] 评估对象(评估类的实例)可以表示用于产生关于观察的原因的假设的技术。这些技术可以是人工的、计算机引导的、或完全自动化的。
[0054] 解析对象(解析类的实例)可以表示用于产生对假设进行处理的一组指令的技术。这些技术可以是人工的、计算机引导的、或完全自动化的。基于观察或预测与规范偏离的程度,解析可以力图开发指令。
[0055] 实施对象(实施类的实例)可以表示用于解释指令的意图并且执行该意图的技术。实施可以力图对假设做出响应。实施可以力图捕捉附加事实。
[0056] 行动者
[0057] 行动者对象(行动者类的实例)可以表示人、群组、社区和自动化代理。行动者对象可以拥有诸如简档和在场背景之类的属性。人可以是与系统交互的个体。人的简档可以表示这个人的行为准则、角色和职责。人的默会知识简档可以自动地从这个人贡献或创作的
消息、报告和出版物中提取。群组可以是个体的团队。群组的简档可以表示群组的行为准
则、角色和职责。群组的默会知识简档可以自动地从该群组的成员贡献或创作的消息、报告和出版物中提取。社区可以是组织、论坛、会议、期刊等。社区的默会知识简档可以自动地基于该社区的话语产生。自动化代理可以是封装算法处理的软件,仅举几例的话,所述算法处理诸如是工作流程、仿真、支持矢量机、神经网络和贝叶斯网络。自动化代理可以拥有指示该代理的能力的简档。
[0058] 在实施例中,可以至少部分基于行动者对象所拥有的属性来将知识活动(诸如由分类对象、评估对象、解析对象和实施对象表示的知识活动)分配给该行动者对象。因此,可以将待执行的每个活动分配给能够最高效地执行该活动的行动者。
[0059] 在实施例中,可以直接地或间接地捕捉行动者对象的至少一些属性。这些属性可以包括简档。行动者对象可以拥有偏好。通过使用自然语音处理,专长寻找工具可以从行动者的诸如消息、报告和出版物之类的贡献中提取该行动者的专长和兴趣。这种专长和兴趣
可以通过名词和主题来指示。该工具可以将每个名词短语或主题分类为专长、兴趣、爱好、厌恶、推荐等。在实施例中,基于行动者的简档,可以自动地为这些行动者创建事件订阅。
[0060] 在一个实施例中,行动者的简档可以随时间改变。可以针对每个行动者来维护这些简档随时间的不同版本。对行动者的贡献的重新评价可能使该行动者的专长随时间改
变。行动者的简档历史可以被存储在双时态数据库(bi-temporal database)中,并且在该
双时态数据库中被查询。
[0061] 在一个实施例中,基于行动者参与的社会互动的内容,可以自动地构造该行动者的简档。所述社会互动可以包括例如会话线程。社会互动可以被表示为容器对象。这种社会互动容器对象可以表示会议、聊天室、电子邮件收件箱、电子邮件发件箱、日历、任务列表和论坛。行动者在这些容器对象中的内容贡献可以被扼要描述在上下文中。诸如分类、评估、解析和实施之类的知识函数可以被参数化为使得参数能够在可能的程度上针对每个行动
者的专长、偏好和社交网络简档进行个性化,同时仍然观察组织的约束。在某些实施例中,行动者可以基于处境、他们自己的偏好和限制性组织因素来选择最佳团队成员。
[0062] 应用程序演进
[0063] 根据本发明的实施例,由于知识与用户接口应用分离,应用程序可以不断地演进。在实施例中,知识可以单独地维护,并且执行引擎可以适当地应用知识。在计算系统内,某些种类的知识(诸如人类所拥有的默会知识)不是预知的。在一个实施例中,为了使得能够
获取这些种类的知识,系统可以呈现鼓励和激励环境的用户表达这些种类的知识的用户环
境。系统可以呈现对于环境的用户表达这些种类的知识给予奖励的用户环境。系统然后可
以捕捉知识,并且使用它来进行监督式机器学习,以用于例如分类、评估、解析和实施的目的。
[0064] 根据本发明的实施例,提供了人类用户可以用来输入数据的用户接口,其中所述数据可以用来描述这些用户为何做出他们所做的决策。系统可以将这种描述与指示用户所
执行的行动或者使用户执行的行动的数据相关联地存储。之后,为了针对任何行动查明这
些行动被执行的原因,可以查询所存储的记录。此外,这种记录可以反映执行行动的决策所基于的当时的事实。因此,处理可以在系统中备有文档。
[0065] 一些分类活动可以由人执行,而不是通过自动化处理来执行。在本发明的一个实施例中,响应于人执行分类活动,系统可以要求该人提供与正执行该活动相关的处境的描
述。系统然后可以将该描述与表示分类活动的分类对象相关联地存储。在一个实施例中,系统可以要求该人使用词汇库来提供注释,可能通过引导社会标签化。系统然后可以将这些
注释与分类对象相关联地存储。在本发明的一个实施例中,系统可以要求用户标识分类活
动所基于的最小的一组事实。系统然后可以将该组事实与分类对象相关联地存储。
[0066] 一些评估活动可以由人执行,而不是通过自动化处理来执行。在本发明的一个实施例中,响应于人执行评估活动,系统可以要求该人声明基于分类将进行的评估以便得出
假设。系统可以通过引导社会标签化来要求该人使用词汇库给评估作注释。系统可以要求
该人指示在一组分类中哪些观察、预测、规范和目标与评估相关,可能通过引导社会标签
化。系统可以通过提供词汇库来要求该人声明假设形式的评估结果,可能通过使用引导社
会标签化。系统可以要求该人声明基于假设的评估将进行的解析。系统可以通过引导社会
标签化来要求该人使用词汇库给解析作注释。系统可以要求该人以一个或多个指令的形式
指定行动计划。系统可以要求该人给作为整体的行动计划以及该行动计划内的每个指令作
注释。系统可以将输入与注释一起与评估对象和解析对象相关联地存储。
[0067] 在本发明的实施例中,当系统要求人提供注释时,系统可以至少部分基于与该人的行动者对象相关联的简档来向该人推荐词汇库。在本发明的一个实施例中,系统可以基
于与如下行动者对象相关联的知识项的相似性来向该人推荐标签:所述行动者对象和与该
人相关联的行动者对象同属一个社区。在本发明的一个实施例中,系统可以基于行动者社
区中的其他行动者对标签的使用频率来向该人推荐这些标签。在某些实施例中,系统可以
利用与流行的社交网络经验类似的引导社会标签化经验。引导社会标签化可以导致更加标
准的词汇、更能标识的情况、以及更能重复的处理。它使处理从特设的实践演进到经良好地定义和优化的实践(例如,护理实践标准)。此外,用户注释可以用作模式识别算法的模式和监督式机器学习算法的正面例子和反面例子,以使得应用程序能够自动演进。
[0068] 数据驱动框架到特定领域的应用
[0069] 在一些应用程序领域中,诸如监视健康并且对大型数据中心的不同部分中的问题做出响应的应用程序中,期望的应用程序行为可能无法提前完全指定、设计和编程。对于这些系统,需要响应于演进数据和知识的趋同来以及时的方式实现应用程序行为。在应用程
序被实现之后,应用程序行为需要不断地适应数据和知识中表示的变化的信息。在这种领
域中,应用程序开发处理必须是数据驱动的,其中应用程序行为由封装从数据推导的知识
的函数元素组成。为了使应用程序随着变化的数据和知识高效地演进,在支持起源追踪的
系统中,知识元素需要以数据的形式与其它类型的数据一起被管理。采用起源支持,当事实改变时,系统可以重新表征从事实推导出的知识,并且当知识改变时,系统可以重新评估事实中的信息。在本文中所公开的本发明的一个实施例中,知识元素按照分类、评估、解析和实施类型归类。并非所有的知识元素都被编码为自动化函数或处理。通过行动者的默会知
识的交互也被捕捉作为起源数据库中的分类、评估、解析和实施知识的应用程序的实例。数据驱动的处理控制把由编码的知识或行动者的默会知识执行的每个分类行动作为起源数
据库中的三元组(事实、分类、信息)进行跟踪。由编码的知识或行动者的默会知识执行的每个评估行动被捕捉作为三元组(信息、评估、假设)。由编码的知识或行动者的默会知识执行的每个解析行动被捕捉作为三元组(假设、解析、指令)。类似地,由编码的知识或行动者的默会知识执行的每个实施行动被捕捉作为三元组(指令、实施、事实)。在本发明的某些实施例中,这些三元组实例在数据库中被表示为资源描述框架(RDF)三元组和具体化三元组
(Reification triple)。
[0070] 在本发明的一个实施例中,系统用作分类-评估-解析-实施(CARE)处理控制引擎,其以驱动引擎的四种活动命名。该引擎主动地发起行动者和自动化的分类、评估、解析和实施处理之间的交互。该引擎循环分类、评估、解析和实施阶段来在处理循环的每个阶段生成事实、信息、假设和指令。在实施例中,诸如分类、评估、解析、实施之类的函数提供处理方面,而事实、信息、假设和指令提供数据方面。函数本质上是变换的。在某实施例中,CARE控制引擎能够完全控制产生和维护事实、信息、假设、指令数据以及起源数据。在这样做时,CARE控制引擎可以预料什么数据将可供使用以及何时可用。该引擎还可以预料有足够的数
据可用于应用任何知识类别的正确的知识函数的时间。该引擎还可以执行绝限。
[0071] CARE控制引擎被授权完全控制产生和维护行动者的默会知识简档以及编码的分类、评估、解析和实施函数的能力简档。CARE控制引擎可以被授权扼要描述行动者的默会知识和偏好,为每个指令选择最有资格的行动者,并且将任务分配给选择的行动者。这种执行模型服从决策支持自动化系统的演进开发。在某些实施例中,由行动者用起源数据库中的
相关联的输入事实和输出信息执行的分类行动的具体化可以用作用于自动分类的支持矢
量机或神经网络的监督式学习的训练例子。在系统中执行的评估行动的具体化可以用作案
例,以便推导贝叶斯网络中的条件概率以及标识新的关联和因果依赖关系以将贝叶斯网络
扩展用于自动评估。
[0072] 本文中公开了一种框架,在该框架中,对事实的分类是可以由行动者或分类机器或者相互结合地执行的几个操作之一。根据事实而分类的信息是原始数据的概要,并且可
以包括趋势、预测、规范、目标和状态矢量。除了分类之外,该框架可以涉及评估。像分类那样,评估是知识对于从事实推导的信息的一种应用。评估可以由行动者或评估机器或者相
互结合地执行。除了分类和评估之外,该框架还可以涉及解析。像分类和评估那样,解析是知识对于从信息推导的假设的一种应用。解析可以由行动者或解析机器或者相互结合地执
行。除了分类、评估和解析之外,该框架还可以涉及实施。像分类、评估和解析那样,实施是知识根据指令的一种应用。实施可以由行动者或实施机器或者相互结合地执行。
[0073] 图12是根据本发明实施例的使用各种函数来变换数据的各种状态的框架的框图。框架1200包括事实数据1202、信息数据1204、假设数据1206和指令数据1208。框架1200还包括分类函数1210、评估函数1212、解析函数和实施函数,分类函数1210将事实数据1202变换为信息数据1204,评估函数1212将信息数据1204变换为假设数据1206,解析函数将假设数
据1206变换为指令数据1208,实施函数将指令数据1208变换为事实数据1202。
[0074] 监视计算机系统的健康并且对健康问题做出响应的技术需要定义系统的“生命表征”。这些技术可以涉及对时间序列数据内的生命表征进行监视。时间序列数据可以来源于各种传感器。时间序列数据内所包含的信息是特定类型的事实。这种生命表征可以包括例
如内存使用和线程或栈段强度。季节性趋向(seasonal trending)技术可以使用计算机系
统的“生命表征”的时间序列数据来执行趋势的分类。
[0075] 堆使用和线程或栈段强度的季节性趋向和分类仅仅是本文中所公开的框架的许多不同的可能应用程序中的一些。通过使用该框架,可以从低级别事实推导出高级别信息。
例如,这种低级别事实可以是原始数据,诸如JVM冗长的GC日志和栈踪迹。原始数据可以经过变换,以提取越来越高级别的分类信息。例如,栈踪迹中的线程段可以被分类为更简明的信息。在对栈段和线程进行分类之后,所述技术可以提取线程类之间的依赖性关系以及线
程和栈段的下挖(drill-down)的组成,这些是更高形式的分类信息。周期性线程转储的时
间序列数据包含线程和栈段的每个类的趋向信息。季节性趋向将时间序列数据变换为更高
形式的信息,诸如周期性周期循环、线性趋势、方差变化、等级变化、等级漂移、离群值和终点(endpoint)预测。趋势数据可以将大量时间序列数据归纳为更简明的事件序列,其中事
件的数量与观察时间窗口上的实质性趋势变化的数量成比例。
[0076] 在一个实施例中,系统状态可以由从趋势数据提取的特征矢量标识,并且系统状态变化可以由表示趋势中的实质性变化的事件界定。在某一实施例中,特征矢量将由每个
趋势信息的定性状态组成,所述趋势信息包括季节性因素、线性趋势、方差变化、等级变化、等级漂移、离群值和终点预测。每种定性数据类型可以被分类为少至2或3个离散的级别,诸如低、正常或高。例如,如果线程或栈段类的强度在可周期性调整的期望强度的1-sigma带内,则它将被视为是正常的。在这个示例中,观察时间窗口上的高或低的值提供了关于这个线程类的压力过高或压力过低的定性信息。在另一个示例中,季节性因素可以表现出从周
末到工作日或者从工作日到周末的转变中的不连续性。每个季节内的季节性因素的趋势形
状(诸如单调图案)以及连接不同季节的不连续程度(诸如锯齿形图案)可以在特征矢量中
以定性的形式描述。
[0077] 例如特征矢量子空间(线性趋势、等级漂移、方差变化、终点预测)中的(高线性趋势、高等级漂移、高方差变化、近终点)的特征矢量可以从JVM冗长的GC日志文件中的时间序列数据提取。在一个实施例中,通过观察在JVM中存留某时间窗口的特征矢量(高线性趋势、高等级漂移、高方差变化、近终点),JVM的内存状态可以被分类为内存泄漏。当特征矢量存留在JVM中时,状态仅在由时间窗口的起始时间t1和结束时间t2界定的某时间间隔是有效
的。当内存泄漏站点(site)被识别并且被修复时,JVM的特征矢量可能改变。由于错误修复的应用,JVM的后续的观察状态可以用新的特征矢量来描述,所述新的特征矢量例如(低线
性趋势、低等级漂移、低方差变化、无终点)被分类为正常内存状态,并且可以存留从起始时间t2至结束时间t3的持续时间。因此,该信息可以指示系统健康从内存泄漏状态进展到正
常内存状态。在一个实施例中,该状态转变可以被分类为改善趋势。可替代地,在修复内存泄漏之后,内存管理问题可以表现为特征矢量(低线性趋势、低等级漂移、高方差变化、无终点)中的高方差变化。这可以涉及又一个CARE控制循环来解析在那段时间内系统可能经历
从内存泄漏状态、到内存管理问题状态、到正常内存状态的状态转变。如果相反,观察的特征矢量是从正常内存状态变为内存泄漏状态,则在一个实施例中,CARE控制可以将该信息
分类为退化趋势,并且调用行动者来对该退化进行评估。内存特征空间的状态可以与诸如
线程或栈段强度趋势之类的其它特征空间的状态结合,以形成JVM的复合状态(正常内存状
态、正常线程强度状态)。在某实施例中,可以使用多时态数据库方案(也被称为双时态数据库方案)的有效时间列来管理特征矢量状态的有效时间。
[0078] 在一个实施例中,第一个CARE控制循环可以响应于示例情境中的信息变化来分类内存泄漏状态并且调用推导假设的评估操作。响应于信息变化的链式反应,第一个CARE控
制循环可以调用如下解析:该解析发出随着在两个堆转储之间流逝指定时间而从目标JVM
收集这些转储的指令。该指令可以由行动者实施,并且在新的事实之间导致两个堆转储文
件。第二个CARE控制循环可以调用分类操作,以通过比较所述两个堆转储文件中的对象的
直方图来识别内存泄漏站点。关于代码错误的假设可以在对内存泄漏站点进行评估之后发
布。用于修复和修补错误的指令可以在对代码错误进行解析之后发布。在实施用于修复和
修补错误的指令之后,第三个CARE控制循环可以将新的事实分类为内存管理问题状态,并
且调用评估操作。由行动者进行的评估然后可以导致关于内存管理策略(例如,软参考LRU
策略)的错误配置的假设。第三个CARE控制循环可以调用解析操作,该解析操作导致用于调节软参考LRU策略的指令。用于调节内存管理策略的这个指令可以由行动者实施。第四个
CARE控制循环可以基于由上一次实施收集的新事实来分类正常内存状态。第四个CARE控制
循环然后可以通过观察从内存泄漏状态、到内存管理问题状态、到正常内存状态的状态转
变来分类为改善趋势。
[0079] 在一个实施例中,CARE控制将调用行动者来针对JVM中的内存事发中的每个在例如子空间(线性趋势、等级漂移、方差变化、终点预测)之类的特征矢量空间中对每一个新的事实进行分类。当收集到足够数量的正面例子和反面例子时,CARE控制可以应用监督式学
习来构造对内存泄漏问题进行分类的支持矢量机。例如,特征矢量(高线性趋势、高等级漂移、高方差变化、近终点)可以被支持矢量机分类为内存泄漏。
[0080] 在一个实施例中,CARE控制可以将事实和知识元素中的信息变化(全都可以表示为数据)的查询登记在数据库中。事实的变化可能由实施引起。事实中的信息变化可能由实施以及提取或解释该信息的知识元素的变化引起。知识元素的变化可能由在线或离线机器
学习处理引起,在某些实施例中,在线或离线机器学习处理被建模为实施处理。CARE控制可以响应于数据的变化来发起分类、评估、解析和实施动作。在某些实施例中,CARE控制引擎可以通过使用数据库触发器、实时日记分析以及双时态数据库顶部的登记的查询来实现。
在某些实施例中,CARE控制引擎可以将关于对象变化通知或查询结果变化通知的查询登记
在数据库中。由登记的查询所引用的对象是登记的对象。因此,事实、信息、假设和指令数据之中的每个对象可以是登记的对象。类似地,分类、评估、解析和实施知识元素之中的每个对象可以是登记的对象。
[0081] 所述框架可以使得可用于执行如分类、评估、解析和实施之类的行动的专门算法能够演进。专门算法可能不一定直接一起工作。监视线程或栈段强度的季节性趋势的算法
不一定直接与涉及确定堆使用趋势的算法一起工作。CARE控制允许这些不同的算法被独立
地开发并且被集成到能够作为共同的应用程序演进的单个系统中,方式是通过将这些算法
作为分类、评估、解析和实施组件进行封装,这些组件经由归一化的事实、信息、假设和指令数据模型进行交互。向系统添加新算法可以生成加性效应。系统内的算法可以彼此补充和
增强。算法可以彼此相关以便实现更好的诊断。CARE控制执行模型通过连续地查询数据的
变化并且发起从属组件的执行来驱动交互。这些组件中的一些可以包含与人类行动者交互
的用户接口和消息传送系统。
[0082] 被应用于诸如基于各种生命表征的季节性趋向之类的领域的领域特定算法一开始可以被表征为框架内的分类元素。然而,通过使用所述框架,这种算法可以被进一步精炼和理解。这种提升的精炼和理解可以产生捕捉如下模式的能力:所述模式对于正应用它们
的特定环境可能是更专用的。这是程度更进一步的分类。这种程度更进一步的分类来自于
不同信息项彼此间关连。例如,在特定领域中,线程或栈段强度信息可以与内存使用信息相关。这种信息可以与在系统内发出的指令相关。系统可以捕捉这种发出的指令,并且在形式上将它们与信息项相关以显示出它们之间的连接。当这些关系被构建在系统内时,关系模
式可以变为可识别。系统可以识别的模式的种类可以随着时间而演进。
[0083] CARE控制还用作用于使正被监视的目标系统的数据、知识和状态的演进可视化的模型。例如,关于JAVA虚拟机(JVM)的堆使用的原始数据可以随着时间而被监视。框架中的这种原始数据是可以通过应用知识而分类的事实。仅举几例,知识可以采取季节性趋势算
法、信号处理算法、支持矢量机、神经网络和贝叶斯网络的形式。信息可以从原始数据推导出,并且可以用特征矢量表示。更高级别的信息可以采取由支持矢量机用特征矢量的分类
而识别的状态的形式。这种分类信息可以指示持续地观察到系统的一方面处于某状态的时
间间隔。这种状态信息可以被组成为指示例如系统的一方面被观察到从一种状态转变到另
一种状态时的时间点,例如,当错误修复被应用于JVM上时的时间点。通过确定时间序列绘图中的信息模式改变的点,这些时间点可以变得明显。有时,当信息变化在原始数据中不明显(它们通过肉眼不可见)时的时间点只有通过从原始数据中提取信息或检测信号才变得
明显。在示例情景下,时间序列中的趋势信息或原始数据可能表明:在第一时间间隔期间,即使在堆使用存在大方差的情况下,基线JVM堆使用也稳定地漂移得更高。JVM堆使用的这
种稳定的等级漂移可能是内存泄漏的结果。原始数据于是可能表明:在接下来的第二时间
间隔期间,基线JVM堆使用在连续存在大方差的情况下变平。原始数据在第一间隔和第二间隔之间的点处的信息变化可以指示内存泄漏通过对系统做出一些改变而被修复。在第二间
隔期间,堆使用的大方差可能继续。然后,在第三间隔期间,原始数据中的信息在第二间隔之后变化,堆使用的方差可能显著减小,这指示在第二时间间隔和第三时间间隔之间对系
统做出了另一改变。第二间隔和第三间隔之间的变化可以与内存LRU策略上的调节行动相
关联。
[0084] 在这个例子中,多个信息项可以从原始数据推导得到。首先,可以推导关于基线堆使用中的漂移的信息。第二,可以推导堆使用的方差的变化信息。算法可以从原始数据推导出这种信息。通过对原始数据进行过滤和变换,可以从原始数据中除去噪声和外来的无关信息,仅留下感兴趣的信息。例如,所述过滤可以包括除去数据中的季节性趋势。在这种过滤的数据内,对于试图找到这种模式的自动化系统,模式可能变得更明显。也可以基于数据和从其推导出的信息来执行预报。例如,基于数据和所推导的信息,可以做出如下预测,即,在不存在系统重启(抵消内存泄漏的影响)的情况下,系统将用完内存,并且在未来的特定
日期和时间死机。这种预报可以针对在数据中发生的周期性(例如,每日、每周、每季度)趋势进行调整。
[0085] 每当原始数据表现出系统中的变化,而生成上述有区别的第一间隔、第二间隔和第三间隔,该变化可以是发出作为解析行动的输出的某指令的结果。本文中所公开的CARE
控制框架的应用还可以在不调用评估行动的情况下产生指令。与时间序列的季节性趋势相
关联的是基于季节性趋势以及去季节性的线性和非线性趋势的信息,该信息可以以一定的
置信度水平预测出:通过针对JVM使用相同的示例情境,目标JVM将在从当前起的已知时间
段内死机,如果系统在该时间结束之前未被重启的话。这种预测可以向系统管理员建议,他应该执行系统维护,包括在预测将发生死机的时刻之前的某个方便的时间(例如,周末)期
间重启JVM。在对近期预测的终点进行分类之后,CARE控制可以发出诸如重启JVM的紧急操
纵指令。另外,在监视操作具有内存泄漏状况的JVM的第一间隔内的趋势的几天或几周之
后,CARE控制可以调用评估和解析,该评估和解析将需要使行动者收集堆转储的指令,以识别内存泄漏站点并且评估错误修复。对于内存泄漏的错误修复的实施可能花费几周。同时,直到错误修复准备好应用于目标JVM前,JVM可以以内存泄漏状况进行操作。在待定的用于
错误修复的指令正被实施的同时,CARE控制将继续根据需要发出重启指令以在操作范围内
操纵JVM的内存状态。这些近期的操纵指令是通过使用关于终点预测的信息进行分类而发
出的,并且可以不涉及评估行动。当这种重启被实施时,在这些重启之前和之后收集的原始数据中的信息变化可以指示这些重启对堆使用的影响。由JVM重启引起的信息变化可以被
作为短期趋势进行监视,并且可以在CARE控制模型中在形式上被标记为对系统没有长期影
响的操纵指令的实例。例如,尽管JVM每周重启,但是以上所讨论的特征矢量将持续处于被标识为内存泄漏状态的(高线性趋势、高等级漂移、高方差变化、近终点)。相反,对于内存泄漏错误应用修复的指令将具有由从第一间隔内的内存泄漏状态到第二间隔内的内存管理
问题状态的转变指示的持久的影响。同样地,以上所讨论的用于调节内存LRU策略的指令将具有由第二间隔内的内存管理问题状态到第三间隔内的正常内存状态的转变指示的持久
的影响。
[0086] 在以下形式注释中,n元组A可以被认为是函数F,其域是该元组的隐式的元素指标集合X,其陪域(codomain)Y是该元组的元素集合。在形式上,n元组(a1,a2,...,an)是系统(X,Y,F),其中X={1,2,...,n},Y={a1,a2,...,an},F={(1,a1),(2,a2),...(n,an)}。有序对是2元组,三个一组是3元组。用πi表示的N元组的投影(projection)是函数πi((a1,
a2,...,an))=F(i)=ai。
[0087] n元关系R是n元组集合。关系的属性是n元组(α1,α2,...,αn)中的原子,n元组(α1,α2,...,αn)是系统(X,Z,G),X={1,2,...,n},Z={α1,α2,...,αn},G={(1,α1),(2,α2),...(n,αn)},使得函数G的陪域是该关系的属性集合。用ππαi表示的N元组的投影是函数παi((a1,a2,...,an))=F(G-1(αi))=ai。n元关系R的投影πai(R)是通过将R中的所有元组都限制于属性αi而获得的集合。例如,πFeatureVector:FeatureVector×ValidTime×FigureOfMerit→FeatureVector。投影πFeatureVector(Observation)是通过将Observation中的所有元组都限制于属性FeatureVector而获得的集合。n元关系中的每个n元组都隐式地与系统改变号(system change number,SCN)相关联,SCN表示当n元组变为持久或可恢复时的事务时间。
存在投影函数πSCN,其域是n元组集合,其陪域是系统改变号(SCN)集合。存在计算SCN的
DateTime的函数:SCN→DateTime。
[0088] 选择运算σproposition(R)对R中满足命题(proposition)的元组进行选择,其中R是关系,命题是布尔表达式。例如,假定AssessmentInput是FeatureType×Assessment中的关系,那么选择运算σFeatureType=Memorystate(AssessmentInput)是其FeatureType与MemoryState匹配的AssessmentInput关系中的元组集合。查询πAssessment(σFeatureType=Memorystate(AssessmentInput))是取存储器状态(MemoryState)Feature作为输入的Assessment函数
集合。
[0089] 在本发明的实施例中,KIDS系统是Actor、Agent、Entity、CARE、Metadata和Reification的6元组。
[0090] KIDS=(Actor,Agent,Entity,CARE,Metadata,Reification)
[0091] Actor是可以与系统交互来执行分类、评估、解析和实施行动的行动者集合。
[0092] TacitKnowledgeProfile、SociaNetworkProfile和PreferenceProfile是3个不同的函数,各自将Actor的成员映射到ProfileVector。
[0093] TacitKnowledgeProfile:Actor→ProfileVector
[0094] SociaNetworkProfile:Actor→ProfileVector
[0095] PreferenceProfile:Actor→ProfileVector
[0096] ProfileVector是Profile的n元组集合,n=1,2,3,...
[0097] ProfileVector=Profilen
[0098] Profile是Value、ValidTime、FigureOfMerit和ProfileType之间的关系。
[0099] Profile=Value×ValidTime×FigureOfMerit×ProfileType
[0100] Personalization是将简档矢量应用于参数化函数模板以生成个性化函数的curry操作:
[0101] Personalization:FunctionTemplate×ProfileVector→Function例如,诸如Classification、Assessment、Resolution和Enactment函数之类的知识函数可以通过应用从Actor的默会知识或偏好Profile推导出的ProfileVector来进行个性化:
[0102] Personalization(ClassficationTemplate)(ProfileVector)=Classification
[0103] Personalization(AssessmentTemplate)(ProfileVector)=Assessment
[0104] Personalization(ResolutionTemplate)(ProfileVector)=Resolution
[0105] Personalization(EnactmentTemplate)(ProfileVector)=Enactment
[0106] Agent是代表User的计算机程序或硬件装置的集合。
[0107] Entity是正被监视的实体的集合。Entity可以包括Java VM、Oracle VM、数据库、服务器、服务器集群、域、pod、网络交换机、防火墙、服务器中的单个的线程和线程段类等等。
[0108] CARE是Data和Knowledge的有序对。
[0109] Data是Fact、Information、Hypothesis和Directive的4元组。
[0110] Data=(Fact,Information,Hypothesis,Directive)
[0111] Fact是FSD和Feature的有序对。
[0112] Fact=(FSD,Feature)
[0113] FSD(灵活方案数据)是Value的n元组、ValidTime、Entity和FSDType之间的关系。
[0114] FSD=Valuen×ValidTime×Entity×FSDType
[0115] FSD对象的示例是包含来自XYZ-Pod中的CRM域(CRM-Domain)中的销售服务器(Sales-Server)的一系列线程转储的线程转储文件(thread-dump-file),其中销售服务
器、CRM域和XYZ-Pod是Entity的成员,线程转储文件是FSDType的成员。
[0116] Feature是Value、ValidTime、FigureOfMerit、Entity和FeatureType之间的关系。Feature表示数据观察的范围内的类别数据,诸如低、正常、高。
[0117] Feature=Value×ValidTime×FigureOfMerit×Entity×FeatureType Feature对象的是是XYZ-Pod中的CRM域中的订单采集服务器(OrderCapture-Server)中的提交订单
线程(submit-order-thread)的压力过高状态(hypertension-stat),其中,提交订单线程、订单采集服务器、CRM域和XYZ-Pod是Entity的成员,而压力过高状态是由线程强度
(thread-intensity)或栈段强度(stack-segment-intensity)FeatureType指定的范围内
的值。
[0118] FeatureVector是Feature的n元组集合,n=1,2,3,...
[0119] FeatureVector=Featuren
[0120] 在一个实施例中,FeatureVector是具有共同的ValidTime的Feature的阵列。
[0121] ValidTime是DateTime的有序对的集合。用[t1,t2)表示的时间间隔是集合{t|t1<t2且t>=t1且t<=t2,其中t、t1、t2∈DateTime}。例如,两个ValidTime的[2013-08-31 
12:00AM PST,2013-09-01 9:00AMPST)和[2013-09-01 9:00AM PST,∞)可以结合为一个ValidTime[2013-08-31 12:00AM PST,∞)。时间实例t1可以用[t1,NA)表示。
[0122] ValidTime=[DateTime,DateTime U{∞.NA})
[0123] FigureOfMerit是表示置信度水平、置信度间隔、概率、得分、均方根误差等的定量或定性值。以下结合图13进一步讨论FigureOfMerit。
[0124] Information是Observation、Prediciton、Norm和Objective的4元组。
[0125] Information=(Observation,Prediciton,Norm,Objective)
[0126] Observation是FeatureVector、ValidTime和FigureOfMerit之间的关系。
[0127] Observation=FeatureVector×ValidTime×FigureOfMerit
[0128] Prediciton是FeatureVector、ValidTime和FigureOfMerit之间的关系。
[0129] Prediciton=FeatureVector×ValidTime×FigureOfMerit
[0130] Norm是FeatureVector、ValidTime和FigureOfMerit之间的关系。
[0131] Norm=FeatureVector×ValidTime×FigureOfMerit
[0132] Objective是FeatureVector、ValidTime和FigureOfMerit之间的关系,该关系优化目标函数。
[0133] Objective=FeatureVector×ValidTime×FigureOfMerit
[0134] Hyperthesis是FeatureVector、ValidTime和FigureOfMerit之间的关系。
[0135] Hyperthesis=FeatureVector×ValidTime×FigureOfMerit
[0136] Directive是FeatureVector、ValidTime和FigureOfMerit之间的关系。
[0137] Directive=FeatureVector×ValidTime×FigureOfMerit
[0138] Knowledge是Classification、Assessment、Resolution和Enactment的4元组。
[0139] Knowledge=(Classification,Assessment,Resolution,Enactment)
[0140] Classification是函数集合,其中每个函数将FSD的n元组或FeatureVector的m元组映射到Observation、Prediction、Norm或Objective。
[0141] Classification={f|f:(FSDnU FeatureVectorm)→(Observation UPrediction U Norm U Objective),对于某整数n、m}
[0142] Assessment是函数集合,其中每个函数将FeatureVector映射到Hypothesis。
[0143] Assessment={f|f:FeatureVector→Hypothesis}
[0144] Resolution是函数集合,其中每个函数将FeatureVector映射到Directive。
[0145] Resolution={f|f:FeatureVector→Directive}
[0146] SymtomResolution是Resolution函数的子集,其域限于Fact或Information之中的FeatureVector。
[0147] SymtomResolution={f|f:FeatureVector→Directive,使得FeatureVector=πFeatureVector(陪域(g)),其中,函数g是Enactment或Classification的成员}
[0148] ClassificationResolution是Resolution函数的子集,其域限于Information中的Observation、Prediction、Norm和Objective之中的FeatureVector。
[0149] ClassificationResolution={f|f:FeatureVector→Directive,使得FeatureVector=πFeatureVector(陪域(g)),其中,函数g是Classification的成员}
[0150] AssessmentResolution是Resolution函数的子集,其域限于Hypothesis之中的FeatureVector。
[0151] AssessmentResolution={f|f:FeatureVector→Directive,使得FeatureVector=πFeatureVector(陪域(g)),其中,函数g是Assessment的成员}
[0152] ExpertResolution是Resolution函数的子集,其是Classification、Assessment和Resolution函数的合成。
[0153] ExpertResolution=Classification·Assessment·Resolution
[0154] ExpertResolution:(FSD U FeatureVector)→(Observation UPrediction U Norm)×Hypothesis×Directive
[0155] Enactment是函数集合,其中每个函数将Directive映射到一组FSD或一组FeatureVector。
[0156] Enactment={f|f:Directive→(FSDnU FeatureVectorm),对于某整数n、m}
[0157] MetaData是ProfileType、FSDType、FeatureType和Influence的4元组。
[0158] MetaData=(ProfileType,FSDType,FeatureType,Influence)
[0159] ProfileType是对象集合,其中每个对象对于Profile定义Name、数据Type和值Range。ProfileType可以指定诸如“角色”之类的Name和诸如(监工,主管,车间主任,经理)之类的值Range。在另一个示例中,ProfileType可以指定诸如“职责”之类的Name和诸如(应用服务器管理员,数据库管理员,Linux管理员,网络管理员)之类的值Range。另举一例,对于具有Name“内存调谐专家”的ProfileType,Range可以包括诸如“专家”、“中间学生”和“学徒”之类的定性值。另举一例,对于具有Name“应用源代码知识”的ProfileType,Range可以包括诸如“开发者”、“架构师”和“测试者”之类的定性值。这种值可以用于定义Profle。
[0160] ProfileType=Name×Type×Range×DefaultValue
[0161] FSDType是由定义文件类型的类别值组成的集合,所述文件类型诸如是冗长的GC日志、周期性线程转储、堆转储、OS观察程序日志、数据库AWR快照、数据库踪迹文件、点击流、REUI记录、访问日志、以及过滤成集合体的规律的或不规律的时间序列数据(诸如季节性因素、等级漂移、等级位移、等级尖峰、方差变化、离群值、终点预测、重启、内存不足事件、黏联线程事件等)。
[0162] FSDType=Name×{Binary,Text}×Encoding×Language
[0163] FeatureType是对象集合,其中每个对象针对Feature定义Name、数据Type和值Range。FeatureType可以指定诸如“内存状态”之类的Name和诸如(内存泄露,内存管理问题,正常内存)之类的值Range。在另一个例子中,FeatureType可以指定诸如“线程强度状态”之类的Name和诸如(压力过高,压力过低,护送效应(ConvoyEffect))之类的值Range。另举一例,对于具有Name“方差”的FeatureType,Range可以包括诸如“高”、“正常”和“低”的定性值。另举一例,对于具有Name“终点”的FeatureType,Range可以包括诸如“近”、“远”和“无终点”的定性值。这种值可以用于定义Feature。
[0164] FeatureType=Name×type×Range×DefaultValue
[0165] Feature可以从数据中提取。Type可以是类别性的,而不是定量的。Feature和Type一起定义可以被约束到一组容许值的名-值对。当从数据中提取这些值时,用于这些值的有效时间可以与Feature一起传播。以下提供对有效时间的讨论。
[0166] 图13是示出了根据本发明实施例的趋势的示图。通过使用本文中所描述的技术,基于趋势,可以在某时间和日期预测终点1302。有效时间1304与已被用于预测终点1302的
趋势数据相关联。在这种情况下,终点被预测为在有效时间1304的几个小时内发生。用于预测终点1302的数据是有效时间1304的一部分。这种数据可以用于例如在到达终点1302之前
重启JVM。
[0167] 在实施例中,有效时间1306可以跨越多个间隔,其中每个间隔的边界由诸如重启JVM的某个事件限定。每个时间间隔或段可以显示出它在时间上接近于某终点。终点的接近程度是特征的一个示例。在这种情况下,有效时间可以由JVM的寿命周期定界。在另一个示例中,有效时间可以由数据库的寿命周期定界。在诸如图13中所示的重复模式之后,预计某状态可能改变。例如,错误修复可能使状态改变。在这种事件之后的有效时间1308期间,趋势可能不是在增加。
[0168] 如以上所讨论的,品质因数(figure of merit)可以表示置信度区间或概率。例如,如果品质因数表示图13中的置信度区间1310,则该品质因数可能指示用于预测终点
1302的置信度区间1310为正或负5小时。尽管在一些实施例中,可以定量地表示品质因数,但是在其它实施例中,可以定性地表示品质因数。例如,置信度区间1310可以是诸如“相当精确”之类的定性度量,来代替置信度区间1310是诸如正或负5小时之类的定量度量。这种定性度量可以是主观的概念,而非客观的概念。
[0169] 可以从同一机器观察到多个统计参数。除了稳定趋势之外,还可以观察到逼近稳定趋势的剧烈波动的变化。表示剧烈波动的变化的特征可以用与表示终点的特征类型不同
的特征类型表示。所述变化的特征类型可以包括一系列定性值,例如,诸如“高”、“正常”或“低”。然而,特征的有效时间可以重叠。特征可以表示同一系统的不同方面。每个特征的有效时间可以与该特征一起被传播通过系统。在一个实施例中,包括多个特征的特征矢量的
有效时间是所有这些特征的有效时间的交集。
[0170] 对事实数据的观察可以揭示多个不同的特征是相关的。例如,当特征的有效时间重叠的跨度小于整个数据集的有效时间时,这种相关性可以被揭示。
[0171] Influence是FSDType、FeatureType和Knowledge元素之间的输入和输出关系的8元组。
[0172] Influence=(ClassificationInput,ClassificationOutput,AssessmentInput,AssessmentOutput,ResolutionInput,ResolutionOutput,Enactmentlnput,EnactmentOutput)
[0173] ClassificationInput是FSDType或FeatureType和Classification之间的关系。
[0174] ClassificationInput=(FSDType U FeatureType)×Classification×Mandatory
[0175] ClassificationOutput是Classification和FeatureType之间的关系。
[0176] ClassificationOutput=Classification×FeatureType
[0177] AssessmentInput是FeatureType和Assessment之间的关系。
[0178] AssessmentInput=FeatureType×Assessment×Mandatory
[0179] AssessmentOutput是Assessment和FeatureType之间的关系。
[0180] AssessmentOutput=Assessment×FeatureType
[0181] ResolutionInput是FeatureType和Resolution之间的关系。
[0182] ResolutionInput=FeatureType×Resolution×Mandatory
[0183] ResolutionOutput是Resolution和FeatureType之间的关系。
[0184] ResolutionOutput=Resolution×FeatureType
[0185] EnactmentInput是FeatureType和Enactment之间的关系。
[0186] EnactmentInput=FeatureType×Enactment×Mandatory
[0187] EnactmentOutput是Enactment和FSDType或FeatureType之间的关系。
[0188] EnactmentOutput=Enactment×(FSDType U FeatureType)
[0189] Mandatory是指示输入的FeatureType是否是强制调用函数的布尔值。
[0190] Reification是(CARELoop,Classiffed,Assessed,Resolved,Enacted)的五元组。
[0191] CARELoop=Classified×Assessed×Resolved×Enacted
[0192] Classiffed=(FSD U FeatureVector)×Classiffcation×(Observation U Prediction U Norm)×(Actor U Agent)×TransactionTime
[0193] Assessed=FeatureVector×Assessment×Hypothesis×(Actor U Agent)×TransactionTime
[0194] Resolved=SymptomResolved  U  ClassiffcationResolved  U AssessmentResolved U ExpertResolved
[0195] SymptomResolved=FeatureVector×SymptomResolution×Driective×(Actor U Agent)×TransactionTime
[0196] ClassiffcationResolved=FeatureVector×ClassificationResolution×Directive×(Actor U Agent)×TransactionTime
[0197] AssessmentResolved=FeatureVector×AssessmentResolution×Directive×(Actor U Agent)×TransactionTime
[0198] ExpertResolved=FeatureVector×ExpertResolution×Observation×Prediction×Norm×Hypothesis×Directive×(Actor U Agent)×TransactionTime
[0199] Enacted=Directive×Enactment×(FSD U Feature Vector)×(Actor U Agent)×TransactionTime
[0200] TransactionTime是DateTime的有序对的集合。用[t1,t2)表示的时间间隔是集合{t|t1<t2且t>=t1且t<t2,其中t、t1、t2∈DateTime}。例如,两个TransactionTime的[2013-08-31 12:00AM PST,2013-09-01 9:00AM PST)和[2013-09-01 9:00AM PST,∞)可以合并为一个TransactionTime[2013-08-31 12:00AM PST,∞)。时间实例t1可以用[t1,NA)表示。TransactionTime记录信息变得持久或者变得可恢复并且对于其它可恢复事务可
见的时间段。
[0201] TransactionTime=[DateTime,DateTime U{∞.NA})
[0202] 当FSD有变化时,例如,当用于JVM的GC日志被更新时,CARE控制可以确定FSDType。CARE控制可以使用FSDType来在ClassificationInput关系中选择受该FSDType的FSD影响
的Classification函数。CARE控制还可以查询包括该Classification函数的输入的
FeatureType的闭包(closure)。CARE控制然后可以组成所需的FSD和FeatureVector来调用
Classification。如果Classification函数由季节性过滤器、决策规则、支持矢量机等表
示,则CARE控制将发起该函数的执行。如果Classification函数由默会知识简档表示,则
CARE控制将识别其默会知识简档与Classification函数的默会知识简档最佳地匹配的一
个或多个行动者,并且发起与所述行动者的交互来执行分类行动。在机器和默会知识分类
的两种情况下,该Classification函数的结果是Observation、Prediction或Norm。在该步骤之后,CARE控制可以具体化一组输入FSD、一组输入FeatureVector、Classification函数和Observation或Prediction或Norm之间的关系。CARE控制可以包括任何数量的Actor、任
何数量的Entity、实现Classification函数的程序的版本、应用于Classification函数的
参数以及所述具体化中的其它上下文信息。
[0203] 在某些实施例中,可以从时间序列数据的片段的ValidTime推导出FSD的ValidTime。类似地,可以从FeatureVector中的每个Feature的ValidTime的交集推导出
FeatureVector的ValidTime。在调用Classification函数之后,将生成新的
FeatureVector,该新的FeatureVector将触发信息改变通知。CARE控制可以从
ClassificationInput、AssessmentInput和ResolutionInput关系中分别选择出受新的
FeatureVector中的任何一个Feature影响的任何Classification、Assessment和
Resolution函数。在获取与影响Classification、Assessment和Resolution函数的
FeatureVector对应的所有需要的Feature的闭包之后,CARE控制可以顺序地或并行地调用
这些选择的函数。在示例情境下,当得到新的FeatureVector(例如,(高等级漂移、高方差变化、附近终点预测))的改变通知时,CARE控制可以选择更高级别的Classification函数来
对该FeatureVector进行分类。更高级别的Classification函数(诸如支持矢量机)可以将
Feature空间(季节性因素、等级漂移、等级位移、方差变化、离群值、终点预测、重启、内存不足事件)中的FeatureVector映射到分类别的Feature(诸如内存泄漏、内存管理问题、正常
内存、压力过高、压力过低、护送效应、死锁等)。在对内存泄漏状态进行分类之后,CARE控制可以接收另一个信息改变的通知。
[0204] 机械学习技术,诸如学习支持矢量机的那些监督式学习技术,可以接收具有相关联的分类的特征矢量集合以作为输入,并且可以自动地学习以将其中的新数据点分类为属
于单独的不同分类。图14是示出了根据本发明实施例的已经被自动分类的数据点集合的示
例的图。在分类器1402的一侧的点被视为属于类1404,而在分类器1402的另一端的点被视
为属于类1406。例如,类1404可能包含“真”的数据项,而类1406可能包含“假”的数据项。在这个例子中,分类是二值的。在本发明的各种实施例中,分类可以是N路的,其中,N是类的数量。因此,支持矢量机可以接收特征矢量,并且通过使用一个或多个分类器,诸如先前以监督式的方式从分类的样本数据集合学习的分类器1402,可以基于该特征矢量内所包含的数
据来确定该特征矢量的类。一个类中的数据点可能指示在系统中存在内存泄漏,而其它类
中的数据点可能指示在系统中不存在内存泄漏。
[0205] 在调用Classfication函数之后,如果CARE控制选择Resolution函数,则它可以执行Resolution函数来生成Directive。在没有Assessment函数的情况下在Classification
函数之后生成的这种Directive可以用来沿着期望的轨迹操纵系统,以收集Fact的新分量
或者快速地避免灾难性故障。例如,如果FeatureVector指示JVM即将用完内存,则可以发出在周末重启JVM的Directive以避免在接下来的工作日的季节性高峰时间期间死机。在本发
明的实施例中,CARE处理循环可以通过发出Directive来迭代,以使所有的ObServation和
Prediction都保持在Norm或Objective的某容限内。
[0206] 在另一个示例情境中,CARE控制可以选择受新的FeatureVector中的新的Feature集合影响的Assessment函数。CARE控制可以从AssessmentInput关系中查询所需的影响
Assessment函数的FeatureVector。CARE控制然后可以查询满足Assessment函数所需的
Feature的闭包。在一种情况下,Assessment函数可以被分配给其默会知识简档与
Assessment函数的专长简档匹配的Actor。在另一种情况下,Assessment函数可以用贝叶斯网络表示。CARE控制可以在Feature空间上组成满足贝叶斯网络所需的FeatureVector。所
输入的用于贝叶斯网络的FeatureVector的ValidTime可以从如以上所讨论的每个分量
Feature的ValidTime推导得到。CARE控制然后可以发起贝叶斯网络的执行。在执行贝叶斯
网络之后,CARE控制可以具体化FeatureVector、表示Assessment函数的贝叶斯网络和
Hypothesis之间的关系。
[0207] 当得到与贝叶斯网络的Hypothesis相关联的新FeatureVector的改变通知时,CARE控制可以从ResolutionInput关系之中选择受该新的FeatureVector中的Feature影响
的任何Resolution函数。在获取与Resolution函数所需的FeatureVector对应的Feature的
闭包之后,CARE控制可以调用Resolution函数来生成Directive。如果Resolution函数由默会知识简档表示,则CARE控制可以识别其默会知识简档与Resolution函数的默会知识简档
最佳地匹配的一个或多个行动者,并且发起与这些行动者的交互以执行解析行动。CARE控
制可以具体化FeatureVector、Resolution函数和Directive之间的关系。
[0208] 在某些实施例中,当得到由Enactment或Classification函数生成的新FeatureVector的改变通知时,CARE控制处理可以选择SymptomResolution或
ClassificationResolution函数。CARE控制处理可以将所选择的SymptomResolution或
ClassificationResolution函数与为了生成Hypothesis的AssessmentResolution函数包
在一起。如果这样选择的SymptomResolution或ClassificationResolution函数与默会知
识简档相关联,则CARE控制处理将选择其默会知识简档与和该SymptomResolution或
ClassificationResolution函数函数相关联的默会知识简档匹配的一个或多个Actor。
CARE控制处理将选择AssessmentResolution函数,该AssessmentResolution函数提供用于
组成适当的Hypothesis的词汇(在[0049]和[0050]中被描述为引导社会标签化)。可能通过
使用引导社会标签化,CARE控制可以通过提供词汇库来要求Actor声明Hypothesis。CARE控制可以具体化FeatureVector、SymptomResolution或ClassificationResolution函数、
Hypothesis、Directive之间的关系。CARE控制可以将Actor和AssessmentResolution函数
包括在所述具体化中。FeatureVector和Hypothesis之间以及Hypothesis和Directive之间
的这种具体化关系可以用作样本案例,以便通过机器学习技术来开发自动的Assessment和
AssessmentResolution函数。
[0209] 在某些实施例中,当得到由Enactment函数生成的新FeatureType的改变通知时,CARE控制处理可以选择ExpertResolution函数。ExpertResolution函数典型地与默会知识
简档相关联。CARE控制将选择其默会知识简档与和ExpertResolution函数相关联的默会知
识简档匹配的一个或多个Actor。CARE控制将分配这些Actor来执行ExpertResolution函
数。可能通过使用引导社会标签化,Actor可以提供ExpertResolution函数的所有必要输
出,包括Observation、Prediction、Norm、Objective、Hypothesis和Directive。CARE控制然后可以具体化FeatureVector、ExpertResolution函数、Observation、Prediction、Norm、Objective、Hypothesis和Directive之间的关系。CARE控制可以将一个或多个Actor包括在所述具体化中。在这种情境下,Actor可以在单个步骤中履行Classification、Assessment和Resolution的作用。
[0210] 当得到Resolution函数必需的新的Directive的改变通知时,CARE控制可以选择受该新的Directive的FeatureVector中的新的Feature集合影响的Enactment函数。CARE控
制可以从EnactmentInput关系中查询所需的影响Enactment函数的FeatureType。CARE控制
然后可以查询满足Enactment函数所需的Feature的闭包。CARE控制然后可以调用受
Directive影响的Enactment函数。诸如用于收集目标JVM的堆转储的命令的指令可以被分
配给其简档包括JVM专长的Actor。
[0211] 支持客户服务请求、错误报告或在线帮助论坛的系统典型地让用户用自然语言文本发布问题,并且提交与该问题有关的一组文件。包括自然语言文本和日志文件的这些非
结构化的数据可以包括CARE中的一部分Fact和Information数据。典型地,分析师或其他参与者将通过用自然语言文本对用户的发布做出回应来建议问题解决方案。在某些实施例
中,自然语言处理(NLP)工具可以用来提取用户的问题描述文本中的FeatureVector以及分
析师的回应文本中的Directive。在本发明的实施例中,CARE控制可以指定用于具体化从外部存储库中的非结构化内容提取的FeatureVector和Directive的目的的
SymptomResolution函数。CARE控制可以通过针对服务请求、错误报告或在线帮助论坛中的每种情况具体化FeatureVector、SymptomResolution函数和Directive之间的关系来从外
部错误报告、服务请求、帮助论坛存储库导入样本案例。CARE控制可以使用从外部存储库中的案例提取的FSD和FeatureVector,以便通过调用系统的Classification、Assessment和
Resolution函数来模拟CARELoop。
[0212] 在示例情境下的几个CARE控制循环之后,Reification可以包括(1)用于GC日志的FSD集合,(1)又与(2)相关,其中(2)为由针对堆趋势的规则时间序列数据组成的FSD,(2)又与(3)相关,其中(3)为Classification函数,(3)又与(4)相关,其中(4)为从诸如季节性因素、等级漂移、等级位移、等级尖峰、方差变化、离群值之类的集合体推导出的
FeatureVector,(4)又与(5)相关,其中(5)为另一个Classification函数,(5)又与(6)相
关,其中(6)为与表示内存泄漏状态的FeatureVector,(6)又与(7)相关,其中(7)为用贝叶斯网络表示的Assessment函数,(7)又与(8)相关,其中(8)为表示作为Hypothesis的一部分的内存泄漏代码错误的FeatureVector,(8)又与(9)相关,其中(9)为Resolution函数,(9)又与(10)相关,其中(10)为用于进行堆转储的Directive,(10)又与(11)相关,(11)为涉及Actor的Enactment函数,(11)又与(12)相关,其中(12)为用于目标JVM的堆转储的FSD集合,(12)又与(13)相关,其中(13)为Classification函数,(13)又与(14)相关,其中(14)为从堆中的对象的直方图推导出的FeatureVector,(14)又与(15)相关,其中(15)为涉及Actor的
Assessment函数,(15)又与(16)相关,其中(16)为表示引起内存泄漏的代码的站点的
Hypothesis FeatureVector。季节性趋势过滤器的版本和过滤器参数也可以直接或间接相
关。当这些关系变得持久,或者变得可恢复并且对于其它可恢复事务可见时,这些关系可以被加上时戳TransactionTime,并且稍后通过使用双时态ValidTime和TransactionTime查
询而被调回。基于这些Reification关系,对于在数据中体现的任何事件,诸如在两个间隔之间发生的信息改变,用户可以确定该改变的原因是什么。关系可以显示出,例如,特定间隔期间的Fact被分类为内存泄漏,并且错误修复被作为用于修复内存泄漏的Directive发
出。在实施例中,用户可以指示系统显示所发出的所有Directive,以便了解在数据中为何发生改变。
[0213] 当每个Information项变得持久或者变得可恢复并且对于其它可恢复事务可见时,所公开的框架跟踪该项的ValidTime和TransactionTime。ValidTime和
TransactionTime这两者都可以允许Directive及其原因被很好地建立文档。对于每个
Directive,该Directive所基于的Information可以在形式上与该Directive相关。结果,对于每个Directive,用户可以回溯地确定从该Directive被发出的时刻起可用的
Information。随着时间的过去,可能由于先前发出的Directive,新的Information可能变得可用,并且可以在该Information变得可用(例如,变得可恢复并且对于其它可恢复事务
可见)时的不同TransactionTime,被回溯地应用于从过去的ValidTime起的状态。然而,因为在发出Directive之后发生的Information变化明显地与该Directive非因果地分开,并
且通过使用这些变化的TransactionTime进行描绘,但是从在形式上与该Directive相关的
ValidTime属性起,这些改变可以被回溯地应用。如果后来获取的可能影响Directive的选
择的Information那时已经可用,则该Information可以被明确地识别为与该Directive非
因果,并且可以通过使用TransactionTime来从视图中过滤,以使得用户不被可能本该使不同的Directive被发出的Information困惑。在任何时刻,系统可以通知用户特定Directive被发出的原因以及在该Directive的ValidTime可用的Information,以便在任何新的
Information在后来的TransactionTime被修正之前,通过调回自早先的TransactionTime
起的Information,来支持该特定Directive的选择。在某些实施例中,该双时态起源能力用来满足某些规章要求。
[0214] 生命表征的系统趋向和预报
[0215] 以上所讨论的框架可以用在确定趋势并且预报计算系统的“生命表征”的未来行为的技术中。这种生命表征可以包括例如JAVA虚拟机(JVM)的内存堆使用以及编程线程或
栈段的强度。通过确定这些生命表征的趋势,可以确定计算系统是否有可能死机。基于这种趋势,可以做出关于计算系统何时有可能死机的预报。响应于这种预报,系统管理员可以在预测的死机之前安排系统重启或维护,使得可以避免死机。
[0216] 确定趋势的任务可以被概念化为事实的分类以便生成信息。以上所讨论的框架可以系统地支持这种分类功能。在该特定领域中,事实可以涉及关于JVM在各个时间点使用了多少内存和/或各种程序代码块被执行的强度的事实。分类可以包括应用获取这些事实并
且生成结论性信息(诸如明显存在内存泄漏或者特定程序代码块是过度的“热点”)的自动
化处理。
[0217] 为符合服务等级协议(SLA)而对性能参量进行的连续监视是对于云服务提供商的关键操作要求之一。它需要预测诊断能力来检测即将发生的SLA违反,以使得操作能够规避大多数SLA违反,并且当违反发生时提供问题的较快解决以最小化对客户体验的影响。预测诊断解决方案的功效的关键在于系统的相对高级别的状态空间模型的表示,所述状态空间
模型的表示负责根据低级别事件和测量结果来对状态进行估计和更新,并且可以有效地预
测关键的性能指标的轨迹。系统状态变量应包括构成系统功能的生命表征的各种系统统计
的测量结果。可以与表示基本身体机能的生命表征的各种生理统计(诸如心率、血压、体温和呼吸率)的测量作类比,所述各种生理统计的测量由取决于患者的年龄、活动、环境背景的正常范围和异常范围表征。
[0218] 云服务功能的生命表征可以基于根据以规律的时间间隔获取的一系列线程转储样本针对各种线程和栈段类的强度统计的测量来定义。该生命表征的解释可以由按泊松过
程和排队理论的框架表述的线程或栈段强度统计的分析模型来通知。强度驱动的分类技术
可以被应用于递增地对线程和栈段进行分类。系统的状态模型可以通过使用Holt-Winter
指数移动平均滤波器来用每个线程和线程段类的强度的季节性趋势、线性趋势和一阶非线
性趋势表示。状态模型表征系统的形成检测测量离群值的基线的常规操作范围。一簇离群
值可以表示系统的压力过高或压力过低状态,这些状态可以与系统故障相关联,并且可以
被用户观察作为SLA违反。该模型支持线程段的动态分类以及对分类层次结构进行下挖以
观察线程段的特定子类的强度的能力,从而改善作为SLA问题的领先指标的小性能失灵的
可观察性和灵敏性。该模型还支持季节性调整的长期性能趋势预报。线程或栈段强度可以
用作系统功能的生命表征。系统功能的生命表征的可观察性、灵敏性和预报全都使得有效
的预测性诊断能力成为可能。此外,该模型支持线程类之间的依赖信息以捕捉线程之间的
线程间通信的和进程间的通信,提供对于通信信道中的队列或线程之间的资源池的通信量
强度的可观察性。
[0219] 从Oracle公共云中的融合应用(Fusion Application)的中间层中的WebLogic服务器的线程转储可以表现出与该中间层、操作系统(OS)、网络和数据库中的系统故障相关
的模式。WebLogic服务器可以被插装为测黏联长于指定时间(默认为10分钟)的线程。本发
明的实施例可以利用线程强度的季节性趋势和长期趋势的提供了自适应方法的状态模型
来检测黏联长于预期响应时间的线程。一大簇黏联线程指示由于后台服务器和数据库下游
的拥塞而导致系统的压力过高状态。该模型还可以检测由于使许多线程空闲的系统的上游
拥塞而导致系统的压力过低状态。空闲线程的高强度是黏联线程的高强度的逆。
[0220] 线程段分类签名可以从如下线程转储档案学习:通过云从所有的用户舱(pod)收集的线程转储档案、以及来自可以放大每个线程类的强度的压力测试系统的线程转储档
案。线程分类签名可以通过MapReduce算法从存储在Hadoop分布式文件系统(HDFS)集群中
的大量线程转储中提取。这些分类签名可以被自展(bootstrap)到产生式系统(production system)中的预测性诊断监视器上。
[0221] 线程强度或栈段强度
[0222] 线程或栈段强度提供了系统功能中的性能热点的“热度”的统计度量。代码块的热度可以用该代码块的调用次数乘以该代码块的执行时间来量化。工具可以测量低级别事件的调用计数和响应时间,所述低层次事件诸如是指令指针处的指令、方法、系统调用、同步等待、硬件计数器溢出等的执行。可以将应用程序插装为收集事件的精确测量,但是在这种方法中,所述插装可能影响测量。当随着调用计数增加,围绕方法的插装代码的执行时间支配该方法本身的执行时间时,该问题可能更为突出。在这个方面,通过事件的统计采样来估计热度度量比准备测量更有效。由CPU供应商(包括Oracle、Intel和AMD)提供的性能分析工具利用设在CPU中的硬件计数器来对事件进行采样。这些工具提供了对事件的基于时间的
或基于事件的统计采样。在基于时间的采样中,工具记录每个计时器中断事件时的事件属
性,诸如时间戳、指令指针、内核微观状态、线程id、进程id、CPU核id以及调用栈。在基于事件的采样中,工具记录硬件计数器溢出事件时的类似的一组事件属性。Oracle、Intel和AMD的CPU提供了对L1/L2高速缓存缺失(cache miss)、分支误预测、浮点运算等进行采样的一
组硬件计数器。程序中的指令指针的采样计数的直方图通常传达该程序中的热点的定性简
档。GNUgprof对子程序的执行时间进行采样,但是使用代码插装来测量调用计数。采样误差经常大于一个采样周期。如果子程序的预期执行时间是n个采样周期,则执行时间估计的预期误差是n个采样周期的平方根。
[0223] 程序的不同部分的热点简档可以用调用图、调用树和调用栈视角呈现。在每种视角中,调用计数统计可以与基本执行时间统计组合来针对向上翻卷或下挖的视角将执行时
间归于调用者和被调用方法。程序中的指令指针的采样计数的直方图典型地传达该程序中
的热点的定性简档。
[0224] 线程或栈段强度统计的分析模型表明:站点(指令指针或栈踪迹)的基于时间的和基于事件的采样提供这样的计数器,该计数器不应被解释为近似于通过插装技术测量的执
行次数的精确计数。通过统计采样推导的计数器值考虑了站点的执行频率和站点的响应时
间这两个因素因素。站点的执行次数的精确计数未考虑执行时间这一因素。给定指令指针
站点处的指令的执行时间取决于该指令所需的CPU时钟周期的数量。统计采样计数所考虑
的额外因素是指令指针站点的精确执行计数和统计采样之间的归一化均方根误差、采样覆
盖范围和阶次离差度量的观察差异中的重要因素。站点的统计采样可以被看作分析模型中
的强度度量。
[0225] 通过扩展这些分析技术,本发明的实施例可以使用强度统计来对调用栈进行自动分类,并且用于标示系统生命表征的季节性、线性和一阶非线性趋势的状态空间表示基线。
本发明的实施例可以将单个线程类的调用栈模型扩展为捕捉线程类之间的依赖性以供用
于线程间和进程间通信。该模型可以表示经由远程方法调用(RMI)、Web服务、JAVA数据库连接(JDBC)连接、JAVA命名和目录接口(JNDI)连接等的客户端-服务器调用中所涉及的调用
栈链。它还可以表示两个或更多个调用栈进入关键部分或者从资源池(诸如JDBC连接池)获
取资源的交互。两个正交互的调用栈的强度统计之间的差异可以揭示通信信道中的拥塞或
者它们之间的资源池的拥塞。此外,调用栈依赖性模型使得操作者能够使来自多个服务器
的发病报告相互关联。通过可诊断性框架沿着调用链传播的执行上下文ID(Execution 
Context ID,ECID)可以用来使跨越中间件和数据库层的异常踪迹相互关联,以帮助对个别执行上下文中的问题进行根本原因分析。为了使用诸如线程或栈段强度统计指令的系统生
命表征来对系统问题进行诊断,线程或栈段类之间的依赖性信息可以用来使跨越中间件和
数据库层的发病相互关联,以帮助进行根本原因分析。
[0226] 为了对数据库层线程进行下挖,系统可以收集对于以下的统计:高级别结构化查询语言(SQL)声明执行状态报告(诸如SQL自动工作量责任(AWR)报告)、以及数据库服务器
OS进程的低级别线程转储。阻止经由JDBC连接的数据库操作的每个线程类可以与数据库服
务器中的SQL声明执行计划相关。诸如在两个SQL AWR快照之间的间隔中SQL声明执行计划
的执行计数和执行时间的统计可以被周期性地采样。SQL声明执行计划的执行强度可以被
推导为执行计数和平均执行时间的乘积。从中间层中的高强度数据库操作线程起,实施例
可以下挖到数据库层中的高强度SQL声明以便诊断问题。例如,次优执行计划可能下挖到不适当的数据库方案设计或者用于谓词评估的适当索引的缺乏。因此,线程依赖性信息模型
使得监视器能够使中间层和数据库层线程的强度相关联,以提供完整的端对端图片。
[0227] 中间件和数据库服务的分类
[0228] 融合应用(Fusion Application,FA)包括财务管理、客户关系管理(CRM)、人力资本管理(HCM)、供应链管理(SCM)、项目组合管理(PPM)、采购以及治理风险合规(Governance Risk Compliance)。融合应用按表示融合应用的子集的逻辑支柱(logical pillar)进行组
织;例如,租用系统可以由三个支柱组成,一个支柱包括财务、SCM、PPM和采购服务,第二个支柱包括HCM服务,第三个支柱包括CRM服务。支柱结构使得能够对大型系统进行粒度维护、修补和升级。支柱可以共享同一个FA数据库,但是为了使得能够对应用和数据方案进行粒
度维护、修补和升级,每个支柱应具有单独的数据库,在数据库之间具有表备份。如果两个或更多个支柱的数据库正在使用不同版本的表,则Oracle数据集成器(ODI)可以执行它们
之间的数据转换。Oracle公共云(Oracle Public Cloud,OPC)中的FA租用舱安装包括支柱
的FA服务家族集合来分类;例如,之前示例中的三个FA舱将分别按照(财务、SCM、PPM和采购支柱)、(HCM支柱)和(CRM支柱)进行分类。
[0229] Oracle融合应用架构被定义在融合中间件架构的顶部,所述融合中间件架构通过将应用组织到服务器和域的逻辑拓扑中来支持应用服务的高可用性和负载均衡,其中所述
逻辑拓扑可以被映射到几个可能的Oracle虚拟机(OVM)拓扑(通过编辑由Oracle Virtual 
Assembly Builder生成的汇编)或者跨多个主机分布的物理拓扑。服务器是运行应用服务
的WebLogic服务器的实例。域是包含WebLogic服务器的一个或多个实例的WebLogic服务器
域。诸如用于财务管理的{总分类账,应收款项,应付款项}之类的FA服务家族可以按财务域中的一组服务器进行组织。FA服务沿着域x服务器维度进行分类,例如(财务域,管理服务
器)、(财务域,总分类账服务器)、(财务域,应收款项服务器)、(财务域,应付款项服务器)、(CRM域,管理服务器)、(CRM域,客户服务器)、(CRM域,销售服务器)、(CRM域,订单采集服务器)等。为了负载均衡和高可用性,可以将每类FA服务部署在集群中。
[0230] 域和服务器集群结构可以被映射为舱中的适当的OVM拓扑。例如,融合应用舱中的跨所有域的管理服务(包括(CRM域,管理服务器)、(SCM域,管理服务器)、(HCM域,管理服务器)、(财务域,管理服务器)等)可以被映射到同一个管理OVM。对于CRM租户,相比其它服务需要更多CPU和内存资源的两类服务(CRM域,客户服务器)和(CRM域,销售服务器)可以在集群中被映射为一对主要OVM,而(CRM域,...)、(SCM域...)、(HCM域,...)、(财务域,...)、(采购域,...)和(项目域,...)类之间的支持服务可以在集群中被合并为另一对次要OVM。某些融合中间件服务,诸如ODI服务器(Oracle数据集成器)、SOA服务器(融合中间件SOA)和ESS
服务器(企业调度器服务),可以被复制在每个域中以划分工作负荷。
[0231] 融合应用舱包括可以被映射到RAC数据库服务器的几个不同拓扑的三个逻辑数据库服务,即,OAM DB(用于Oracle访问管理器)、OIM-APM DB(用于Oracle身份管理和授权策略管理器)以及融合DB(用于应用方案)。OAM存储库包含用于认证、单点登录(SSO)和身份断言的策略;OIM存储库包含用户简档和群组成员资格;APM存储库包含RBAC授权策略。融合DB包含用于FA、MDS、SOA、BI、UCM和WebCenter的各种存储库。Oracle访问管理器(OAM)和授权策略管理器(APM)使用WebLogic安全服务提供程序接口来为Java授权和认证服务(JAAS)以
及Java容器授权合同(JACC)提供服务。WebLogic服务器中的OAM网门(WebGate)、访问门
(AccessGate)和Web服务管理器(OWSM)组件访问OAM存储库中的认证策略。WebLogic服务器
中的Oracle平台安全服务(OPSS)框架访问OIM存储库中的用户的群组成员资格信息,并且
使用该信息来访问APM存储库中的RBAC授权策略。
[0232] FA服务器中的数据访问操作可以由它们所依赖的数据库服务(数据库,OAM DB)、(数据库,OIM-APM DB)和(数据库,融合DB)来识别。以下数据库依赖性信息可以被合并在模型中:
[0233] FA服务器中的OAM连接依赖于访问服务器和OAM DB,
[0234] FA服务器中的JNDI连接依赖于Oracle互联网目录服务器和OIM-APM DB,
[0235] FA服务器中的来自OPSS框架的JDBC连接依赖于OIM-APMDB,
[0236] FA服务器中的来自ADF业务组件(ADF Business Component,ADF-BC)和元数据服务(MDS)的JDBC连接依赖于融合DB,
[0237] SOA和BI服务器中的来自BPM、WebCenter、UCM和BI的JDBC连接依赖于融合DB。
[0238] SQL声明的分类
[0239] 云客户(租户)的FA服务可以跨多个支柱/舱、域和服务器集群分布。分布式服务器有效地将数据库连接划分为JDBC连接池。根据服务质量(QoS)要求,系统可以向每个池分配不同数量的JDBC连接。例如,销售服务器、订单采集服务器、营销服务器、分析服务器等中的连接池可以被分配不同数量的JDBC连接,以控制QoS。连接池的大小调节可以由以下指导:
执行数据库操作、等待JDBC连接池中的连接的中间层数据库操作线程类以及活跃的SQL声
明类的周期性强度趋势和阻抗匹配。通过中间层连接池划分数据库连接有助于对SQL声明
进行分类,并且使得能够隔离问题。它可以防止低优先级应用中的调节不良的SQL声明阻塞高性能SQL声明用于高强度中间层线程。
[0240] 通过栈踪迹对线程和线程依赖性关系的分类
[0241] 黏联线程的栈踪迹可以揭示阻塞该线程的操作。例如,通过以下栈踪迹开头附近的栈框架“oracle jdbc driver OracleStatement doExecuteWithTimeout”,可以推断出线程正在阻止数据库操作:
[0242] oraclejdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatementjava:991)
[0243] oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1285)
[0244] oracle.mds,core,MetadataObject.getBaseMO(MetadataObject.java:1048)
[0245] oracle.mds.core.MDSSession.getBaseMO(MDSSession.java:2769)
[0246] oracle.mds.core.MDSSession.getMetadataObject(MDSSession.java:1188)
[0247] oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:150)
[0248]oracle.apps.setup.taskListManager.ui.customization.CustomizationFilter.doFilt
er(CustomizationFilter,java:46)
[0249] weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2209)
[0250] weblogic .servlet .internal.ServletRequestImpl .run(ServletRequestImpl.java:1457)
[0251] weblogic.work.ExecuteThread.execute(ExecuteTkread.java:250)
[0252] weblogic.work.ExecuteThread.run(ExecuteThread.java:213)
[0253] 在以上栈踪迹中,JDBC驱动程序栈下面的栈框架“oracle  mds  core MetadataObject getBaseMO”指示:MDS库发出了JDBC操作。MDS库栈下面的栈框架“oracle adf model servlet ADFBindingFilter doFilter”指示:MDS被ADF应用调用,这是通过超文本传输协议(HTTP)小服务程序(servlet)请求而被调用的。因为该线程是在CRM域中的客
户服务器Weblogic实例中被观察到的,所以黏联线程可以被分类为(CRM域,客户服务器,
HTTP小服务程序,ADF应用,ADF.MDS,数据库操作)。该线程依赖于按照(DATABASE,融合DB)分类的数据库服务器线程。
[0254] 以下是另一个黏联线程的栈踪迹:
[0255] com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2640)
[0256] com.sun.jndi.ldap.LdapCtxFactory.getInitialCon.text(LdapCtxFactory.java:48)
[0257] javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:637)
[0258] javax.naming.InitialContext.init(InitialContext.java:219)
[0259]atoracle.adf.controller.internal.security.AuthorizationEnforcer.checkPermissi
on(AuthorizationEnfbrcer.java:114)
[0260] oracle.adf.model.servlet.ADFBindingFilter.doFilter(ADFBindingFilter.java:150)
[0261]oracle.apps.setup.taskListManager.ui.customization.CustomizationFilter.doFilt
er(CustomizationFilter.java:46)
[0262] weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2209)
[0263] weblogic .servlet .internal.ServletRequestImpl .run(ServletRequestImpl.java:1457)
[0264] weblogic.work.ExecuteThread.execute(ExecuteThread.java:250)
[0265] weblogic.work.ExecuteThread.run(ExecuteThread.java:213)
[0266] 该黏联线程被轻量级目录访问协议(LDAP)连接阻塞。JNDI栈下面的栈框架“oracle adfinternal controller state ControllerState checkPermission”指示:ADF控制器正在使用LDAP连接,可能从LDAP服务器加载权限对象以供用于授权检查。第二个线
程在栈框架“oracle adf model servlet ADFBindingFilter doFilter”下面具有与第一
个线程相同的栈踪迹。它因此与第一个线程共享共同的类(HTTP小服务程序、ADF应用)。如果第二个线程也是在CRM域中的客户服务器Weblogic实例中被观察到的,则它将被分类为
(CRM域,客户服务器,HTTP小服务程序,ADF应用,ADF-SECURITY,LDAP操作)。第二个线程依赖于按照(OID)分类的OID线程,OID线程又依赖于按照(DATABASE,OIM-APM DB)分类的数据库服务器线程。
[0267] 线程分类信息模型捕捉一个线程类对另一个线程类的依赖性。例如,针对超级线程类定义以下依赖性,以概括子类的依赖性:
[0268] (ADF Web Service Invocation)→(ADF Web Serviec,ADF-BC)
[0269] (ADF-BC,DATABASE Operation)→(DATABASE,Fusion DB)
[0270] (ADF-MDS,DATABASE Opcration)→(DATABASEFusion DB)
[0271] (ADF-SECURITY,DATABASE Operation)→(DATABASE,OIM-APM DB)
[0272] (ADF-SECURITY,LDAP Operation)→(OID)→(DATABASE,OIM-APM DB)
[0273] (SOA-BPEL,DATABASE Operation)→(DATABASE,Fusion DB)
[0274] (ESS,DATABASE Operation)→(DATABASE,Fusion DB)
[0275] 依赖性关系(ADF Web Service Invocation)→(ADF Web Service,ADF-BC)是包括ADF服务之间的依赖性关系的许多子类的概括。该依赖性关系的子类之一是(CRM 
Domain,Sales Server,ADF-Application,ADF Web Service Invocation)→(CRM Domain,Order Capture Server,ADF Web Service,ADF-BC,DATABASE Operation)。关系的客户端端和服务器端上的线程段都可以被下挖。例如,依赖性关系(ADF-BC,DATABASE Operation)→(DATABASE,Fusion DB)可以被下挖到高强度关系(CRM Domain,Order Capture Server,ADF Web Service,ADF-BC,DATABASE Operation)→(DATABASE,Fusion DB)。类似地在服务器端上,数据库中的调用图、调用树或调用栈模型(包括SQL执行计划和执行踪迹)可以被下挖到(DATABASE,Fusion DB)线程的高强度子类。
[0276] 包容层次结构
[0277] 分类方案的包容层次结构(subsumption hierarchy)由元组投影引起。例如,假定元组(客户服务器,ADF应用)是元组(CRM域,客户服务器,HTTP小服务程序,ADF应用)的投影,则分类(CRM域,客户服务器,HTTP小服务程序,ADF应用)被包容在分类(客户服务器,ADF应用)下。因为分类(CRM域,客户服务器,HTTP小服务程序,ADF应用,ADF-MDS,数据库操作)和(CRM域,客户服务器,HTTP小服务程序,ADF应用,ADF-SECURITY,LDAP操作)被包容在分类(CRM域,客户服务器,HTTP小服务程序,ADF应用)下,所以以上两个样本线程都被包容在
(CRM域,客户服务器,HTTP小服务程序,ADF应用)的任何投影下。因此,这两个样本线程的统计被聚合在(CRM域,客户服务器,HTTP小服务程序,ADF应用)及其超类的统计中。
[0278] 除了HTTP小服务程序之外,ADF应用程序还可以通过Outlook连接器和Web服务被调用。在(信道x应用)维度中可以定义附加分类:
[0279] (HTTP小服务程序,ADF应用)
[0280] (Outlook连接器,ADF应用)
[0281] (Web服务,ADF应用)
[0282] ADF应用被部署在不同域中的不同服务器中。可以通过获取叉积(域x服务器x信道x应用)来对它们进行分类。例如,分类(CRM域,客户服务器,HTTP小服务程序,ADF应用,)、(CRM域,客户服务器,Outlook连接器,ADF应用)和(CRM域,客户服务器,Web服务,ADF应用)具有最小的公共的超类(CRM域,客户服务器,ADF应用)。
[0283] 仅举几例,操作维度包括分类:数据库操作、LDAP操作、Web服务调用。仅举几例,数据访问库是包括分类ADF-MDS、ADF-SECURITY、ADF-BC、AQ-JMS的另一个维度。可以通过获取叉积(域x服务器x信道x应用x库x操作)来对类层次结构进行下挖。
[0284] 在LISP表述中,元组可以被看作线程的状态具有从reverse(cdr(reverse(tuple)))到(tuple)的有效状态转变。在这种情况下,car(reverse(tuple))在栈踪迹的顶部给出栈框架。例如,当ADF应用调用ADF-BC时,处于状态(HTTP小服务程序,ADF应用)的线程可以转变为状态(HTTP小服务程序,ADF应用,ADF-BC)。
[0285] 本文中公开了一种强度驱动的分类技术,该强度驱动的分类技术随着时间跟踪每个栈框架的强度,并且用由栈框架的强度引起的、栈框架之间的等价关系来区分栈踪迹中
的栈段。它对于在具有相同强度的相同栈段中出现的栈框架给予相同的分类。该分类技术
不断地将栈段分为更小的栈段,因为段中的独个栈框架的强度随着时间而发散。每当栈段
被分为组成段时,该技术对每个组成段创建新的分类。例如,该技术可以从栈段的分类(ADF应用业务组件)开始,当(ADF-BC)段的强度偏离(ADF应用)段的强度时,分类(ADF应用业务
组件)可以被划分为(ADF应用)和(ADF-BC)。分类(ADF应用业务组件)是(ADF应用,ADF-BC)
的别名,(ADF应用,ADF-BC)被包容在新的分类(ADF应用)和(ADF-BC)下。
[0286] 每当新的分类被创建来对栈段进行分类时,该技术产生全局唯一标识符(GUID)。当栈段被分为各被分配新的分类的组成段时,该算法可以从合并段的分类标识符推导出新
的分类标识符。例如,合并段的标识符可以是546372819。如果该段被分为2个组成段,则该技术可以将标识符546372819-1和546372819-2分配给组成段。如果段546372819-1被再次
分为2个组成段,则该技术可以将标识符546372819-1-1和546372819-1-2分配给组成段。
[0287] 默会知识可以被应用于将诸如(AFD-BC)、(ADF-MDS)或(ADF-VIEW)之类的有意义的名称分配给分类。默会知识还可以分配诸如信道、应用或操作之类的维度来组织分类。可以提供分类和维度的知识基础来自展自动分类技术。如果知识基础指定例如(ADF-VIEW)的
名称,则对于随后被分为组成段的栈段的分类,该技术可以从合并段的名称(ADF-VIEW)推
导用于组成段的分类名称,诸如(ADF-VIEW-1)、(ADF-VIEW-2)、(ADF-VIEW-1-1)等。
[0288] 默会知识可以帮助创建和维护线程依赖性关系的知识基础,所述线程依赖性关系用于将服务上的发病和有问题的服务器相关联,来帮助根本原因分析。线程依赖性关系,诸如[(ADF Web Service Invocation,HTTP-Client)→(ADF Web Service,ADF-BC)]和
[(ADF-BC,DATABASE Operation)→(Database,Fusion DB)]是按照由默会知识分配的栈段名称定义的。
[0289] 线程或线程段强度统计的上卷或下挖
[0290] 该分类方案提供用于上卷(roll-up)或下挖统计分析的许多维度。一个令人关注的统计是线程或栈段类的强度。假定到达为Poisson分布,通过Little公式,期望强度ρ(在与期望响应时间τ对应的时间间隔期间的期望到达次数)与期望响应时间τ和到达率λ相关:
[0291] ρ=λ·τ
[0292] 线程或栈段类的平均强度可以根据规律地(例如,每1分钟)获取的一系列线程转储样本来测量。已知恒定到达率λ,线程或栈段的平均强度ρ与这些线程或栈段的平均响应时间τ成比例。对于季节性指标,到达率可以被假定为在短时间段(例如,15分钟时间间隔)期间不改变。Holt-Winter预报和季节性趋向过滤器可以在许多季节性周期上跟踪每个季
节性指标的季节性因素。如果由季节性指标的季节性因素调整后的样本强度的尖峰高于平
均强度,则它指示线程的黏联长于平均响应时间。离群值过滤器可以将这检测为异常。
[0293] 每个线程转储中的线程或栈段类(调用某操作)的强度可以是采样时间窗口的期望长度内的操作的到达次数的度量。强度提供了采样时间窗口的期望长度的间接测量。
[0294] 线程或栈段强度统计暗示:系统将趋向于看见具有高到达率和长响应时间的组合的线程或栈段的栈踪迹。可以通过对相应的栈踪迹在足够数量的线程转储上的出现进行计
数来检测强度小于1(诸如0.05的分数值)的线程或栈段。例如,到达率为0.5每秒、期望响应时间为0.1秒的线程或栈段类将具有0.05每线程转储的期望线程或栈段强度。0.05每线程
转储的强度意味着,平均来说,在20个线程转储中是应能检测到该线程或栈段类的栈踪迹
的一次出现。如果每个线程转储表示期望长度τ=0.1秒的采样时间窗口,则20个线程转储合计达期望长度20·τ=2秒的采样时间窗口。因此,该线程或栈段类在2秒窗口中的期望出现数量由20·γ·τ=1给出。
[0295] 对于Poisson过程,以上推理是有效的,只要采样时间窗口不重叠。为了确保采样时间窗口不重叠,采样间隔必须远大于给定线程类的期望响应时间τ。本文中公开了一种抗混叠方法,该方法检测已经在前面的采样时间窗口中计数的黏联线程,以确保系统仅对在
当前采样时间窗口内到达的那些线程进行计数。这使采样时间窗口保持不重叠。如果线程
不黏联,则拖延线程(lingering thread)仍然可以在连续的线程转储中表现为不同的子
类。例如,ADF应用线程在一个线程转储中作为(ADF应用,ADF-MDS)和在另一个线程转储中作为(ADF应用,ADF-BC)被计数多次。本发明的实施例避免对拖延线程计数不止一次以确保采样时间窗口是独立的。如果根类之间的应用(诸如设立线程的执行上下文的小服务程序
过滤器)在线程名称中附加历元计数器(epoch counter),则为了防混叠,可以检测拖延线
程。历元计数器可以与线程的执行上下文的ECID相关。
[0296] 嵌套线程或栈段强度统计
[0297] 嵌套子类可以被表示为状态机中的状态。例如,示例类(ADF应用)可以包含示例性子类(ADF应用,ADF-BC),该子类(ADF应用,ADF-BC)可以包含示例性子类(ADF应用,ADF-BC,数据库操作)。这三个嵌套子类中的每一个均可以被表示为状态机中的状态。
[0298] 这些子类中的每一个中的线程可以具有各种强度。为了以下讨论的目的,ρ(ADF)表示(ADF应用)线程的强度,ρ(ADF-BC)表示(ADF应用,ADF-BC)线程的强度,ρ(ADF-BC-
JDBC)表示(ADF应用,ADF-BC,数据库操作)线程的强度。(ADF应用,ADF-BC,数据库操作)线程的强度被包括在(ADF应用,ADF-BC)线程的强度中,(ADF应用,ADF-BC)线程的强度又被包括在(ADF应用)线程的强度中。
[0299] (ADF应用,ADF-BC,数据库操作)线程的强度表示数据库操作在间隔τ(ADF-BC-JDBC)内的到达次数。数据库操作的这些到达能够在它们离开之前获取的线程转储中观察
作为JDBC栈。数据操作的到达和离开可以在状态机中被表示为到“开始数据库操作”和“结束数据库操作”状态的状态转变。强度(即,期望到达次数)依赖于到达点的密度以及“开始数据库操作”和“结束数据库操作”状态之间的时间间隔的期望长度。如果到达点的密度λ和/或数据库操作的期望响应时间τ(ADF-BC-JDBC)达到尖峰,则数据库操作的强度将达到
尖峰。假设到达点的密度λ在季节性指标内是恒定的,则强度尖峰可以归因于数据库操作的黏联变得长于期望。这三个嵌套线程类的强度可以沿着链上卷:
[0300]
[0301] 拆分线程或栈段强度统计
[0302] 调用ADF-BC库的线程的一小部分可能需要使用JDBC来执行数据访问,而这些线程的其余部分可以访问高速缓存中的数据。该情境的状态转变图可以通过将Poisson过程拆
分为两个Poisson子过程来表示。如果λ(ADF-BC)表示ADF-BC线程的到达密度、λ(ADF-BC-JDBC)表示ADF-BC-JDBC线程的密度、λ(ADF-BC-cache)表示跳过JDBC操作的ADF-BC线程的
密度,则两个Poisson过程ADF-BC-JDBC和ADF-BC-cache的和是Poisson过程ADF-BC,后者的密度和强度由以下方程给出:
[0303] λ(ADF-BC)=λ(ADF-BC-JDBC)+λ(ADF-BC-cache)
[0304] ρ(ADF-BC)=ρ(ADF-BC-JDBC)+ρ(ADF-BC-cache)
[0305] 如果p表示调用JDBC操作的λ(ADF-BC)的百分比,则
[0306] λ(ADF-BC-JDBC)=p·λ(ADF-BC)
[0307] λ(ADF-BC-cache)=(1-p)·λ(ADF-BC)
[0308] 如果对应的期望响应时间用τ(ADF-BC)、τ(ADF-BC-JDBC)和τ(ADF-BC-cache)表示,则
[0309] ρ(ADF-BC)=ρ(ADF-BC-JDBC)+ρ(ADF-BC-cache)
[0310] ρ(ADF-BC)=λ(ADF-BC-JDBC)·τ(ADF-BC-JDBC)+λ(ADF-BC-cache)·τ(ADF-BC-cache)
[0311] λ(ADF-BC)·τ(ADF-BC)=p·λ(ADF-BC)·τ(ADF-BC-JDBC)+(1-p)·λ(ADF-BC)·τ(ADF-BC-cache)
[0312] τ(ADF-BC)=p·τ(ADF-BC-JDBC)+(1-p)·τ(ADF-BC-cache)
[0313] 嵌套线程类的强度可以沿着有向链上卷:
[0314]
[0315]
[0316] 合并线程或栈段强度统计
[0317] 两个示例性线程类(客户服务器,HTTP小服务程序,ADF应用)和(客户服务器,Outlook连接器,ADF应用)可以被合并在示例性超类(客户服务器,ADF应用)下。ADF应用的强度统计包括通过HTTP小服务程序和Outlook连接器的请求。可以假设对于HTTP小服务程
序和Outlook连接器信道,ADF应用的响应时间是相同的。
[0318] τ(ADF)=τ(HTTP-ADF)=(Outlook-ADF)
[0319] 合并进程的到达率为:
[0320] λ(ADF)=λ(HTTP-ADF)+λ(Outlook-ADF)
[0321] 合并进程的强度为:
[0322] ρ(ADF)=λ(ADF)·τ(ADF)
[0323] =(λ(HTTP-ADF)+λ(Outlook-ADF))·τ(ADF)
[0324] =λ(HTTP-ADF)·τ(HTTP-ADF)+λ(Outlook-ADF)·τ(Outlook-ADF)
[0325] =ρ(HTTP-ADF)+ρ(Outlook-ADF)
[0326] 分割线程或栈段强度统计
[0327] 示例性线程类(ADF应用)可以包括三个示例性线程子类(ADF应用,ADF-BC)、(ADF应用,ADF-MDS)和(ADF应用,ADF-SECURITY)。这三个线程子类表示由复合状态对分量状态的一系列调用。对应的线程强度可以用以下方式表示。ρ(ADF-BC)表示(ADF应用,ADF-BC)线程的强度;ρ(ADF-MDS)表示(ADF应用,ADF-ADS)线程的强度;ρ(ADF-SECURITY)表示(ADF应用,ADF-SECURITY)线程的强度。
[0328] ADF应用的期望响应时间可以被分割为ADF-BC、ADF-MDS和ADF-SECURITY调用的响应时间:
[0329] τ(ADF)≈τ(ADF-BC)+τ(ADF-MDS)+τ(ADF-SECURITY)
[0330] ADF应用的线程或栈段强度可以按分量响应时间进行分割:
[0331] ρ(ADF)≈λ(ADF)·τ(ADF)
[0332] ≈λ(ADF)·(τ(ADF-BC)+τ(ADF-MDS)+τ(ADF-SECURITY))
[0333] 因为到达密度λ(ADF)对于所有3个子类都是相同的,所以超类线程或栈段的强度由3个线程或栈段子类的强度组成:
[0334] ρ(ADF)≈λ(ADF-BC)·τ(ADF-BC)+λ(ADF-MDS)·τ(ADF-MDS)+λ(ADF-SECURITY)·τ(ADF-SECURITY)
[0335] ≈ρ(ADF-BC)+ρ(ADF-MDS)+ρ(ADF-SECURITY)
[0336] 因此,复合状态的期望强度可以成比例地归于分量状态的期望强度。
[0337] 将线程或栈段强度统计中的到达率相乘
[0338] 假设ADF-JAAS表示可以从处于ADF-BC、ADF-MDS和ADF-SECURITY状态的任何栈框架中多次调用的访问控制检查,投影(ADF应用,ADF-JAAS)表示执行访问控制检查的线程的状态。它合并以下三个子类(ADF应用,ADF-BC,ADF-JAAS)、(ADF应用,ADF-MDS,ADF-JAAS)和(ADF应用,ADF-SECURITY,ADF-JAAS)的强度统计。
[0339] 取决于每个ADF应用可以调用访问控制检查的期望次数,状态(ADF应用,ADF-JAAS)的到达率λ(ADF-JAAS)可以是ADF应用的到达率λ(ADF)的倍数。在以下方程中,ω表示乘积因子。
[0340] λ(ADF-JAAS)=ω·λ(ADF)
[0341] ADF线程样本的到达过程是Poisson到达过程。ADF-JAAS线程样本的到达过程不是Poisson到达过程,因为ADF-JAAS线程样本的多次到达可能依赖于一个ADF线程样本的到
达。然而,我们仍然可以应用Little公式ρ=λ·τ,该公式适用于任何平均遍历的到达过程。
我们主张ADF-JAAS线程样本的到达过程是平均遍历的,因为如果任何两个ADF-JAAS线程样
本的到达时间之间的间隔足够大,则它们的到达是独立的。线程或栈段(ADF应用,ADF-
JAAS)的强度因此由以下方程给出:
[0342] ρ(ADF-JAAS)=λ(ADF-JAAS)·τ(ADF-JAAS)
[0343] =ω·λ(ADF)·τ(ADF-JAAS)
[0344] 如果λ(ADF)=ρ(ADF)/τ(ADF)被代入,则产生以下方程:
[0345] ρ(ADF-JAAS)=ω·[τ(ADF-JAAS)/τ(ADF)]·ρ(ADF)
[0346] 线程或栈段(ADF应用,ADF-JAAS)的强度是线程或栈段(ADF应用)的强度的因子ω·τ(ADF-JAAS)/τ(ADF)。例如,如果对ADF应用的每个请求执行5次访问控制检查,即,ω=5,并且ADF-JAAS的期望响应时间构成ADF应用的期望响应时间的10%,即,τ(ADF)=10·τ(ADF-JAAS),则ADF-JAAS线程或栈段的平均强度将构成ADF应用线程或栈段的强度的
50%。可以预计
[0347]
[0348] 因此,
[0349] ω·τ(ADF-JAAS)/τ(ADF)<1
[0350] 通过线程或栈段强度统计的阻抗匹配
[0351] 可以考虑这样的示例:在两节点的CRM域销售服务器集群和两节点的CRM域订单采集服务器集群之间存在通信信道。这些信道可以支持销售服务器中的线程类和订单采集服
务器中的线程类之间的客户端-服务器依赖性关系:
[0352] (CRM域,销售服务器,ADF应用,ADF Web服务调用)→(CRM域,订单采集服务器,ADF Web服务,ADF-BC)
[0353] 对应的线程强度可以如下表示:ρ(ADF-HTTPClient)表示销售服务器集群中的(CRM域,销售服务器,ADF应用,ADF Web服务调用)线程的强度;ρ(ADF-HTTPClient(i))表示销售服务器节点i中的(CRM域,订单服务器,ADF  Web服务,ADF-BC)线程的强度;ρ
(WebService-ADF-BC)表示订单采集服务器集群中的(CRM域,订单采集服务器,ADF Web服
务,ADF-BC)线程的强度;ρ(WebService-ADF-BC(i))表示订单采集服务器节点i中的(CRM
域,订单采集服务器,ADF Web服务,ADF-BC)线程的强度。
[0354] 假定在销售服务器集群和订单采集服务器集群中分别存在n个节点和m个节点:
[0355]
[0356]
[0357] 如果销售服务器和订单采集服务器之间的通信信道没有将任何阻抗不匹配引入到从销售服务到订单采集服务的Web服务调用,则:
[0358] ρ(ADF-HTTPClient)=ρ(WebService-ADF-BC)
[0359] 如果观察到客户端线程和服务器线程的强度的差异,则可以将它归因于通信信道中的拥塞。如果ρ(channel)表示客户端线程和服务器线程之间的通信信道中的通信量强
度,则:
[0360] ρ(ADF-HTTPClient)=ρ(WebService-ADF-BC)+ρ(channel)
[0361] 当到达率和离开率均衡时:
[0362] λ(ADF-HTTPClient)=λ(WebService-ADF-BC)=λ(channel)
[0363] 并且
[0364] τ(ADF-HTTPClient)=τ(WebService-ADF-BC)+τ(channel).
[0365] 可以增大通信信道的容量来减小客户端服务和服务器服务之间的阻抗不匹配,该阻抗不匹配对客户端的响应时间τ(ADF-HTTPClient)贡献延时τ(channel)。
[0366] 强度的饱和
[0367] 线程或栈段强度是线程转储中的线程或栈段类的栈踪迹的期望数量的度量。线程强度将随着给定线程或栈段类的到达率和期望响应时间增大而增大。
[0368] 一些系统对可用于运行给定线程类的线程的最大数量施加了限制。当达到该限值时,线程或栈段强度变得饱和(达到最大值),并且尽管到达率或响应时间可能继续增大,统计也将不再反映关系ρ=λ·τ。本发明的实施例能够识别何时达到饱和点。本发明的实施例包括对强度的增长趋势进行外推的Holt-Winter三次指数移动平均过滤器(Holt-Winter 
triple exponential moving averaging filter)。当在强度在最大值处趋平并且停止跟
随投影的增长趋势时检测到一系列离群值时,这些实施例可以识别饱和点。
[0369] 如果系统对最大强度没有设置限制,则线程或栈段强度可能增长出界,并且在系统中引起内存不足错误。该状况可以由Holt-Winter三次指数移动平均过滤器预测作为终
点。
[0370] 抗混叠
[0371] Poisson计数过程要求采样窗口是不重叠且独立的。这要求黏联线程和拖延线程被计数不超过一次。系统在java.lang.management API中使用ThreadInfo.getThreadId
()和ThreadMXBean.getThreadCpuTime(long id)来监视每个线程的中央处理单元(CPU)
时间。如果线程的CPU时间自从前一次线程转储之后没有改变,则该技术推断该线程黏联。
该技术还跟踪在其中该线程被检测为黏联的连续线程转储的数量。可以在
ThreadAntiAliasingInfor数据结构中维护这些变量。
[0372] 如果线程是拖延的,但不是黏联的,则CPU时间将改变。为了检测拖延线程,抗混叠技术与诸如栈踪迹的根框架(root frame)中的小服务程序过滤器之类的类合作来使用java.lang.Thread setName应用编程接口(API)将历元计数器附加到线程名称。如果线程
名称与ThreadAntiAliasingInfo中所记录的早先线程名称相同,则该技术推断该线程已经
被计数。当线程池中的同一个线程在它被重新用于新历元时被观察为混叠时,线程名称中
的历元信息提供抗混叠解决方案。
[0373] 如果对于某个线程类始终检测到黏联或拖延线程,则该技术可以(通过使用每第N个线程转储)改动采样间隔,直到用于该线程类的采样时间窗口的期望长度小于N*M分钟
为止,其中,M是采样时间间隔。
[0374] 压力过高和压力过低状态
[0375] JVM可以被插装为检测可表示系统的压力过高状态的黏联线程。压力过高状态可以被诊断为朝向数据库或后台服务器的下游路径中的拥塞。然而,本发明的实施例还可以
检测当由于上游路径中的拥塞而导致请求未到达服务器时的压力过低状态(脱干)。后一种
状况不能通过用于黏联线程检测的定期JVM插装来检测。使用线程或栈段强度的离群值检
测可以对称地检测压力过高和压力过低两种状态。
[0376] 如果最大线程数是N并且期望的线程或栈段强度是ρ,则饱和的概率由Poisson分布给出:
[0377]
[0378] 如果期望的线程或栈段强度为5并且最大线程或栈段数量为10,则使线程或栈段强度饱和的概率为0.032,这意味着3.2%的线程转储将显示出强度饱和于10。假设期望的
线程或栈段强度为50并且最大线程或栈段数量为100,则使线程或栈段强度饱和于100的概
率为3.2E-10。就该概率而言,正常情况下不可能引起饱和,并且线程或栈段强度饱和必定是由于异常原因,诸如服务器下游的严重拥塞。就概率5.0E-10而言,线程或栈段强度同样地不太可能降至低于14,除非由于服务器上游的拥塞导致服务器严重脱干。
[0379] 强度驱动的栈框架分类
[0380] 一般地,在线程转储在某时间段期间被采样足够次数之后,可以预计检测到低强度线程或栈段的栈踪迹。有时,由于软件升级的系统失灵或退化,可以检测到其强度太低以至于即使在长时间段的线程转储之后也不能被检测到的栈框架。尽管如此,仍可能存在尚
未检测和尚未分类的非常稀少的栈框架。当在足够数量的线程转储之后或者在使它们的强
度飙升的系统失灵之后检测到栈框架的新踪迹时,本发明的实施例可以持续地对这些新踪
迹进行分类。本文中公开了由栈框架的强度度量驱动的分类方案。
[0381] 系统跟踪每一个栈框架以及在栈踪迹中与该栈框架相邻出现的前栈框架和后栈框架的强度。系统将相同的分类分配给表现出具有相同强度的相邻栈框架——即,总是作
为栈踪迹中的有序阵列一起出现的栈框架。例如,所述方案将(JDBC-Execute)类分配给以
下的具有相同强度的、总是作为有序阵列一起出现的栈框架:
[0382] oracle.jdbc.driver.T4CCallableStatement.exeeuteForRows(T4CCallableStatement.java:991)
[0383] oracle.jdbc.driver.OracleStatement.doExeeuteWithTimeout(OraeleStatement.java:1285)
[0384] oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
[0385] oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3550)
[0386] oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4693)
[0387] oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1086)
[0388] 如以上所讨论的,可以通过将ADF应用的强度ρ(ADF)分割为3个分量ρ(ADF-BC)、ρ(ADF-MDS)和ρ(ADF-SECURITY)来逼近ADF应用的强度ρ(ADF):
[0389] ρ(ADF)≈ρ(ADF-BC)+ρ(ADF-MDS)+ρ(ADF-SECURITY)
[0390] 为了改善模型,可以将与ADF-BC、ADF-MDS和ADF-SECURITY状态互斥的其它ADF应用状态的强度上卷到(ADF应用,ADF-misc)类之下。最后状态的强度ρ(ADF-misc)与3个主要分量的强度相比可以是能忽略的:
[0391] ρ(ADF)=ρ(ADF-BC)+ρ(ADF-MDS)+ρ(ADF-SECURITY)+ρ(ADF-misc)
[0392] (ADF应用,ADF-misc)类下面的线程或栈段子类的强度可能由于系统失灵而飙升。例如,文件系统失灵可能使一些ADF应用线程在文件写操作中变得黏联:
[0393] java.io.FileOutputStream.writeBytes(Native Method)
[0394] java,io.FileOutputStream.write(FileOutputStream.java:260)
[0395] java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
[0396] org.apache.log4j.helpers.QuietWriter.flush(QuietWriter.java:57)
[0397] org.apache.log4j.WriterAppender.append(WriterAppender.java:159)
[0398] at oracle.adf.View.process(View.iava:632)
[0399] 假设该栈框架的强度在阈值以上飙升,则可以对ADF应用线程的新状态(ADF应用,ADF-View-misc)进行分类。在飙升的持续时间内,ADF应用的强度ρ(ADF)可以分解为4个分量:
[0400] ρ(ADF)=ρ(ADF-BC)+ρ(ADF-MDS)+ρ(ADF-SECURITY)+ρ(ADF-View-misc)
[0401] 执行文件写操作的栈框架可以出现在ADF-View-misc栈框架以及ADF-BC、ADF-MDS和ADF-Security栈框架的顶部。随着时间的过去,系统可以检测到文件写操作栈框架的强
度偏离ADF-View-misc中的其它栈框架的强度。使栈框架的不同组的强度分离将导致新的
分类(文件写操作),以及将分类(ADF-View-misc)分割为(ADF-View,文件写操作)。前面的分类(ADF-View-misc)被包容在新的(文件写操作)和(ADF-View)类下。新的(文件写操作)
类还与(ADF-BC)、(ADF-MDS)和(ADF-Security)类交叉以形成新的子类(ADF-BC,文件写操
作)、(ADF-MDS,文件写操作)和(ADF-Security,文件写操作),这些子类的强度也飙升。因此,强度驱动对(文件写操作)和(ADF-View)类的分类。
[0402] 系统可以征集人类默会知识来对栈框架进行分类并且将分类分配到适当的维度。在本发明的某些实施例中,归纳学习过程可以将新类分配给系统已经定义的维度。例如,通过分析(ADF-BC,文件写操作)、(ADF-MDS,文件写操作)、(ADF-Security,文件写操作)和(ADF-View,文件写操作)栈踪迹的强度和邻接统计,归纳学习过程可以如下所示将(文件写操作(File Write Operation))类分配给操(Operation)维度,并且将(ADF-View)类分配给
库(Library)维度:
[0403] Operation=(Database Operation)|(LDAP Operation)|(Web Service Invocation)|(File Write Operation)
[0404] Library=(ADF-BC)|(ADF-MDS)|(ADF-SECURITY)|(ADF-VIEW)
[0405] 为了使得能够对栈踪迹中的每一个栈框架进行分类,系统使用StackFrameInfo数据结构来维护当前线程转储中的栈框架的出现数量(numOfOccur)、所有线程转储中的总出
现数量(totalNumberOfOccur)、前承者列表(predecessor list)、后继者列表(successor list)以及合并段。StackFrameInfo数据结构中的classMethodLineNumber变量保存字符
串,诸如表示线程转储中的栈框架的“weblogic.work.ExecuteThreadrun
(ExecuteThread.java:213)”。numOfoccur保存当前线程转储中的
“weblogic.work.ExecuteThread run(ExecuteThread.java:213)”的出现数量。强度度量是由强度=totalNumberOfOccur/totalNumOfDumps给出的派生变量。
[0406] 如果诸如(ADF-View-misc)之类的现有分类被分裂为两个新分类,诸如(ADF-View,文件写操作),则新分类作为原始分类的第一段和第二段被维护。原始分类被设置为新分类的合并段。属于该分类的栈框架也作为该分类中的元素被维护。分类和维度的名称
是可选的,并且可以由默会知识指定。使用StackSegmentInfo数据结构来对栈段分类的合
并段、第一组成段、第二组成段以及元素进行维护。
[0407] 由于递归程序构造而可以重复可变次数的栈段也由StackSegmentInfo分类。该递归的StackSegmentInfo可以出现在不同上下文中,即,它可以出现在多于一类的合并段或
线程中。RecursiveSegmentInfo数据结构用于表示StackSegmentInfo在每个上下文中的递
归出现以记录RecursiveSegmentInfo数据结构中的递归深度(numOfRecur)。
RecursiveSegmentInfo还可以构成用于树遍历的访客设计模式中的互递归段。例如,简单
的互递归构造将看起来像(A,B)n,其中,A和B相互调用。其中互递归包含不同类型的树节点{A1,A2,A3}和不同类型的访客节点{B1,B2,B3}的访客设计模式看起来像((A1,B1),(A3,B3)2,(A2,B2),(A3,B3)5,...)。互递归段,例如段(A3,B3)n,可以在栈踪迹中的不同位置出现任何次数。每个位置由RecursiveSegmentInfo的实例表示。
[0408] 所述技术将线程的栈踪迹划分为叶级栈段序列,然后合并这些叶级栈段,直到它变成一系列顶级合并栈段,其中每个顶级合并栈段可以包含表示组成段的层次结构的二叉
树结构。这种表示形成用于对等价线程类进行分类的签名,并且针对大型线程指令系统降
低了与线程匹配的模式的时间复杂度。使用ThreadClassification数据结构来对线程分类
信息进行维护。
[0409] 本发明的实施例还对栈框架的每个分类的强度的季节性趋势进行过滤。SeasonalTrendInfo数据结构包含过滤器变量中的一些。SeasonalTrendInfo中的
rawIntensity变量记录当前线程转储中的栈框架、栈段或线程类的强度。如果栈段是叶级
段(没有子段),则numOfOccur将与栈段中的每个StackFrameInfo元素的numOfOccur相同。
过滤器更新平滑后的强度和平滑后的强度增长率以预报强度的增长趋势。所预报的强度的
归一化残差可以用作用于检测表示所测强度何时偏离期望强度的离群值的过滤器。该状况
可以表示服务的压力过高或压力过低状态。
[0410] 强度驱动的分类的示例性情境
[0411] 假设系统已经对栈踪迹中的栈框架阵列进行了分类出现数量、前承者和后继者信息。该类中的栈框架可以在10次线程转储之后具有例如1.3的相同强度。
[0412] 在100次线程转储之后,栈段(A)中的栈框架的强度可以发散为三个组,其中底部3个栈框架的强度增大到2.5,顶部3个栈框架的强度略微增大到1.33,用作胶合框架的中间
栈框架的强度保持为1.3左右。当强度发散时,系统将栈段(A)划分为两个组成栈段(A-1)和(A-2),并再次将栈段(A-2)划分为(A-2-1)和(A-2-2)。中间栈框架(A-2-1)的强度表示栈段(A)的强度,即,A=(A-1,A-2-1,A-2-2)。(A-1)和(A-2-2)的强度因为它们在栈踪迹(A-1,AC,C)和(B,BA,A-2-2)中的出现而发散,其中,(AC)和(BA)表示分别将(A-1)与(C)连接以及将(B)与(A-2-2)连接的胶合框架。特定栈框架可以具有多个后继者和多个前承者。
[0413] 当所述技术检测到栈段的栈框架之间的强度发散时,它在新的组成栈段之间划分栈框架元素。例如,组成栈段(A-1)、(A-2)、(A-2-2)和(A-2-2)(其中每个直接地或间接地引用栈段(A)作为合并段)可以从这样的划分生成。在示例中,栈段(A)中的元素可以被划分为栈段(A-1)中的元素和栈段(A-2)中的元素。栈段(A-2)又可以被划分为栈段(A-2-1)中的元
素和栈段(A-2-2)中的元素。栈框架被更新为引用对应的叶级合并段。用于各种元素的合并段可以被更新为反映这些元素所属的新的栈。
[0414] 可以观察到栈段的变化,这些变化的不同之处仅在于组成段的递归深度。假定某些段的强度保持相同,但是其它段的强度由于任意的递归深度而发散,系统可以将原始段
划分为组成段。原始栈段的元素可以包含由A-2-1分类的可变数量的栈段。因此,原始栈段的组成段将包含可变数量的段A-2-1。与指定模式匹配的任何栈踪迹可以由相同的分类签
名来识别。作为合并段A-2的第一组成段的分类,递归段可以指向栈段A-2-1。
[0415] 系统可以在栈段(A)中为每个新的栈段(A-1)、(A-2)、(A-2-1)和(A-2-2)创建一份SeasonalTrendInfo数据,以用作初始过滤器状态。随后,用于(A-1)、(A-2)、(A-2-1)和(A-
2-2)的SeasonalTrendInfo数据可以被独立地更新。
[0416] 线程类依赖性信息模型
[0417] 线程分类和强度测量算法可以利用提供线程类之间的依赖性信息的知识基础来自展。依赖性信息可以用于估计线程类之间的通信信道中的通信量强度。它们还可以在问
题容器中将来自FA服务器的不同部分中的两个或更多个线程类的事件和出现关联以用于
根本原因分析。例如,假设线程类依赖性(CRM域,销售服务器,ADF应用,ADFWeb服务调用)→(CRM域,订单采集服务器,ADF Web服务,ADF-BC),如果FA舱中的销售服务器和订单采集服务器同时报告客户端线程的压力过低状态和服务器线程的压力过高状态,则这些事件可以
被收集在发生下。如果这些事件的发生得足够频繁,则票据可以被打开并且被分配给所有
者以对销售服务器集群和订单采集服务器集群之间的通信信道之中的可能的阻抗不匹配
进行分析。所有者可以将这些发生评定为阻抗匹配问题,并且提交服务请求。
[0418] 典型地,依赖性信息是在超类层次上指定的。例如,依赖性(ADFWeb服务调用)→(ADF Web服务,ADF-BC)捕捉分布在FA舱中的WebLogic域和服务器上的ADF服务之间的通用
服务调用模式。该抽象的依赖性包括依赖性(CRM域,销售服务器,ADF应用,ADFWeb服务调用)→(CRM域,订单采集服务器,ADF Web服务,ADF-BC)。在另一种情形下,抽象的依赖性模式(ADF-BC,数据库操作)→(数据库,融合DB)和(ADF-SECURITY,数据库操作)→(DATABASE,OIM-APM DB)使得能够对JDBC线程的压力过高问题进行差异诊断以隔离数据库服务器之一
中的问题。
[0419] 信息模型可以映射线程类之间的依赖性。ThreadClassDependencyInfo可以表示从客户端线程类到服务器线程类的多对一映射。ThreadClassInfo可以通过栈段元组来指
定线程类。例如,(ADF-BC,数据库操作)是栈段(ADF-BC)和(数据库操作)的元组。类(CRM域,订单采集服务器,ADF Web服务,ADF-BC,数据库操作)是(ADF-BC,数据库操作)的子类。
ThreadClassificationInfo包含表示用于对线程进行分类的签名的栈段列表。所述技术可
以执行二叉树的单个深度优先遍历(从栈框架的底部到顶部),以从所访问的栈段对象的
partOfThreadClasses属性中提取线程类对象,并且将ThreadClassInfo中的栈段与分类签
名中的栈段匹配。当线程类被匹配时,客户端或服务器线程类被包括警告或发生报告中。
[0420] 应用线程或栈段强度分析
[0421] 图1A-1B示出了例示根据本发明实施例的用于应用线程或栈段强度分析的示例的流程图。该技术维护栈框架信息地图、栈段信息地图、线程分类地图以及抗混叠信息地图。
栈框架信息地图、栈段信息地图和线程分类地图由从直到一个时间点收集的(在采样时间
之前的一系列采样时间内收集的)线程转储样本中提取的栈框架、栈段和线程分类组成。这些地图可选地可以用从历史档案中的线程转储提取的栈框架、栈段和线程分类来自展。抗
混叠信息地图表示在前一次线程转储中采样的线程。线程抗混叠信息地图用来识别当前采
样时间的线程转储中的在前一次采样时间的线程转储中已经遇到的线程。可以使用栈框架
信息地图、栈段信息地图和线程分类地图来对采样时间时的线程转储的栈踪迹进行分类。
这些地图是由图1A-1B和后续图中的流程图所描绘的过程的上下文的一部分。首先参照图
1A,在方框102中,当前采样时间到达。
[0422] 在方框104中,将当前采样时间设置为下一个采样时间,即采样时间间隔过去时的时间点。在方框106中,获得当前采样时间时的所有线程的线程转储。例如,可以从
java.lang.managgement.ThreadMXBean获得当前采样时间内的线程转储。在方框108中,线程转储计数器递增。
[0423] 对于每个采样时间时的线程转储,每个栈框架信息项在栈框架信息地图中的出现计数器的数被重置为零,使得该计数器可以用于对当前线程转储中的栈框架的出现数量进
行计数。为了实现这个,在方框110中,确定栈框架信息地图中的未处理的栈框架信息项是否仍要处理。如果是,则控制转到方框112。否则,控制转到方框116。
[0424] 在方框112中,将当前栈框架信息项设置为栈框架信息地图中的下一个未处理的栈框架信息项。在方框114中,将当前栈框架信息项的出现数量设置为零。控制转回到方框
110。
[0425] 对于每个采样时间时的线程转储,将栈段信息地图中的每个栈段信息项的出现计数器的数重置为零,以使得该计数器可以用于对当前线程转储中的栈段的出现数量进行计
数。为了实现这个,在方框116中,确定栈段信息地图中的未处理的栈段信息项是否仍要处理。如果是,则控制转到方框118。否则,控制转到图1B上的方框122。
[0426] 在方框118中,将当前栈段信息项设置为栈段信息地图中的下一个未处理的栈段信息项。在方框120中,将当前栈段信息项的出现数量设置为零。控制转回到方框116。
[0427] 对于每个采样时间时的线程转储,将线程分类信息地图中的每个线程分类信息项的出现计数器的数重置为零,以使得该计数器可以用于对当前线程转储中的线程的出现数
量进行计数。为了实现这个,现在参照图1B,在方框122中,确定线程分类信息地图中的未处理的线程分类信息项是否仍要处理。如果是,则控制转到方框124。否则,控制转到方框128。
[0428] 在方框124中,将当前线程分类信息项设置为线程分类信息地图中的下一个未处理的线程分类信息项。在方框126中,将当前线程分类信息项的出现数量设置为零。控制转回到方框122。
[0429] 在方框128中,更新对于当前采样时间内的线程转储的栈框架统计。以下参照图2A-2B公开用于更新对于当前采样时间内的线程转储的栈框架统计的技术。在方框130中,
通过对来自当前采样时间的线程转储的线程和栈段进行分类来确定一组线程类。以下参照
图3A-3J公开用于对来自当前采样时间内的线程转储的线程和栈段进行分类的技术。
[0430] 对于每个采样时间时的线程转储,检查线程抗混叠信息地图中的每个线程抗混叠信息项中的标记以确定分类的线程是否出现在当前线程转储中。如果分类的线程未出现在
当前线程转储中,则将它从线程抗混叠信息地图去除。为了实现这,在方框132中,确定未处理的线程抗混叠信息项是否仍在线程抗混叠信息地图中。如果是,则控制转到方框134。否则,控制转到方框142。
[0431] 在方框134中,将当前线程抗混叠信息项设置为线程抗混叠信息地图中的下一个未处理的线程抗混叠信息项。在方框136中,确定当前线程抗混叠信息项的标记(其指示当
前线程信息项是否出现在当前采样时间时的线程转储中)是否为假。如果是,则控制转到方框138。否则,控制转到方框140。
[0432] 在方框138中,从线程抗混叠信息地图中去除当前线程抗混叠信息项。控制转回到方框132。
[0433] 在方框140中,将当前线程抗混叠信息项的标记设置为假。控制转回到方框132。
[0434] 在方框142中,相对于当前采样时间内的栈段信息地图应用季节性趋势过滤器。以下参照图4公开应用季节性趋势过滤器的技术。控制转回到图1A上的方框102。
[0435] 更新栈框架统计
[0436] 图2A-2B示出了例示根据本发明实施例的用于更新栈框架统计的技术的示例的流程图。该技术可以相对于以上参照图1A-1B提到的当前采样时间内的线程转储执行。首先参照图2A,在方框202中,确定线程转储中的未处理的线程信息项是否仍要处理。如果是,那么控制转到方框204。否则,图2A-2B中所示的技术结束。
[0437] 在方框204中,将当前线程信息项设置为线程转储中的下一个未处理的线程信息项。在方框206中,将当前栈踪迹设置为当前线程信息项中的栈踪迹。在方框208中,重置栈踪迹元素索引。例如,可以通过将索引设置为-1来重置索引。在方框210中,将当前栈踪迹元素设置为当前栈踪迹的底部的栈踪迹元素。
[0438] 在方框212中,递增栈踪迹元素索引。在方框214中,通过与键(key)匹配,即,得到具有与当前栈踪迹元素的键相同的键的栈框架信息项,来将当前栈框架信息项设置为与当前栈踪迹元素对应的栈框架信息项(在栈框架信息地图中或者必要时创建)。例如,键可以
由源代码声明、行号、对象代码地址或这些的组合组成。
[0439] 在方框216中,确定当前栈踪迹元素是否在当前栈踪迹的底部。例如,如果栈踪迹元素索引等于零,则这可以指示当前栈踪迹元素在当前栈踪迹的底部。如果当前栈踪迹元
素在当前栈踪迹的底部,则控制转到方框218。否则,控制转到方框220。
[0440] 在方框218中,将当前栈框架信息项标记为栈框架信息地图中的底部框架。这可以通过将诸如“FRAME_FLOOR”之类的恒定栈框架信息项添加到当前栈框架信息项的前承者列表属性来实现。当前栈框架信息项也可以被添加到“FRAME_FLOOR”的后继者列表属性。控制转到图2B上的方框224。
[0441] 在方框220中,确定当前栈踪迹元素是否在当前栈踪迹的顶部。例如,如果栈踪迹元素索引比当前栈踪迹的尺寸小1,则这可以指示当前栈踪迹元素在当前栈踪迹的顶部。如果当前栈踪迹元素在当前栈踪迹的顶部,则控制转到方框222。否则,控制转到图2B上的方框224。
[0442] 在方框222中,将当前栈框架信息项标记为栈框架信息地图中的顶部框架。这可以通过将诸如“FRAME_CEILING”之类的恒定栈框架信息项添加到当前栈框架信息项的后继者列表属性来实现。当前栈框架信息项也可以被添加到“FRAME_CEILING”的前承者列表属性。
控制转到图2B的方框224。
[0443] ]现在参照图2B,在方框224中,当前栈框架信息项的出现属性的数量递增。当前栈框架信息项的出现属性的总数也可以递增。在方框226中,如果前一栈框架信息项非空,则将该信息项添加到当前栈框架信息项的前承者列表属性。在方框228中,确定在当前栈踪迹中的当前栈踪迹元素之上是否存在任何栈踪迹元素。如果是,则控制转到方框230。否则,控制转到方框236。
[0444] 在方框230中,将下一个栈踪迹元素设置为存在于当前栈踪迹元素正上方的栈踪迹元素。在方框232中,将下一个栈框架信息项设置为具有与下一个栈踪迹元素的键相同的键的栈框架信息项(在栈框架信息地图中)。例如,键可以由与栈框架对应的源代码声明、行号或对象代码地址组成。在方框234中,将下一个栈框架信息项添加到当前栈框架信息项的后继者列表属性。控制转到方框236。
[0445] 在方框236中,将前一栈框架信息项设置为当前栈框架信息项。在方框238中,确定在当前栈踪迹中的当前栈踪迹元素之上是否存在任何栈踪迹元素。如果是,则控制转到方框240。否则,控制转回到图2A上的方框202。
[0446] 在方框240中,将当前栈踪迹元素设置为存在于当前栈踪迹中的当前栈踪迹元素正上方的栈踪迹元素。控制转回到图2A上的方框212。
[0447] 对线程及其栈段进行分类
[0448] 图3A-3J示出了例示根据本发明实施例的对线程和这些线程的栈段进行分类的技术的示例的流程图。该技术可以相对于以上参照图1A-1B提到的当前采样时间的指定线程
转储执行。该技术可以生成一组线程类,该组线程类被表示为一组线程分类信息项。首先参照图3A,在方框3002中,创建一组空的线程分类信息项,其具有如下性质:线程转储中的每个线程可以由该组中的(可能不同的)线程分类项表示,并且使得线程转储中的等价线程由
同一个线程分类项表示。可以通过下述操作来创建遵守这些性质的新线程分类项并且将新
线程分类项添加到所述组。在方框3004中,确定线程转储中的未处理的线程信息项是否仍
要处理。如果是,则控制转到方框3006。否则,控制转到方框3182。
[0449] 在方框3006中,将当前线程信息项设置为线程转储中的下一个未处理的线程信息项。在方框3008中,将线程名称设置为当前线程信息项的名称。在方框3010中,把指示在前一次线程转储中(即,对于前一次采样时间)是否发现当前线程信息项的混叠的标志设置为
假。在方框3012中,确定线程抗混叠信息地图中的未处理的线程抗混叠信息项是否仍要处
理。如果是,则控制转到方框3014。否则,控制转到图3B上的方框3024。
[0450] 在方框3014中,将当前线程抗混叠信息项设置为线程抗混叠信息地图中的下一个未处理的线程抗混叠信息项。在方框3016中,确定(在方框3008中提到的)线程名称是否与
当前线程抗混叠信息项的名称相同。如果是,则控制转到方框3018。否则,控制转回到方框
3012。
[0451] 在方框3018中,当前线程抗混叠信息项的转储属性的数量递增。在方框3020中,将当前线程抗混叠信息项的标志属性(其指示在当前线程转储中(即,对于当前采样时间)是否发现该项的混叠)是否设置为真。在方框3022中,将在方框3010中所提到的、指示在前一次线程转储中是否发现当前线程信息项的混叠的标志设置为真。控制转到方框3024。
[0452] 现在参照图3B,在方框3024中,确定在方框3010和3022中提到的标志是否等于真。如果是,则控制转回到图3A上的方框3004。否则,控制转到方框3026。
[0453] 在方框3026中,创建与当前线程信息项对应的新线程抗混叠信息项。在方框3028中,将该新线程抗混叠信息项的、指示在当前线程转储中(即,对于当前采样时间)是否发现该项的混叠的标志属性设置为真的。在方框3030中,将该新线程抗混叠信息项的名称设置
为(在方框3008中提到的)线程名称。在方框3032中,将该新线程抗混叠信息项添加到线程
抗混叠信息地图。在方框3034中,创建新的细粒度段列表来跟踪当前线程信息项的细粒度
段。在方框3036中,将当前栈踪迹设置为当前线程信息项的栈踪迹。在方框3038中,重置栈踪迹元素索引。例如,可以通过将索引的值设置为-1来重置栈踪迹元素索引。在方框3040
中,将当前栈踪迹元素设置为当前栈踪迹的底部的栈踪迹元素。
[0454] 在方框3042中,递增栈踪迹元素索引。在方框3044中,将当前栈框架信息项设置为具有与当前栈踪迹元素的键相同的键的栈框架信息项(在栈框架信息地图中)。例如,键可以由与栈框架对应的源代码声明、行号或对象代码地址组成。
[0455] 在方框3046中,确定当前栈踪迹元素是否在当前栈踪迹的底部。例如,如果栈踪迹元素索引等于零,则这可以指示当前栈踪迹元素在当前栈踪迹的底部。如果当前栈踪迹元素在当前栈踪迹的底部,则控制转到图3C上的方框3048。否则,控制转到图3D上的方框
3066。
[0456] 现在参照图3C,在方框3048中,确定当前栈框架信息项是否已经被分类。例如,该确定可以通过确定当前栈框架信息项的合并段属性是否等于空来进行。如果该属性等于空,则当前栈框架信息项尚未被分类。如果当前栈框架信息项尚未被分类,则控制转到方框
3050。否则,控制转到方框3062。
[0457] 在方框3050中,创建新栈段信息项,并且将该新栈段信息项分配给当前栈段信息项的值。在方框3052中,将当前栈框架信息项的合并段属性(在方框3048中提到)的值设置
为当前栈段信息项。在方框3054中,将当前栈框架信息项添加到当前栈段信息项的元素列
表属性。在方框3056中,产生新的季节性趋势信息项。在方框3058中,将当前栈段信息项的趋势属性的值设置为所述新的季节性趋势信息项。在方框3060中,将当前栈段信息项添加
到细粒度段列表(在方框3034中被提到)。控制转到方框3064。
[0458] 在方框3062中,将当前栈段信息项设置为当前栈框架信息项的合并段属性(在方框3048中提到)的值。控制转到方框3064。
[0459] 在方框3064中,将当前栈段信息项标记为当前栈踪迹中的底部段。这可以通过将诸如“SEGMENT_FLOOR”之类的恒定栈段信息项添加到当前栈段信息项的前承者列表属性来实现。当前栈段信息项可以被添加到“SEGMENT_FLOOR”的后继者列表属性。控制转到图3J上的方框3162。
[0460] 现在参照图3D,在方框3066中,将前承栈踪迹元素设置为具有比当前栈踪迹元素索引的值小1的索引的栈踪迹元素(在当前栈踪迹中)。在方框3068中,将前承栈框架信息项设置为具有与前承栈踪迹元素的键相同的键的栈框架信息项(在栈框架信息地图中)。例
如,键可以由与栈框架对应的源代码声明、行号或对象代码地址组成。在方框3070中,将前承栈段信息项设置为前承栈框架信息项的合并段属性的值。
[0461] 在方框3072中,确定当前栈框架信息项是否已经被分类。例如,该确定可以通过确定当前栈框架信息项的合并段属性是否等于空来进行。如果该属性等于空,则当前栈框架信息项尚未被分类。如果当前栈框架信息项尚未被分类,则控制转到方框3074。否则,控制转到图3G上的方框3120。
[0462] 在方框3074中,确定前承栈框架信息项是否是前承栈段信息项的元素列表属性中的最后一个栈框架信息项。如果是,则控制转到方框3076。否则,控制转到图3F上的方框
3098。
[0463] 在方框3076中,确定前承栈框架信息项的后继者列表属性是否仅具有一个条目,即,当前栈框架信息项。如果是,则控制转到方框3078。否则,控制转到方框3082。
[0464] 在方框3078中,确定当前栈框架信息项的前承者列表属性是否仅具有一个条目,即,前承栈框架信息项。如果是,则控制转到图3E上的方框3080。否则,控制转到方框3082。
[0465] 现在参照图3E,在方框3080中,将当前栈框架信息项的合并段属性的值设置为前承栈段信息项。在方框3081中,将当前栈框架信息项添加到前承栈段信息项的元素列表属
性。控制转到图3J上的方框3162。
[0466] 在方框3082中,创建新的栈段信息项,并且将该新的栈段信息项分配给当前栈段信息项的值。在方框3084中,将当前栈框架信息项的合并段属性(在方框3048中提到)的值
设置为当前栈段信息项。在方框3086中,将当前栈框架信息项添加到当前栈段信息项的元
素列表属性。在方框3088中,将前承栈段信息项添加到当前栈段信息项的前承者列表属性。
在方框3090中,将当前栈段信息项添加到前承栈段信息项的后继者列表属性。在方框3092
中,产生新的季节性趋势信息项。在方框3094中,将当前栈段信息项的趋势属性的值设置为所述新的季节性趋势信息项。在方框3096中,将当前栈段信息项添加到细粒度段列表(在方框3034中提到)。控制转到图3J上的方框3162。
[0467] 现在参照图3F,在方框3098中,将前承栈段信息项的踪迹段划分为在前承栈框架信息项和后继栈框架信息项的索引之间出现的分开的第一新栈信息项和第二新栈信息项,
以使得前承栈框架信息项在第一新栈段信息项的末尾。以下参照图5A-5C公开用于划分栈
段以在指定的栈框架的前面或后面添加分支点的技术。在该情境下,该栈段划分技术可以
被调用来在指定的栈段信息项的后面(而不是前面)执行划分,所述指定的栈段信息项在该
情境下是前承栈段信息项。
[0468] 在方框3100中,将前承栈信息项设置为通过方框3098的划分而生成的第一新栈段信息项。在方框3102中,创建新的栈段信息项,并且将该新的栈段信息项分配给当前栈段信息项。在方框3104中,将当前栈框架信息项的合并段属性(在方框3048中提到)的值设置为
当前栈段信息项。在方框3106中,将当前栈框架信息项添加到当前栈段信息项的元素列表
属性。在方框3108中,将前承栈段信息项添加到当前栈段信息项的前承者列表属性。在方框
3110中,将当前栈段信息项添加到前承栈段信息项的后继者列表属性。在方框3112中,产生新的季节性趋势信息项。在方框3114中,将当前栈段信息项的趋势属性的值设置为所述新
的季节性趋势信息项。在方框3116中,用前承栈段信息项的值取代细粒度段列表(在方框
3034中提到)中的最后一个现有条目的值。在方框3118中,将当前栈段信息项添加到细粒度段列表。控制转到图3J上的方框3162。
[0469] 现在参照图3G,在方框3120中,将当前栈段信息项设置为当前栈框架信息项的合并段属性的值。在方框3122中,确定当前栈段信息项是否等于前承栈段信息项。如果是,则控制转到方框3124。否则,控制转到图3I上的方框3142。
[0470] 在方框3124中,确定当前栈框架信息项的前承者列表属性是否具有多于一个的条目。如果是,则控制转到方框3128。否则,控制转到方框3126。
[0471] 在方框3126中,确定前承栈框架信息项的后继者列表属性是否具有多于一个的条目。如果是,则控制转到方框3128。否则,控制转到图3J上的方框3162。
[0472] 在方框3128中,确定当前栈段信息项的元素列表属性中的第一条目是否与当前栈框架信息项相同。如果是,则控制转到方框3130。否则,控制转到图3H的方框3132。
[0473] 在方框3130中,更新表示细粒度段列表中的当前栈段信息项和前承栈段信息项的递归段。在实施例中,该更新可以包含:如果细粒度段列表中的最后一个段是递归段,则递增该最后一个段的再出现属性的数量的值,或者如果该最后一个段是栈段,则将新的递归
段添加到细粒度段列表的末尾。以下将在图6A-6E的讨论中看到关于这些变量的进一步的
信息。控制转到图3J上的方框3162。
[0474] 现在参照图3H,在方框3132中,将当前栈段信息项的踪迹段划分为在前承栈框架信息项和当前栈框架信息项的索引之间出现的分开的第一新栈段信息项和第二新栈段信
息项,以使得前承栈框架信息项在第一新栈段信息项的末尾,并且使得当前栈框架信息项
在第二新栈段信息项的开头。以下参照图5A-5C公开用于在指定的栈框架前面或后面的分
支点处划分栈段的技术。在该情境下,该栈段划分技术可以被调用来在指定的栈段信息项
的前面(而不是后面)执行划分,所述指定的栈段信息项在该情境下是当前栈段信息项。
[0475] 在方框3134中,将前承栈段信息项设置为通过方框3132的划分而生成的第一新栈段信息项。在方框3136中,将当前栈段信息项设置为通过方框3132的划分而生成的第二新
栈段信息项。在方框3138中,用前承栈段信息项的值取代细粒度段列表(在方框3034中提
到)中的最后一个现有条目的值。在方框3140中,将当前栈段信息项添加到细粒度段列表。
控制转到图3J上的方框3162。
[0476] 现在参照图3I,在方框3142中,确定前承栈段信息项的元素列表属性的最后一个条目是否与前承栈框架信息项相同。如果是,则控制转到方框3150,否则,控制转到方框
3144。
[0477] 在方框3144中,将前承栈段信息项的踪迹段划分为在前承栈框架信息项和后继栈框架信息项之间出现的分开的第一新栈段信息项和第二新栈段信息项,以使得前承栈框架
信息项在第一新栈段信息项的末尾。以下参照图5A-5C公开用于在指定的栈框架的前面或
后面的分支点处划分栈段的技术。在该情境下,该栈段划分技术可以被调用来在指定的栈
段信息项的后面(而不是前面)执行划分,所述指定的栈段信息项在该情境下是前承栈段信
息项。
[0478] 在方框3146中,将前承栈段信息项设置为通过方框3144的划分而生成的第一新栈段信息项。在方框3148中,用前承栈段信息项的值取代细粒度段列表(在方框3034中提到)
中的最后一个现有条目的值。控制转到方框3150。
[0479] 在方框3150中,确定当前栈段信息项的元素列表属性的最后一个条目是否与当前栈框架信息项相同。如果是,则控制转到方框3156,否则,控制转到方框3152。
[0480] 在方框3152中,将当前栈段信息项的踪迹段划分为在前承栈框架信息项和当前栈框架信息项的索引之间出现的分开的第一新栈段信息项和第二新栈段信息项,以使得当前
栈框架信息项在第二新栈段信息项的开头。以下参照图5A-5C公开用于在指定的栈框架前
面或后面的分支点处划分栈段的技术。在该情境下,该栈段划分技术可以被调用来在指定
的栈段信息项的前面(而不是后面)执行划分,所述指定的栈段信息项在该情境下是当前栈
段信息项。
[0481] 在方框3154中,将当前栈段信息项设置为通过方框3152的划分而生成的第二新栈段信息项。控制转到方框3156。
[0482] 在方框3156中,将当前栈段信息项添加到细粒度段列表(在方框3034中提到)。在方框3158中,将前承栈段信息项添加到当前栈段信息项的前承者列表属性。在方框3160中,将当前栈段信息项添加到前承栈段信息项的后继者列表元素。控制转到图3J上的方框
3162。
[0483] 现在参照图3J,在方框3162中,确定当前栈踪迹元素是否在当前栈踪迹的顶部。该确定可以通过确定栈踪迹元素索引是否比当前栈踪迹尺寸小1来进行。如果栈踪迹元素索引比当前栈踪迹尺寸小1,则当前栈踪迹元素在当前栈踪迹的开头。如果当前栈踪迹元素在当前栈踪迹的开头,则控制转到方框3164。否则,控制转到方框3166。
[0484] 在方框3164中,将当前栈段信息项标记为当前栈踪迹中的顶部段。这可以通过将诸如“SEGMENT_CEILING”之类的恒定栈段信息项添加到当前栈段信息项的后继者列表属性来实现。当前栈段信息项可以被添加到“SEGMENT_CEILING”的前承者列表属性。控制转到方框3166。
[0485] 在方框3166中,确定在当前栈踪迹中的当前栈踪迹元素上方是否存在任何栈踪迹元素。如果是,则控制转到方框3168。否则,控制转到方框3170。
[0486] 在方框3168中,将当前栈踪迹元素设置为存在于当前栈踪迹中的当前栈踪迹元素的正上方的栈踪迹元素。控制转回到图3B上的方框3042。
[0487] 在方框3170中,合并当前线程信息项的细粒度段。以下参照图6A-6E公开用于在给定指定的细粒度段列表的情况下合并细粒度段的技术。参照图6A-6E公开的技术生成一组
合并段。在方框3172中,存储对于当前线程信息项这样生成的所述一组合并段。
[0488] 在方框3174中,针对当前栈踪迹和(在方框3172中存储的)所述一组合并段登记线程分类信息项(在方框3002中提到)。以下参照图7A-7B公开用于针对指定的栈踪迹和指定
的一组合并段登记线程分类项的技术。参照图7A-7B公开的技术生成线程分类信息项。在方框3176中,存储针对当前栈踪迹和(在方框3172中存储的)所述一组合并段而这样生成的线
程分类信息项。
[0489] 在方框3178中,更新(在方框3176中存储的)线程分类信息项的线程分类统计。以下参照图8公开用于更新指定的线程分类信息项的线程分类统计的技术。
[0490] 在方框3180中,将线程分类信息项添加到所述一组线程分类信息项(在方框3002中提到)。控制转回到图3A上的方框3004。
[0491] 再次参照图3A,在方框3182中,在已经生成了一组线程分类项的情况下,图3A-3J中所示的技术结束。
[0492] 应用季节性趋势过滤器
[0493] 图4是例示根据本发明实施例的用于应用季节性趋势过滤器的技术的示例的流程图。在方框402中,确定栈段信息地图中的未处理的栈段信息项是否仍要处理。如果是,则控制转到方框404。否则,图4中所示的技术结束。
[0494] 在方框404中,将当前栈段信息项设置为栈段信息地图中的下一个未处理的栈段信息项。在方框406中,将Holt-Winter三次指数过滤器被应用于季节性趋势信息项,所述季节性趋势信息项是当前栈段信息项的趋势属性的值。在方框408中,计算N步(其中,N是1,
2,...)预报。在方框410中,计算预报的归一化残差。在方框412中,确定正常残差是否超过指定的截止值。如果是,则控制转到方框414。否则,控制转到方框422。
[0495] 在方框414中,确定所测的线程或栈段强度是否比预报高一个大于指定余裕的余裕。如果是,则控制转到方框416。否则,控制转到方框418。
[0496] 在方框416中,发出关于压力过高状态的警告。控制转到方框422。
[0497] 在方框418中,确定所测的线程或栈段强度是否比预报低一个大于指定余裕的余裕。如果是,则控制转到方框420。否则,控制转到方框422。
[0498] 在方框420中,发出关于压力过低状态的警告。控制转到方框422。
[0499] 在方框422中,计算去季节性趋势。在方框424中,针对季节性索引调整趋势。在方框426中,计算所预测的时间范围的置信度水平。在方框428中,确定所预测的时间范围的置信度水平是否超过指定阈值。如果是,则控制转到方框430。否则,控制转到方框402。
[0500] 在方框430中,发出关于范围中的饱和或终点状态的警告。控制转到方框402。
[0501] 在栈框架前面或后面的分支点处划分栈段
[0502] 图5A-5C示出了例示根据本发明实施例的在栈框架前面或后面的分支点处划分栈段的技术的示例的流程图。该技术可以相对于指定的栈段信息项和对应的指定的栈框架信
息项执行。该技术可以用指令来调用,以在指定的栈框架信息项所表示的栈框架的前面或
后面执行划分。该技术可以生成由该划分得到的一对(第一和第二)新栈段信息项。首先参
照图5A,在方框502中,将当前元素列表设置为指定的栈段信息项的元素列表属性的值。在方框504中,将栈框架信息索引设置为当前元素列表内的指定的栈框架信息项的索引。在方框506中,确定划分是否被引导在指定栈框架的前面执行。如果是,则控制转到方框508。否则,控制转到方框512。
[0503] 在方框508中,将第一段设置为当前元素列表的子列表,该子列表从当前元素列表的开头跨越到具有比栈框架信息索引小1的索引的元素。在方框510中,将第二段设置为当
前元素列表的子列表,该子列表从具有栈框架信息索引的元素跨越到当前元素列表的末
尾。控制转到方框516。
[0504] 在方框512中,将第一段设置为当前元素列表的子列表,该子列表从当前元素列表的开头跨越到具有栈框架信息索引的元素。在方框514中,将第二段设置为当前元素列表的子列表,该子列表从具有比栈框架信息索引大1的索引的元素跨越到当前元素列表的末尾。
控制转到方框516。
[0505] 在方框516中,创建新的前承栈段信息项。在方框518中,将该新的前承栈段信息项的元素列表属性设置为第一段。在方框520中,对于第一段中的每个前承栈框架信息项,将前承栈框架信息项的合并段属性设置为该新的前承栈段信息项。如果该合并段属性的值之前不等于正被划分的指定的栈段信息项,则可以抛出异常。控制转到图5B上的方框522。
[0506] 现在参照图5B,在方框522中,创建新的后继栈段信息项。在方框524中,将该新的后继栈段信息项的元素列表属性设置为第二段。在方框526中,对于第二段中的每个后继栈框架信息项,将后继栈框架信息项的合并段属性设置为该新的后继栈段信息项。如果该合并段属性的值之前不等于正被划分的指定的栈段信息项,则可以抛出异常。
[0507] 在方框528中,将正被划分的指定栈段信息项的前承者列表属性中的所有元素添加到前承栈段信息项的前承者列表属性。在方框530中,将后继栈段信息项添加到前承栈段信息项的后继者列表属性。在方框532中,将前承栈信息项添加到后继栈段信息项的前承者列表属性。在方框534中,将正被划分的指定栈段信息项的后继者列表属性中的所有元素添加到后继栈段信息项的后继者列表属性。
[0508] 在方框536中,将季节性趋势信息项设置为正被划分的指定栈段信息项的季节性趋势信息属性的克隆。在方框538中,将前承栈段信息项的趋势属性设置为季节性趋势信息项的克隆。在方框540中,将后继栈段信息项的趋势属性设置为季节性趋势信息项。控制转到图5C上的方框542。
[0509] 现在参照图5C,在方框542中,将前承栈段信息项的出现属性的数量设置为正被划分的指定栈段信息项的出现属性的数量的值。也可以将前承栈段信息项的出现属性的总数
设置为正被划分的指定栈段信息项的出现属性的总数的值。在方框544中,将后继栈段信息项的出现属性的数量设置为正被划分的指定栈段信息项的出现属性的数量的值。也可以将
后继栈段信息项的出现属性的总数设置为正被划分的指定栈段信息项的出现属性的总数
的值。
[0510] 在方框546中,将指定栈段信息项的第一段属性设置为前承栈段信息项。在方框548中,将指定栈段信息项的第二段属性设置为后继栈段信息项。在方框550中,将前承栈信息项的合并段属性设置为指定栈段信息项。在方框552中,将后继栈信息项的合并段属性设置为指定栈段信息项。在方框554中,在前承栈段信息项和后继栈信息项已经被生成为由划分得到的新的第一栈段信息项和第二栈段信息项的情况下,所述技术结束。
[0511] 合并线程的栈段
[0512] 图6A-6E示出了例示根据本发明实施例的用于合并线程的栈段的技术的示例的流程图。该技术可以相对于指定的细粒度段列表执行。该技术可以生成一组合并段。首先参照图6A,在方框602中,创建段信息项的空的合并段列表。在方框604中,将当前索引的值设置为比指定的细粒度段列表的尺寸小1。在方框606中,将最后一个段设置为指定的细粒度段
列表中的具有当前索引的段。在方框608中,递减当前索引的值。在方框610中,确定当前索引是否小于零。如果是,则控制转到方框692。否则,控制转到方框612。
[0513] 在方框612中,将前承段设置为指定的细粒度段列表中具有当前索引的段。在方框614中,将指示最后一个段是否与前承段合并的标志设置为真。在方框616中,确定最后一个段和前承段这两者是否是递归段。如果是,则比较前承递归段的分类属性是否与最后一个
递归段的分类属性相同。递归段的分类属性在方框634和670中提到。在实施例中,该确定通过确定最后一个段和前承段这两者是否是递归段信息类的实例来实现。如果两个段都是递
归段,则比较前承递归段的分类属性与最后一个递归段的分类属性。如果两个属性值是相
同的,则控制转到方框618。否则,控制转到图6B上的方框620。
[0514] 在方框618中,将最后一个段的再出现属性的数量的值增加前承段的再出现属性的数量的值。控制转到图6C上的方框646。
[0515] 现在参照图6B,在方框620中,确定最后一个段是否是递归段并且前承段是否是栈段。如果是,则比较最后一个递归段的分类属性与前承段的值。递归段的分类属性在图6B上的方框634和图6D上的方框670中提到。如果最后一个段的分类属性的值与前承段的值相
同,则控制转到方框622。否则,控制转到方框624。
[0516] 在方框622中,递增最后一个段的再出现属性的数量的值。控制转到图6C上的方框646。
[0517] 在方框624中,确定前承段是否是递归段并且最后一个段是否是栈段。如果是,则比较前承递归段的分类属性与最后一个段的值。递归段的分类属性在图6B上的方框634和
图6D上的方框670中提到。如果前承段的分类属性的值与最后一个段的值相同,则控制转到方框626。否则,控制转到方框630。
[0518] 在方框626中,将最后一个段设置为前承段。在方框628中,递增最后一个段的再出现属性的数量的值。控制转到图6C上的方框646。
[0519] 在方框630中,确定前承段是否等于最后一个段。如果是,则控制转到方框632。否则,控制转到图6C上的方框640。
[0520] 在方框632中,创建新的递归段信息项。在方框634中,将该新的递归段信息项的分类属性设置为最后一个段。在某些实施例中,该分类属性可以作为确定两个相邻递归段是否表示由该分类属性指示的同一个段的递归的一部分被检查,因此,相邻递归段可以合并
为一个递归段,如在图6A上的方框616以及图6B上的方框620和624中所提到的。在方框636
中,将所述新的递归段信息项的再出现属性的数量的值设置为2。在方框638中,将最后一个段设置为所述新的递归段信息项。控制转到图6C上的方框646。
[0521] 现在参照图6C,在方框640中,确定最后一个段和前承段是否可以合并。在实施例中,如果以下所有都为真,则最后一个段和前承段可以合并:(1)每个的合并段属性的值相同,(2)每个的合并段属性的值非空,(3)前承段的合并段属性的第一段属性的值是前承段,以及(4)最后一个段的合并段属性的第二段属性的值是最后一个段。在某些实施例中,如果两个相邻段是通过图5C上的方框546、548、550和552从同一个合并段划分的,则它们可以合并。换句话说,以上条件(1)和(2)测试方框552和554的效果,条件(3)测试方框546的效果,条件(4)测试方框548的效果。如果最后一个段和前承段可以合并,则控制转到方框642。否则,控制转到方框644。
[0522] 在方框642中,将最后一个段设置为最后一个段的合并段属性的值。控制转到方框646。
[0523] 在方框644中,将指示最后一个段是否与前承段合并的标志(在方框614中提到)设置为假。控制转到方框646。
[0524] 在方框646中,确定指示最后一个段是否与前承段合并的标志(在方框614中提到)为真。如果是,则控制转到方框648。否则,控制转到图6E上的方框688。
[0525] 在方框648中,将后继段设置为合并段列表(在方框602中提到)中的最后一个段的后继者。在方框650中,将指示最后一个段是否与后继段合并的标志设置为真。在方框652
中,确定最后一个段和后继段是否都是递归段。如果是,则比较后继递归段的分类属性是否与最后一个递归段的分类属性相同。递归段的分类属性在方框634和670中提到。如果是,则控制转到方框654。否则,控制转到图6D上的方框656。
[0526] 在方框654中,将最后一个段的再出现属性的数量的值增大后继段的再出现属性的数量的值。控制转到图6E上的方框682。
[0527] 现在参照图6D,在方框656中,确定最后一个段是否是递归段并且后继段是否是栈段。如果是,则比较最后一个递归段的分类属性与后继段的值。递归段的分类属性在图6B上的方框634和图6D上的方框670中提到。如果最后一个段的分类属性的值与后继段的值相
同,则控制转到方框658。否则,控制转到方框660。
[0528] 在方框658中,递增最后一个段的再出现属性的数量的值。控制转到图6E上的方框682。
[0529] 在方框660中,确定后继段是否是递归段并且最后一个段是否是栈段。如果是,则比较后继递归段的分类属性与最后一个段的值。递归段的分类属性在图6B上的方框634和
图6D上的方框670中提到。如果后继段的分类属性与最后一个段的值相同,则控制转到方框
662。否则,控制转到方框666。
[0530] 在方框662中,将最后一个段设置为后继段。在方框664中,递增最后一个段的再出现属性的数量的值。控制转到图6E上的方框682。
[0531] 在方框666中,确定后继段是否等于最后一个段。如果是,则控制转到方框668。否则,控制转到图6E上的方框676。
[0532] 在方框668中,创建新的递归段信息项。在方框670中,将该新的递归段信息项的分类属性设置为最后一个段。在某些实施例中,该分类属性可以作为确定两个相邻递归段是否表示由该分类属性指示的同一个段的递归的一部分被检查,因此,这些相邻递归段可以
合并为一个递归段,如在图6A上的方框616中以及图6B上的方框620和624上所提到的。在方框672中,将所述新的递归段信息项的再出现属性的数量的值设置为2。在方框674中,将最后一个段设置为所述新的递归段信息项。控制转到图6E上的方框682。
[0533] 现在参照图6E,在方框676中,确定最后一个段和后继段是否可以合并。在实施例中,如果以下所有都为真,则最后一个段和后继段可以合并:(1)每个的合并段属性的值相同,(2)每个的合并段属性的值非空,(3)最后一个段的合并段属性的第一段属性的值是最
后一个段,以及(4)后继段的合并段属性的第二段属性的值是后继段。在某些实施例中,如果两个相邻段是通过图5C上的方框546、548、550和552从同一个合并段划分的,则它们可以合并。换句话说,以上条件(1)和(2)测试方框552和554的效果,条件(3)测试方框546的效
果,条件(4)测试方框548的效果。如果最后一个段和后继段可以合并,则控制转到方框678。
否则,控制转到方框680。
[0534] 在方框678中,将最后一个段设置为最后一个段的合并段属性的值。控制转到图6E上的方框682。
[0535] 在方框680中,将指示最后一个段是否与后继段合并的标志(在方框650中提到)设置为假。控制转到方框682。
[0536] 在方框682中,确定指示最后一个段是否与后继段合并的标志(在方框650中提到)为真。如果是,则控制转到方框684。否则,控制转到方框690。
[0537] 在方框684中,从合并段列表(在方框602中提到)中去除后继段。在方框686中,将后继段设置为合并段列表中的最后一个段的后继者。控制转到方框690。
[0538] 在方框688中,将最后一个段添加到合并段列表(在方框602中提到)的开头。控制转到方框690。
[0539] 在方框690中,递减当前索引的值。控制转回到图6A上的方框610。
[0540] 再次参照图6A,在方框692中,将最后一个段添加到合并段列表(在方框602中提到)的底部。在方框694中,在已经以合并段列表的形式生成一组合并段的情况下,所述技术结束。
[0541] 登记线程的合并段和栈踪迹的线程分类签名
[0542] 图7A-7B示出了例示根据本发明实施例的用于登记指定的栈踪迹和指定的一组合并段的线程分类项的技术的示例的流程图。该技术可以相对于指定的栈踪迹和指定的一组
合并段执行。该技术可以生成线程分类信息项。首先参照图7A,在方框702中,将栈框架的数量设置为指定栈踪迹的大小。在方框704中,将合并段的数量设置为指定的一组合并段的大小。在方框706中,将指示线程分类信息项是否已经被登记为表示与指定栈踪迹对应的线程的标志设置为假。在方框708中,确定任何未处理的已登记线程分类信息项是否仍在线程分类信息地图中。如果是,则控制转到方框710。否则,控制转到图7B上的方框720。
[0543] 在方框710中,将当前的已登记线程分类信息项设置为线程分类信息地图中的下一个未处理的已登记线程分类信息项。在方框712中,确定以下两者:(1)栈框架的数量是否等于当前的已登记线程分类信息项的栈框架属性的数量,以及(2)合并段的数量是否等于
当前的已登记线程分类信息项的合并段属性的数量。如果是,则控制转到方框714。否则,控制转到图7B上的方框720。
[0544] 在方框714中,确定对于每个索引值,合并段中的具有该索引值的段是否等于当前的已登记线程分类信息项中的具有该索引值的段属性。如果是,则控制转到方框716。否则,控制转回到方框708。
[0545] 在方框716中,将线程分类信息项设置为当前的已登记线程分类信息项。在方框718中,将指示线程分类信息项是否已经被登记为表示与指定栈踪迹对应的线程的标志(在
方框706中提到)设置为真。控制转到方框720。
[0546] 现在参照图7B,在方框720中,确定指示线程分类信息项是否已经被登记为表示与指定栈踪迹对应的线程的标志(在方框706中提到)是否是真。如果是,则控制转到方框734。
否则,控制转到方框722。
[0547] 在方框722中,创建新的线程分类信息项。在方框724中,将该新的线程分类信息项的段属性设置为指定的一组合并段。在方框726中,将该新的线程分类信息项的趋势属性设置为新的季节性趋势信息项。在方框728中,将该新的线程分类信息项的栈框架属性的数量设置为栈框架的数量。在方框730中,将该新的线程分类信息项的合并段属性的数量设置为合并段的数量。在方框732中,将该新的线程分类信息项添加到线程分类信息地图。该添加将该新的线程分类信息项登记为表示用于与指定的栈踪迹对应的线程所表示的线程的等价类的签名。控制转到方框734。
[0548] 在方框734中,在已经生成了线程分类信息项的情况下,所述技术结束。
[0549] 更新栈分类统计
[0550] 图8是例示了根据本发明实施例的用于更新指定的线程分类信息项的线程分类统计的技术的示例的流程图。该技术可以相对于指定的线程分类信息项执行。在方框802中,递增指定的线程分类信息项的出现属性的数量的值。指定的线程分类信息项的出现属性的
总数的值也可以递增。在方框804中,确定任何未处理的段信息项是否仍在指定的线程分类信息项中。如果是,则控制转到方框806。否则,该技术结束。
[0551] 在方框806中,将当前段信息项设置为指定的线程分类信息项中的下一个未处理的段信息项。在方框808中,更新当前段信息项的栈段统计。以下参照图9公开用于更新指定的段信息项的栈段统计的技术。控制转回到方框804。
[0552] 更新统计段统计
[0553] 图9是例示了根据本发明实施例的用于更新指定的段信息项的栈段统计的技术的示例的流程图。该技术可以相对于指定的段信息项执行。在方框902中,递增指定的段信息项的出现属性的数量的值。指定的段信息项的出现属性的总数的值也可以递增。在方框904中,确定任何未处理的段信息项是否仍在指定的段信息项中。如果是,则控制转到方框906。
否则,该技术结束。
[0554] 在方框906中,将当前段信息项设置为指定的段信息项中的下一个未处理的段信息项。在方框908中,使用图9的技术来更新当前段信息项的栈段统计。控制转回到方框904。
[0555] 基于JAVA堆大小、线程强度和栈段强度测量的季节性趋向和预报
[0556] 用于JAVA平台服务的云控制系统可以监视关于JAVA堆分配的时间系列数据以估计趋势并且预报内存容量要求。通过检测季节性趋势并且预报内存容量要求,该系统可以
在JVM之间动态地重新分配共享系统内存以使得能够进行弹性资源分配。容量要求的预报
涉及JAVA堆增长速率的估计。Java堆分配由按不规律的时间间隔运行的全垃圾收集循环来
测量。对JAVA堆增长速率的估计包括除以由于间歇地任意地接近零的不规律时间间隔而复
杂化的随机时间间隔。增长速率测量中的噪声是得到柯西分布的两个高斯分布的比率,该
噪声可能难以过滤。从大量数据点所得到的均值和标准差的估值的准确度不高于单个数据
点的意义上来讲,柯西分布的均值和标准差是未定义的。增大样本池可以提高遇到具有与
除以时间接近间隔对应的大的绝对值的采样点的可能性。不像其采样间隔由于全垃圾收集
循环的不规律性而不规律的JAVA堆大小测量,线程或栈段强度测量可以按规律的间隔进行
采样以避免时间接近间隔(time close interval)。即使如此,本文中所描述的用于JAVA堆分配的趋向的相同技术也可以应用于线程和栈段强度测量的季节性趋向和预报。该技术可
以针对由于线程的CPU调度和全GC循环的干扰而导致的可变延时进行调整,这将对采样线
程的延时增添额外的可变性。该技术还可以针对由于对栈段进行分类所需的可变计算时间
而导致的可变采样间隔进行调整。
[0557] 发表于1957年和1960年的Holt-Winter三次指数过滤器可以用于季节性趋向和预报。C.C.Holt的“Forecasting Trends and Seasonal by Exponentially Weighted 
Averages”,海军研究办公室备忘录No.52(1957年),通过引用并入本文。P.R.Winters的
“Forecasting Sales by Exponentially Weighted Moving Averages”,Management 
Science第6卷第3期第324-342页(1960年),通过引用并入本文。Wright将1986年的Holt-
Winter公式扩展为支持不规律的时间间隔。D.J.Wright的“Forecasting data published at irregular time intervals using an extension of Holt’s method”,Management Science 第32卷第4期第499-510页(1986),通过引用并入本文。在2008年,Hanzak提出了用于时间接近间隔的调整因子。T.Hanzak的“Improved Holt Method for Irregular Time 
Series”,WDS’08会议记录第1部分第62-67页(2008),通过引用并入本文。
[0558] 如果时间间隔在由内存泄漏或死锁引起的拥塞期间单调递减,则用于时间接近间隔的调整因子(其意在补偿由于速率估计中的随机时间接近间隔而导致的相对强度较高的
噪声)可能无意中抑制变化估值的速率。全垃圾收集算法的堆的总大小的多项式时间复杂
度可能导致随着拥塞变糟而减小JVM运行时间隔。在JAVA内存泄漏的情况下,随着时间间隔减小,运行时间可能减少,但是因为JVM可能被冻结的时间长于全垃圾收集,所以测量时间可能增加。如果JVM在全垃圾收集期间被冻结,则新的请求可以被排队到JVM外部,其中某部分被重新分布给其它JVM。积压可以在随后的运行时间期间加速堆使用的变化速率。在实施例中,Hanzak的对于时间接近间隔的调整被用于JAVA堆分配的趋向和预报以及跟踪加速的
堆增长速率。
[0559] 在实施例中,指数移动平均值可以被应用于平滑来自全垃圾收集循环的时间系列数据,以估计增长速率、增长速率的加速度、季节性趋势、预报的误差残差以及预报的绝对偏差,以使得能够对JAVA内存堆分配进行离群值检测和预报。本发明的实施例可以跟踪由
于拥塞而导致的增长速率的加速度。本文中公开了当测量时间增加时对于越是最近的采样
点给予越多权重的新调整因子。如果测量时间是可忽略的常数并且时间间隔主要由运行时
间组成,则这些调整因子可以约简为Hanzak的调整因子。本发明的实施例可以包括用于数
值稳定的时间的自适应缩放,即,以避免双精度浮点表示的下溢。时间间隔可以被自适应地成比例地缩放,以使得平均时间间隔被缩放为接近于1。可以通过按不同时标(time scale)运行的三个或更多个独立的过滤器来并行地跟踪估计。取决于时标,这些并行的过滤器可
以用作预测季节性趋势、长期容量需求、短期终结点(内存溢出错误)等的多个策略。本发明的实施例利用针对季节性索引编排而改进的公式来从相邻索引之中选择使归一化的误差
残留最小化的季节性索引。本发明的实施例可以应用监督控制回路来为每个JVM实例(捕捉
租户、应用、用户等的操作特性)通过非线性回归拟合用于估计各种过滤器参数和季节性因子的模型。本发明的实施例可以推送来自监督控制器过滤器的参数和季节性因子来更新嵌
入在每个JVM中的过滤器(通过使用具有Hotspot或JRockit插装的MBean)。
[0560] 在本发明的实施例中,除了Holt-Winter三次指数过滤器之外,还使用第四指数过滤器和第五指数过滤器来研究预报误差残留的均值和偏差的趋势以计算归一化的误差残
留。预报误差残留的均值可以被解释为过滤器中被识别的模型的偏倚(bias)。这种偏倚可
以指示等级飙升、暂时性等级移位、永久性等级移位或等级漂移的存在。预报误差残留的偏差可以指示时间系列数据中的方差变化。在实施例中,方差变化的幅度可以影响用于检测
离群值的过滤器的容限。如果测量结果的预报误差残留大于预报误差残留偏差的移动平均
值的百分比,则该测量结果被检测为离群值。在概念上,离群值是不被过滤器中识别的趋势模型解释的测量结果,因此,离群值簇可以指示仅能由一些不相关的原因解释的异常。本发明的实施例根据测量结果中的方差变化来改动用于离群值检测的过滤器的容限。该技术通
过减少当高方差变化存留于系统中时的离群值警报的数量来降低警告疲劳。
[0561] 在本发明的实施例中,Holt-Winter三次指数过滤器可以被应用于JVM堆使用的季节性趋向和预报以高效地实现JVM内存分配的弹性。可以被应用于根据规律的时间系列进
行需求预报的标准Holt-Winter三次指数过滤器可以专门被调整为针对具有不规律的时间
接近间隔的随机时间间隔工作。本发明的实施例可以将Wright公式应用于不规律的时间间
隔,将Hanzak调整应用于时间接近间隔,以便对JAVA堆分配进行趋向和预报。可以执行适合于在JVM全垃圾收集中见到的随机时间间隔的过滤器的结构的非平凡选择。Holt-Winter-
Wright-Hanzak过滤器的结构可以从第一原理推导出,以系统地制定改动从而与由JVM全垃
圾收集循环产生的时间系列匹配。可以执行对于预测JVM内存使用趋势有用的过滤器的扩
展的非平凡选择。所选择的扩展可以包括:例如,用于对增长速率的加速度进行过滤(以便跟踪拥塞)的扩展、用于按不同时标并行地运行(因为不规律的时间间隔与季节具有某种相
关性)的扩展、以及用于通过使归一化的误差残留(其可以用于对由软引用引起的不连续性
作出反应)最小化来选择季节性索引(类似于模糊逻辑)的扩展。本发明的实施例可以通过
将非线性回归应用于参数估计以调谐嵌入式过滤器的框架和非平凡监督式控制器来补充
和扩大嵌入式系统。
[0562] 本文中所描述的用于季节性趋向、预报、异常检测和终点预测的技术可以被添加到现有的监督式控制框架,诸如以上所讨论的CARE控制框架。监督式控制器的模型识别可
以提供检测离群值的基线。离群值簇可以指示系统中的异常。这些异常中的一些可以表示
系统故障和中断的先行指标。当检测到关键异常或者预测到进程终点时,系统可以用线程
转储和堆转储来产生自动诊断库(ADR)事故报告以帮助对应用程序、配置和系统失灵进行
调试。系统还可以向企业管理器(EM)云控制报告关键警报。
[0563] 在实施例中,针对指数移动平均值的公式被应用于平滑时间系列数据、局部线性趋势、季节性趋势、预报的误差残留以及预报的绝对偏差,以便监视和预报诸如内存堆使用以及线程或栈段强度之类的资源利用度量。在实施例中,该公式可以基于1956年提出的
Brown指数过滤器、1957年提出的Holt二次指数过滤器、1960年提出的Winters三次指数过
滤器、1986年提出的针对不规律时间间隔的Wright扩展、2008年提出的针对时间接近间隔
的Hanzak调整因子、以及离群值检测和裁剪。以下出版物通过引用包括在本文中:
R.G.Brown的“Exponential Smoothing for Predicting Demand”剑桥,Arthur D.Little Inc.(1956年)第15页;C.C.Holt的“Forecasting  Trends and Seasonal by 
Exponentially Weighted Averages”,海军研究办公室备忘录,第52期(1957年);
P.R.Winters的“Forecasting Sales by Exponentially Weighted Moving Averages”,
Management Science第6卷第3期第324-342页(1960年);D.J.Wright的“Forecasting data published at irregular time intervals using an extension of Holt’s method”,
Management Science第32卷第4期第499-510页(1986年);T.Hanzak的“Improved Holt 
Method for Irregular Time Series”,WDS’08会议记录第1部分第62-67页(2008年);以及S.Maung、S.W.Butler和S.A.Henck的“Method and Apparatus for process Endpoint 
Prediction based on Actual Thickness Measurements”,美国专利5503707(1996年)。
[0564] 指数加权的移动平均值
[0565] 时间系列数据可以由数据点的归一化加权和平滑,其中,根据时间系列的自相关(在自回归移动平均值模型中)、时间间隔的长度以及其它因素来适当地选择权重:
[0566]
[0567] 指数移动平均值是数据点的加权和,其中,权重是指数形式。这种形式假定采样间隔是规律的:
[0568]
[0569] 以上表达式针对规律的时间间隔给出了数据系列的归一化的指数加权和。参数α是归一化因子,随着n→∞:
[0570]
[0571]
[0572] 以序列形式等同地表示该系列:
[0573]
[0574] 通过递归地展开该序列形式可以显示出,它等同于归一化的指数加权和:
[0575]
[0576] 针对不规律时间间隔的权重扩展
[0577] 该公式Wright(以上所引)扩展为针对不规律时间间隔的归一化的指数加权和:
[0578]
[0579] 用 表示归一化因子,用 表示加权和:
[0580]
[0581]
[0582]
[0583] 如果 则表达式 可以用πl,l-m=blbl-1…bl-m+1表示:
[0584]
[0585] 如果时间间隔是规律的,b=bl=bl-1=…=bl-m+1,则该表达式约简为:
[0586] πl,l-m=(1-α)(l-l+m)
[0587]      =bm
[0588] 可以推导系列 的序列形式:
[0589]
[0590] 代入 和
[0591]
[0592] 可以观察到:
[0593]
[0594] 因此,
[0595]
[0596] 推导序列形式:
[0597]
[0598] 随后将使用的bn的表达式为:
[0599]
[0600] 类似地,推导 的序列形式:
[0601]
[0602] 代入 和
[0603]
[0604] 可以观察到:
[0605]
[0606] 因此,可以获得序列形式:
[0607]
[0608] 可以推导关于 的序列形式:
[0609]
[0610] 代入bn:
[0611]
[0612] 因此,获得序列形式:
[0613]
[0614] 如果时间间隔固定为平均时间间隔q,则该序列公式收敛到固定点:
[0615]
[0616] 该序列的固定点为:
[0617] u=1-(1-a)q
[0618] 为了数值稳定性,例如,为了避免当tk-tk-1大时双精度浮点表示的下溢,可以成比例地缩放时间间隔,使得平均时间间隔q被缩放为接近于1。如果q被恰好缩放到1,则获得u=α。
[0619] 固定点u可以用作初始值:
[0620]
[0621] 针对时间接近间隔的Hanzak调整因子
[0622] 可以将调整因子 添加到权重以调谐过滤器的响应:
[0623]
[0624]
[0625]
[0626] 展开该系列:
[0627]
[0628] 如果 并且 则:
[0629]
[0630]
[0631] \可以推导序列形式:
[0632]
[0633] Hanzak(以上所引)添加以下给出的满足方程 和 的调整因子
[0634]
[0635] 当系列包括时间接近样本(时间间隔比平均时间间隔小得多的样本)时,该调整因子提高了过滤器的鲁棒性。如果对应的采样间隔ti-ti-1大于当前采样间隔tn-tn-1,则因子增大采样点 过去的相对权重。它补偿由于在速率估计中除以随机时间接近间隔而导
致的相对强度较高的噪声。
[0636]
[0637] 随后将使用的bn的表达式为:
[0638]
[0639] 类似地,展开该系列:
[0640]
[0641] 获得序列形式:
[0642]
[0643] 推导 的序列形式:
[0644]
[0645] 代入bn
[0646]
[0647] 因此,获得序列形式:
[0648]
[0649] 显而易见地,参数 以 的序列形式出现,但是不是 的序列形式的一部分。
[0650] 使用在平均时间间隔q被缩放为接近于1时的初始值:
[0651]
[0652]
[0653] 用于测量时间和运行时间间隔的调整因子
[0654] 在过滤器中,某些种类的资源度量包括应被考虑的不可忽略的测量时间。例如,内存堆使用测量过程包括未使用堆的全垃圾收集以测量实际使用。随着堆的大小增大,堆使用的测量时间增加。在一些过程中,运行时间与测量时间不重叠,当JVM中的应用在全垃圾收集期间被冻结时的堆使用测量就是这种情况。因此,应将时间间隔(tn-tn-1)划分不重叠的运行时间(tn-t’n-1)和测量时间(t’n-1-tn-1),其中,t’n>tn。这里,时间戳tn表示第n个全垃圾收集周期的起始,而t’n表示第n个全垃圾收集周期的结束:
[0655] tn-tn-1=(tn-t′n-1)+(t′n-1-tn-1)
[0656] 如果假定所述过程排除当堆分配活动被冻结时的测量时间间隔,则堆使用度量的变化速率可以已定义如下,即,分母是排除测量时间的过程运行时间间隔:
[0657]
[0658] 因此,运行时间之比 可以被用在调整因子中:
[0659]
[0660] 在速率过滤器中使用调整因子(避免柯西分布)
[0661] Holt过滤器可以由参数化线性运算符 表示,其中,参数 是度量序列,该序列是信号项和误差项的和:
[0662]
[0663] 如果误差项 是高斯的,则通过运算符 估计度量 是有效的:
[0664]
[0665]
[0666] 在根据原始增长 估计增长速率 时(包括除以随机时间间隔tn-t′n-1,误差项 可以是柯西分布:
[0667]
[0668]
[0669] 以下推导表明调整因子 将误差项约简为高斯:
[0670]
[0671]
[0672]
[0673] 其中,
[0674]
[0675]
[0676] ti-t′i-1的分母中的因子ti-t′i-1和 的分子抵消,给出:
[0677]
[0678]
[0679] 的分母中的因子(tn-t′n-1)和 的分子抵消,生成:
[0680]
[0681] 如果过滤器参数β接近于零,
[0682]
[0683] 因为 所以这给出:
[0684]
[0685] 这里,项 是总的测量时间间隔。如果测量时间是可忽略的,则该公式收敛到极限,其中,误差项ε是高斯的:
[0686]
[0687] 在某些情况下,仅有针对不规律时间间隔的Wright扩展可能不足以检测周期性模式。针对时间接近间隔的Hanzak调整因子可以用来将由不规律时间间隔引起的噪声约简为
高斯噪声水平。离群值的裁剪进一步改善了单(仅增长速率)或双(增长速率和加速度)过滤
器的性能。
[0688] 调整因子
[0689] 如果时间间隔在由内存泄漏或死锁引起的拥塞期间单调递减,则针对时间接近间隔的调整因子可能无意中抑制变化速率估值,其中所述针对时间接近间隔的调整因子意在
补偿由于速率估计中的随机时间接近间隔而导致的相对强度较高的噪声。在内存泄漏的情
况下,随着时间间隔减少,运行时间减少,但是因为JAVA虚拟机(JVM)被冻结的时间长于全垃圾收集(GC),所以测量时间增加。如果JVM在全GC期间被冻结,则新的请求被排队到JVM的外部(其中某部分被重新分布到其它JVM)。在随后的运行时间期间,积压可以使堆使用的变化速率加速。
[0690] 补偿该积压的一种方式是将测量时间之比 包括在调整因子中:
[0691]
[0692] 如果采样点 的测量时间(即,全GC时间)t′i-1-ti-1短于与当前采样点 对应的测量时间t′n-1-tn-1,则该因子减小采样点 的相对权重。希望测量时间之比
会抵消运行时间之比 并且提供对于趋势的更快速的响应。因此,当测量时间
增加时,新的调整因子可以对越是最近的采样点给予越多权重。如果测量时间是可忽略的
常数并且时间主要由运行时间组成,则这些调整因子可以约简为Hanzak的调整因子。
[0693] 在数学上, 并且 所以过滤器可以约简为期望的序列形式:
[0694]
[0695]
[0696] 过滤器参数 然后由序列形式给出:
[0697]
[0698] 如果测量时间单调递减,则可以使用以下调整因子:
[0699]
[0700] 应用Holt的方法
[0701] Holt的二次指数移动平均值包括三个时间系列:平滑后的资源度量 局部线性趋势 以及局部线性预报 给定常数α,0<α<1和β,0<β<1:
[0702]
[0703]
[0704]
[0705] Winters将第三指数移动平均值加到Holt的二次指数移动平均值以合并季节性趋势。对于季节性周期L和常数0<α<1,0<β<1,0<γ<1的Holt-Winters的三次指数移动平均值为:
[0706]
[0707]
[0708]
[0709]
[0710]
[0711] 这里, 表示局部线性预报,而 表示线性和季节性预报的组合。对于容量监视,长期线性趋势可以用于预报资源要求,诸如内存、线程、连接、套接字、缓冲、盘空间、网络带宽等。
[0712] 平滑后的度量
[0713] 二次指数移动平均值中的第一个可以用来平滑原始资源度量。在这种情况下,Wright公式可以用来对原始资源度量 进行过滤,给定常数α,0<α<1:
[0714]
[0715]
[0716]
[0717]
[0718]
[0719] 对于因子 其它有用的公式(取决于测量时间间隔是增加还是减少):
[0720]
[0721] 局部线性趋势
[0722] 二次指数移动平均值中的第二个表示资源度量的局部线性变化速率。因为变化速率 包括除以时间间隔的长度tn-t′n-1,所以可以包括调整因子 来对变化速率
进行过滤,给定常数β,0<β<1:
[0723]
[0724]
[0725]
[0726]
[0727]
[0728] 系列 表示基于线性趋势的局部线性预报资源度量:
[0729]
[0730] 计算 和 的初始值:
[0731]
[0732]
[0733] 当资源度量(堆使用或线程或栈段强度)可能越过阈值Xmax时,该线性方程可以用来预测tn之后的时间t:
[0734]
[0735]
[0736] 资源度量的增长速率和加速度
[0737] 二次指数移动平均值可以被应用于资源度量的一阶导数和二阶导数以监视加速的资源拥塞(由于内存泄漏或线程死锁导致)。
[0738] 可以在二次指数移动平均值中的第一个中过滤出资源度量 的变化速率。该过滤器可以监视资源度量的长期渐进增长。因为变化速率 包括除以时间间隔的
长度tn-t′n-1,所以可以包括调整因子 来对变化速率进行过滤:
[0739]
[0740]
[0741]
[0742]
[0743]
[0744] 二阶导数 (变化速率的速率)也包括除以时间间隔的长度tn-tn-1:
[0745]
[0746] 可以包括Hanzak的调整因子 来对变化速率的速率进行过滤:
[0747]
[0748]
[0749]
[0750]
[0751] 系列 表示基于变化速率的线性趋势预报的资源度量的变化速率:
[0752]
[0753] 预报的资源度量 由以下给出:
[0754]
[0755] 当资源度量可能越过阈值Xmax时,平滑后的速率 可以用于预测tn之后的时间t如下:
[0756]
[0757]
[0758] 离群值检测和裁剪
[0759] 在二次指数移动平均值和三次指数移动平均值的顶部,可以引入两个更多指数移动平均值来针对残留误差 和绝对偏差 对系列进行过滤。给定与或不与基于趋势
(在用于监视度量和速率的算法1中)或 (在用于监视速率和加速度的算法2中)的季
节性因子预报的资源度量 成线性的一步:
[0760]
[0761] 可以计算预报的资源度量的残留误差:
[0762]
[0763]
[0764]
[0765] 明显地,对于每个n, Wright公式可以用来更新过滤器参数,给定常数δ,0<δ<1:
[0766]
[0767]
[0768] 归一化残差由以下给出:
[0769]
[0770] 如果对应的归一化残差大于截止值Q,即:
[0771]
[0772] 则样本 被识别为离群值。
[0773] 在某些实施例中,如果时间间隔大于阈值a,a≥1,则可以与该间隔成比例地调整归一化残差截止值Q,即,给定默认截止值Qdef,计算归一化残差截止值Q:
[0774]
[0775] 该公式用于调整归一化残差截止值,随着预报范围向外延伸,即,随着tn-tn-1增大,有效地增大离群值测量的容限。它是在预报范围延向外延伸时可以如何降低预报的度
量的置信度水平的表达式。
[0776] 如果 被识别为离群值,则可以根据以下规则将采样裁剪为值
[0777] 如果 且 且
[0778] 则
[0779] 如果 且
[0780] 则 所以 不是离群值
[0781] 如果 且
[0782] 则
[0783] 如果 且 且
[0784] 则
[0785] 如果 且
[0786] 则 所以 不是离群值
[0787] 如果 且
[0788] 则
[0789] 这些条件用下式总结:
[0790]
[0791] 在这些表达式中,平滑后的残留误差项 表示过滤器的偏置。该偏置信息由居中的预报 补偿。
[0792]
[0793] 因此,归一化残差 等价于居中的预报的残差。裁剪后的离群值度量 通过将居中的预报 移位 而给出。
[0794] 偏置表示等级变化。偏置的短时长的飙升或下降表示永久的等级位移。接连飙升和下降的偏置表示等级飙升或暂时的等级位移。持久的负偏置表示向上的等级漂移,持久
的正偏置表示向下的等级漂移。持久的大绝对偏差表示高方差变化。偏置、绝对偏差(表示
1-sigma和2-sigma)以及离群值可以被绘制为Shewhart控制图。在Shewhart控制图中可以
清楚地可见并且可以通过简单的基于规则的分类方案来检测的持久的等级漂移、高方差变
化以及离群值簇通常表示系统中的异常。可以通过更高级别的分类和评估方案来识别这些
异常并且提出这些异常以便诊断。
[0795] 季节性趋势
[0796] 当监视堆使用或者线程或栈段强度时,可以分开跟踪周末季节和工作日季节。这是基于以下基本原理:当用户分布在不同时区(诸如就跨国组织而言)时,季节性峰仅出现
在工作日,而一些趋势可能涌进周末。周末季节的长度应是48个小时,工作日季节的长度应是24个小时。当更新周末的移动平均值时,可以使用季节性因子 当更新工作日的移动
平均值时,可以使用季节性因子 如果使用15分钟的解析度(即,季节性索引是15分钟的
整数倍)来跟踪季节性因子 (对于48个小时)和 (对于24个小时),则针对季节性因子
分别生成T=192和T=96个索引。当时间从tn-1前进到tn时,季节性索引应前进15分钟的倍数,即,索引τn=[[(tn-t12AM)div 15minutes]mod T],假定t按分钟给出。一般地,季节性索引是由解析度Δτ和周期T参数化的地图:
[0797] τn=τ(tn)=[[(tn-t12AM)divΔτ]mod T]
[0798] 对于常数γ,0<γ<1,季节性因子的指数移动平均值针对周末和工作日给出。在周末,由以下过滤器跟踪季节性因子,其中,K(如果Δτ是15分钟,则K被设置为192)是周末季节的周期:
[0799]
[0800] τn=τ(tn)=[[(tn-t12AM)divΔτ]mod K]
[0801] 在工作日,由以下过滤器跟踪季节性因子,其中,L(如果Δτ是15分钟,则L被设置为96)是工作日季节的周期:
[0802]
[0803] τn=τ(tn)=[[(tn-t12AM)divΔτ]mod L]
[0804] 以上两个过滤器跟踪原始样本 高于或低于去季节性的平均值 的百分比偏差。季节性因子应在每个工作日或周末季节结束时被重新归一化,以使得这些因子在一
个星期的周期上的平均值是1,即,将每个周末因子 和工作日因子 除以归一化因子:
[0805]
[0806] 可选地,我们可以在每个季节结束时将光滑样条拟合到季节性因子以使季节性趋势平滑。
[0807] 在每个工作日或周末季节结束时,我们可以通过将每个季节性因子 和 除以平均每日度量来重新平衡周末和工作日季节性因子的相对幅度:
[0808]
[0809] 当原始值 被除以对应的季节性因子 或 (前面的季节和当前季节的跟踪)时,针对 的更新过程有效地去除对平均值 的季节影响。取决于样本是在周末还
是在工作日,用所述两个过滤器之一来
[0810] 通过首先计算每个周末的平均值来确定周末季节性因子 的初始值,其中k=0,1...,K-1:
[0811]
[0812] 这里,样本 是落在对应的周末内的那些样本。
[0813] 第二,计算落在与周末季节性索引k对应的15分钟时间间隔内的样本的平均值
[0814]
[0815] 这里,值 是落在与周末e=(k div 192)的周末季节性因子(k mod 192)对应的15分钟时间间隔内的样本的平均值。
[0816]
[0817] 然后通过对每行求平均值来计算周末季节性因子:
[0818]
[0819]
[0820]
[0821]
[0822] 如下确定工作日季节性因子 的初始值,其中l=0,1,...,L-1:
[0823] 首先计算5个工作日(周一、周二、周三、周四、周五)的平均值:
[0824]
[0825] 这里,样本 是落在对应的日子内的那些样本。
[0826] 第二,将样本平均值除以每个季节性索引的每日平均值:
[0827]
[0828] 这里,值 是落在与日d=(l div 96)的工作日季节性索引(l mod96)对应的15分钟时间间隔内的样本的平均值:
[0829]
[0830] 第三,通过对每行求平均值来计算工作日季节性因子:
[0831]
[0832]
[0833]
[0834]
[0835] 为了重新平衡周末季节性因子和工作日季节性因子的相对幅度,我们将每个季节性因子 和 除以平均每日度量:
[0836]
[0837] 使用下式来更新周末的移动平均值:
[0838]
[0839] 使用下式来更新工作日的移动平均值:
[0840]
[0841] 在每种情况下,局部线性预报为:
[0842]
[0843] 如果t0落在周末内,则 的初始值为:
[0844]
[0845] τ0=τ(t0)=[(t0-t12AM)div Δτ]mod K
[0846] 如果t0落在工作日内:
[0847]
[0848] τ0=τ(t0)=[(t0-t12AM)divΔτ]mod L
[0849] 取决于t0是落在周末内、还是落在工作日,根据两个季节的样本(即,连续的工作日之间或者两个连续的周末之间的样本)计算线性趋势 的初始值。
[0850] 如果t0落在周末内:
[0851]
[0852] 如果t0落在工作日内:
[0853]
[0854] 当通过组合平滑后的资源度量、局部线性趋势以及乘性季节性因子来投影在tn之后的时间t时的资源度量时,季节性索引可以按照[(t-tn)div 15minutes],投影,假设t按分钟给出。用Δ表示季节性索引的投影,取决于(τn+Δ)是落在周末内还是落在工作日内,使用以下两个公式之一来获得对于时间t的线性的季节性预报Ft。
[0855] 如果τn和(τn+Δ)都落在周末内:
[0856]
[0857] 如果τn和(τn+Δ)都落在连续的工作日间:
[0858]
[0859] 如果τn和(τn+Δ)落在不同季节内,则可以使用稍微更复杂的模运算(modulo arithmetic)。
[0860] 多元回归
[0861] h步预报的均方差(MSE)残差和平均绝对偏差(MAD)可以被定义为用于给定时间系列xt的独立变量α、β、κ、γ、δ和tz的函数。参数tz(-12<tz<12)是与东海岸标准时间(EST)相比的时区偏移。在按照时区偏移移动之后,周末的开始应该对应于周六上午12点,周末的结束应该对应于周一上午12点。当跨多个时区的工作日活动的峰和谷叠加并且周末的中间
的水平需要居于周末季节的中心时,可以对时区偏差进行优化。
[0862] 非线性多元回归可以被应用于确定α、β、κ、γ、δ和tz的最小化跨越9个连续日或更长时间的数据的MSE或MAD的值。
[0863]
[0864]
[0865] 在所有表达式中,时戳按tz偏移移动,并且被成比例地缩放。缩放因子被确定为使得平均时间间隔q被缩放为接近于1。
[0866] 期望平均时间间隔可以用 表示:
[0867]
[0868]
[0869]
[0870] 简单的扩展的Holt.Winter季节性过滤器
[0871] 对于容量监视器,残留误差系列为:
[0872]
[0873] 这里,h步预报 是基于平滑后的度量 线性趋势 以及季节性因子 或 这取决于tn是落在周末内还是落在工作日:
[0874]
[0875]
[0876] 如下给出用于被观察度量的第一指数移动平均值(在前面的章节中进行了推导)的方程组。
[0877] 使用下式来更新周末内的去季节性度量的移动平均值:
[0878]
[0879] 使用下式来更新工作日内的去季节性度量的移动平均值:
[0880]
[0881] 注意,时间tn在缩放之前被移位tz偏移。如果tn在周六上午12点和周一上午12点之间,则使用周末公式。
[0882] 过滤器参数为:
[0883]
[0884]
[0885]
[0886] 如果t0落在周末内,则 的初始值为:
[0887]
[0888] τ0=τ(t0)=[(t0-t12AM)divΔτ]mod K
[0889] 如果t0落在周末内:
[0890]
[0891] τ0=τ(t0)=[(t0-t12AM)divΔτ]mod L
[0892] 的初始值,其中q是平均时间间隔(其被缩放到1):
[0893] q≈1
[0894]
[0895] 针对布局线性趋势的第二指数移动平均值的方程组:
[0896]
[0897]
[0898]
[0899]
[0900] 的初始值:
[0901]
[0902] 的初始值,其中,q是平均时间间隔(其被缩放到1):
[0903] q≈1
[0904]
[0905] 去季节性局部线性预报 提供第一指数移动平均值和第二指数移动平均值之间的耦合:
[0906]
[0907] 针对周末季节性因子和工作日季节性因子的第三指数移动平均值的方程组如下。
[0908] 在周末内:
[0909]
[0910] τn=τ(tn)=[(tn-t12AM)divΔτ]mod K
[0911] 在工作日内:
[0912]
[0913] τn=τ(tn)=[(tn-t12AM)divΔτ]mod L
[0914] 在每个季节结束时或者在每次更新 或 之后(前一种方法效率更高,后一种方法的计算可能太密集),将每个周末因子 和工作日因子 除以归一化因子:
[0915]
[0916] 的初始值:
[0917] 并且Ne为周末e内的样本数量
[0918] 并且Nk为间隔k内的样本数量
[0919]
[0920] 的初始值:
[0921] 并且Nd为日d内的样本数量
[0922] 并且Nl为间隔l内的样本数量
[0923]
[0924] 为了重新平衡周末季节性因子和工作日季节性因子的相对幅度,我们将每个季节性因子 和 除以平均每日度量:
[0925]
[0926] 针对离群值检测的第四指数移动平均值和第五指数移动平均值的方程组(注意,是一步预报误差残留,设置h=1):
[0927]
[0928]
[0929]
[0930]
[0931] 和 的初始值为0。
[0932] 的初始值,其中,q是平均时间间隔(其被缩放到1):
[0933] q≈1
[0934]
[0935] 当归一化的残差大于Q时,用于检测离群值的表达式:
[0936]
[0937] 对离群值采样点 进行裁剪:
[0938]
[0939] 如果样本是离群值,则应使用裁剪后的值来代替离群值,以根据时间是落在周末内还是落在工作日,使用以下公式之一更新平均值:
[0940]
[0941]
[0942] 包括度量变化的加速度的扩展的Holt-Winter季节性过滤器
[0943] 对于拥塞监视,诸如内存泄漏和死锁,可以使用以下方程组(在前面的章节中进行了推导)。
[0944] 残留误差系列为:
[0945]
[0946] h步预报的度量 由以下方程给出:
[0947]
[0948] 为了将季节性趋势包括在h步预报 中,可以根据tn是落在周末还是落在工作日,将去季节性的度量预报乘以季节性因子 或
[0949]
[0950]
[0951] 是去季节性的度量。使用下式更新周末内的去季节性的度量:
[0952]
[0953] 使用下式更新工作日内的去季节性的度量:
[0954]
[0955] 去季节性的度量的过滤器参数为:
[0956]
[0957]
[0958]
[0959]
[0960]
[0961] 对因子 有用的其它公式(取决于测量时间间隔是增加、还是减少):
[0962]
[0963] 如果t0落在周末内,则 的初始值为:
[0964]
[0965] τ0=τ(to)=[(t0-t12AM)div Δr]mod K
[0966] 如果t0落在周末内:
[0967]
[0968] τ0=τ(t0)=[(t0-t12AM)divΔτ]mod L
[0969] 是由下式给出的、在间隔[tn-h,tn]内的平均的去季节性的增长速率:
[0970]
[0971] 原始度量是增长速率(一阶导数):
[0972]
[0973] 针对被测增长速率的第一指数移动平均值的方程组取决于季节性趋势因子。没有季节性趋向的原始表达式为:
[0974]
[0975] 如果引入两个季节性趋势(关于周末和工作日),则可以根据tn-1和tn落在哪个上来使用去季节性的测量结果:
[0976]
[0977] 去季节性的增长速率由以下给出:
[0978]
[0979] 使用下式更新移动平均值:
[0980]
[0981] 用以下公式调整过滤器参数:
[0982]
[0983]
[0984]
[0985] 如果利用季节性趋势,则平滑后的增长速率的初始值为:
[0986]
[0987] 的初始值,其中,q是平均时间间隔(其被缩放到1):
[0988] q≈1
[0989]
[0990] 针对增长速率加速度的第二指数移动平均值的方程组:
[0991]
[0992]
[0993]
[0994]
[0995]
[0996] 如果不利用季节性趋向,则平滑后的增长加速度的初始值为:
[0997]
[0998] 的初始值,其中,q是平均时间间隔(其被缩放到1):
[0999] q≈1
[1000]
[1001] 基于变化速率的线性趋势的去季节性的预报的变化速率:
[1002]
[1003] 针对周末季节性因子和工作日季节性因子的第三指数移动平均值的方程组如下。
[1004] 在周末更新的季节性乘性因子:
[1005]
[1006] τn=τ(tn)=[(tn-t12AM)divΔτ]mod K
[1007] 在工作日更新的季节性乘性因子:
[1008]
[1009] τn=τ(tn)=[(tn-t12AM)div Δτ]mod L
[1010] 在每个季节结束时或者在更新 或 之后(前一种方法效率更高,后一种方法的计算可能太密集),将每个周末因子 和工作日因子 除以归一化因子:
[1011]
[1012] 的初始值:
[1013] 并且Ne为周末e内的样本数量
[1014] 并且Nk为间隔k内的样本数量
[1015]
[1016] 的初始值:
[1017] 并且Nd为日d内的样本数量
[1018] 并且Nl为间隔l内的样本数量
[1019]
[1020] 为了重新平衡周末季节性因子和工作日季节性因子的相对幅度,我们将每个季节性因子 和 除以平均每日度量:
[1021]
[1022] 针对离群值检测的指数移动平均值的方程组(注意, 是一步预报误差残留,设置h=1):
[1023]
[1024]
[1025]
[1026]
[1027] 和 的初始值为0。
[1028] 的初始值,其中,q是平均时间间隔(其被缩放到1):
[1029] q≈1
[1030]
[1031] 当归一化的残差大于Q时,用于检测离群值的表达式:
[1032]
[1033] 对离群值采样点 进行裁剪:
[1034]
[1035] 如果当前样本被裁剪,则应重新计算速率:
[1036]
[1037] 如果不利用季节性趋向,应使用值 来更新平均值:
[1038]
[1039] 如果利用季节性趋向,则根据时间是落在周末内还是落在工作日来使用以下公式之一:
[1040]
[1041] 去季节性的原始增长速率由下式给出:
[1042]
[1043] 使用下式更新移动平均值:
[1044]
[1045] 硬件概述
[1046] 图10是例示了根据本发明实施例可以使用的系统环境1000的组件的简化框图。如所示,系统环境1000包括一个或多个客户端计算设备1002、1004、1006、1008,这些客户端计算设备被配置为操作客户端应用,包括本机客户端应用以及可能地还有诸如web浏览器等
之类的其它应用程序。在各种实施例中,客户端计算设备1002、1004、1006和1008可以与服务器1012进行交互。
[1047] 客户端计算设备1002、1004、1006、1008可以是通用个人计算机(举例来说,包括运行各种版本的Microsoft Windows和/或AppleMacintosh操作系统的个人计算机和/或膝上型计算机)、蜂窝电话或PDA(运行诸如Microsoft Windows Mobile的软件,并启用互联网、电子邮件、SMS、黑莓或其它通信协议)、和/或运行各种市场上课获得的UNIX或类UNIX的操作系统(包括但不限于各种GNU/Linux操作系统)中的任何一个的工作站计算机。可替代地,客户端计算设备1002、1004、1006和1008可以是能够通过网络(例如,下述网络1010)进行通信的任何其它的电子设备,诸如瘦客户端计算机、启用互联网的游戏系统、和/或个人消息传送设备。尽管示例性系统环境1000被示为具有四个客户端计算设备,但是可以支持任何
数量的客户端计算设备。诸如带传感器的设备等之类的其它设备可以与服务器1012进行交
互。
[1048] 系统环境1000可以包括网络1010。网络1010可以是本领域技术人员熟悉的、可以使用各种市场上可获得的协议中的任何一个来支持数据通信的任何类型的网络,所述协议
包括但不限于TCP/IP、SNA、IPX、AppleTalk等。仅以举例的方式,网络1010可以是:局域网(LAN),诸如以太网、令牌环网等;广域网;虚拟网络,包括但不限于虚拟私有网络(VPN);因特网;内联网;公共交换电话网络(PSTN);红外网络;无线网络(例如,运行在IEEE 802.11协议组、本领域中已知的蓝牙协议和/或任何其它的无线协议中的任何一个下的网络);和/或这些和/或其它网络的任何组合。
[1049] 系统环境1000还包括一个或多个服务器计算机1012,所述服务器计算机可以是通用计算机、专用服务器计算机(举例来说,包括PC服务器、UNIX服务器、中档服务器、大型计算机、架装式服务器等)、服务器农场、服务器集群、或任何其它适当的布置和/或组合。在各种实施例中,服务器1012可以适于运行一个或多个服务或软件应用程序。
[1050] 服务器1012可以运行操作系统,该操作系统包括以上所讨论的那些操作系统中的任何一个以及任何市场上可获得的服务器操作系统。服务器1012还可以运行各种附加的服
务器应用程序和/或中间层应用程序中的任何一个,包括HTTP服务器、FTP服务器、CGI服务器、JAVA服务器、数据库服务器等。示例性数据库服务器包括但不限于可从Oracle、
Microsoft、Sybase、IBM等购买到的那些数据库服务器。
[1051] 系统环境1000还可以包括一个或多个数据库1014、1016。数据库1014、1016可以驻留在各种位置。举例来说,数据库1014、1016中的一个或多个可以驻留在服务器1012本地的(和/或驻留在服务器1012上中的)非暂时性存储介质上。可替代地,数据库1014、1016可以远离服务器1012,并且经由基于网络的或专用的连接与服务器1012进行通信。在一组实施例中,数据库1014、1016可以驻留在本领域技术人员熟悉的存储区域网络(SAN)中。类似地,用于执行归于服务器1012的功能的任何必要的文件可以视情况被存储在服务器1012本地
和/或被远程地存储。在一组实施例中,数据库1014、1016可以包括适于响应于SQL格式化命令来存储、更新和检索数据的关系数据库,诸如由Oracle提供的数据库。
[1052] 图11是根据本发明的实施例可以使用的计算机系统1100的简化框图。例如,服务器1012或客户端1002、1004、1006或1008可以使用诸如系统1100的系统来实现。计算机系统
1100被示为包括可以经由总线1124电耦接的硬件元件。硬件元件可以包括一个或多个中央
处理单元(CPU)1102、一个或多个输入设备1104(例如,鼠标、键盘等)、以及一个或多个输出设备1106(例如,显示设备、打印机等)。计算机系统1100还可以包括一个或多个存储设备
1108。举例来说,存储设备1108可以包括可编程的、可闪存更新等的设备,诸如盘驱动器、光学存储设备以及固态存储设备(诸如随机存取存储器(RAM)和/或只读存储器(ROM))。
[1053] 计算机系统1100可以另外包括计算机可读存储介质读取器1112、通信子系统1114(例如,调制解调器、网卡(无线或有线)、红外通信设备等)以及工作存储器1118,工作存储器1118可以包括如上所述的RAM和ROM设备。在一些实施例中,计算机系统1100还可以包括
处理加速单元1116,其可以包括数字信号处理器(DPS)、专用处理器等。
[1054] 计算机可读存储介质读取器1112可以进一步连接到计算机可读存储介质1110,一起(以及可选地,与存储设备1108组合)综合地表示远程的、本地的、固定的和/或可移动的存储设备加上用于临时和/或较永久地包含计算机可读信息的存储介质。通信系统1114可
以允许与网络1010和/或关于系统环境1000的上述任何其它计算机交换数据。
[1055] 计算机系统1100还可以包括被示为当前位于工作存储器1118内的软件元件,包括操作系统1120和/或其它代码1122,诸如应用程序(其可以是客户端应用程序、Web浏览器、中间层应用程序、RDBMS等)。在示例性实施例中,工作存储器1118可以包括用于如上所述的趋势预报的可执行代码和相关联的数据结构。应意识到,计算机系统1100的可替代实施例
可以具有上述实施例的许多变型。例如,也可以使用定制的硬件,和/或可以用硬件、软件(包括便携式软件,诸如小应用程序(applets))或这两者来实现特定元件。此外,可以利用与诸如网络输入/输出设备之类的其它计算设备的连接。
[1056] 用于包含代码或代码部分的存储介质和计算机可读介质可以包括本领域中已知或使用的任何适当的介质,包括存储介质和通信介质,诸如但不限于以用于存储和/或传输信息(诸如计算机可读指令、数据结构、程序模块或其它数据)的任何方法或技术实现的易
失性和非易失性(非暂时性)、可移动和不可移动的介质,包括RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光学存储器、磁盒、磁带、磁盘储存器或其它磁性存储设备、数据信号、数据传输、或可以用于存储或传输期望信息并且可以被计算机访问的任何其它介质。
[1057] 尽管已经描述了本发明的具体实施例,但是各种修改、变更、替代构造和等同也包含在本发明的范围内。本发明的实施例不限于某些具体数据处理环境内的操作,而是自由地在多种数据处理环境内操作。此外,尽管已经使用特定的一系列处理和步骤描述了本发
明的实施例,但是本领域技术人员应明白,本发明的范围不限于所描述的一系列处理和步
骤。
[1058] 此外,虽然已经使用硬件和软件的特定组合描述了本发明的实施例,但是应认识到,硬件和软件的其它组合也在本发明的范围内。本发明的实施例可以仅用硬件实现,或者仅用软件实现,或者使用它们的组合实现。
[1059] 因此,本说明书和附图要从例示性、而非限制性的意义上来看待。然而,将显而易见的是,在不脱离更宽泛的精神和范围的情况下,可以对其进行添加、删减、删除以及其它修改和改变。