Non-Intrusive Performance Profiling for Entire Software Stacks Based on the Flow Reconstruction Principle

文章想要实现非侵入式的性能异常检测。非侵入式是通过读log实现的。 性能异常检测(我理解应该是没有根因分析或者ranking)则是通过log内的信息去reconstruct workflow。 非侵入式根据log推断objects之间的关系,针对这个关系和时间来推断性能异常。亮点在于关系的定义和处理上,但是objects和type的提取比较工程。 该算法输出一个系统堆栈结构(S3)图--一个有向无环图(DAG)。 其中每个节点代表一个对象类型,每个有向边捕获一个高级对象类型(父)和一个低级对象类型(子)之间的层次关系。

基于一个原则-Flow Reconstruction Principle:log里面的信息足够。

主要包括几个步骤

  1. 从log信息里提取object identifiers
  2. 将object identifiers和type关联起来
  3. 监测object type之间的关联关系
  4. 确定specific object instances(这个就是在已有关联关系的基础上得到类似Section 2的图)
  5. 确定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%