文章想要实现非侵入式的性能异常检测。非侵入式是通过读log实现的。 性能异常检测(我理解应该是没有根因分析或者ranking)则是通过log内的信息去reconstruct workflow。 非侵入式根据log推断objects之间的关系,针对这个关系和时间来推断性能异常。亮点在于关系的定义和处理上,但是objects和type的提取比较工程。 该算法输出一个系统堆栈结构(S3)图--一个有向无环图(DAG)。 其中每个节点代表一个对象类型,每个有向边捕获一个高级对象类型(父)和一个低级对象类型(子)之间的层次关系。
基于一个原则-Flow Reconstruction Principle:log里面的信息足够。
主要包括几个步骤
- 从log信息里提取object identifiers
- 将object identifiers和type关联起来
- 监测object type之间的关联关系
- 确定specific object instances(这个就是在已有关联关系的基础上得到类似Section 2的图)
- 确定execution structure和objects之间的层次结构
System Stack Structure Graph
主要就是说明如何构建System Stack Structure的。
ID parsing:拿到比如machine IP、process ID、thread ID和文件名等
type:比如是一个process、thread、IP、hostname。具体就是用一些启发式的方法,比如在identifiers上下文找。 注意:只是做区分,并不需要了解语义。
correlation:定义correlated:两个objects出现在同一个log里面。subsumes:一种特殊关系,i与j有关,j不和任何同类型的相关。 此外,还进一步细分,得到type-relation graph,除了empty之外有correlation的objects之间连边:
- empty:没出现在一起
- 1:1:近似与等价,就是两个object强相关,出现在一起。比如IP和Host,在没有remapping的情况下
- 1:n:比如fork这个过程。
- m:n:存在一些复用。
精度:需要log够多,精度才高。
生成System Stack Structure,输入是事件和type-relation graph,主要是三步:
- 合并1:1的nodes
- 处理m:n的nodes:处理方法是增加信息。也就是通过扩大来减少可能的模糊信息。比如只看TID(线程ID)没有用,但是一条log里面如果有TID,也会有PID和host。这个加起来就有意义了
- Filter non-objects:有一些节点仅仅只是别的node的并集,且这些子集node不相交,那就把这些并集删掉。
Implementation
比较工程。
Evaluation
回答了几个问题
- 系统能减少用户多少时间:叫了14个工程师来用
- 现实世界中是否满足Flow Reconstruction Principle:分析日志与objects之间的关系,发现几乎所有的日志都包括至少一个object
- 创建的关系精确度:得到图之后手动分析,精确度96%