1、首先,需要make sure我们的性能测试的target是合适的。用户如何使用我们的系统,也是用户的使用模型。确定我们的性能测试确实是cover了大多数用户的使用模型。这是性能瓶颈分析的前提,以免浪费时间和精力。

  2、得出一个task性能数据,接下来需要做task分解。一个task在CPU或者多个主机上执行,无非是串行task和并行task。对于串行执行的任务好说,每个sub task的执行时间是多少,多者既瓶颈所在,需要对它优化。并行也好说,总体的性能既是所有并行的sub task中耗时长的那一个,它既是瓶颈,需要对它优化才能提高整体性能。

  如果一个task既串行,有并行,相互交织,相互混杂。那只有像庖丁解牛一样,逐级划分,直到变成并行和串行的sub sub sub task。然后可以得出task的总的耗时和这些sssssub task的执行时间的数学关系。瓶颈定位变成数学公式,看起来简单了是吧。

  3、第2条是针对一个测试性能数据而言的。如果很多的测试用例走了不同的分支,既不同的sub task,使得按照2得到不同的公式,问题变成如下的:

  TC1 Perf Bottleneck = F1(sub1, sub2, sub3,...)

  TC2 Perf Bottleneck = F2(sub1, sub2, sub3,...)

  TC3 Perf Bottleneck = F3(sub1, sub2, sub3,...)

  TC4 Perf Bottleneck = F4(sub1, sub2, sub3,...)

  ...

  也是说终系统的性能在不同的测试用例的情况下,得到的和sub task的关系是不一样的。那么如果我们需要提高整个系统的总体性能,也是找到谁才是需要被优化的sub task,我们还是的回到用户模型。针对用户模型的时间分析,我们可以得出每个test case的用户使用概率百分比。例如:TC1 10%,TC2 40%, TC3 10%, TC4 20%。有了这样的数据,带入F1,F2,F3和F4,大致可以搞清楚哪些sub task是主要的瓶颈。

  4.此外,还需考虑task只能到底耗费的是什么资源,是CPU,是harddisk,是网络带宽。这个取决于你的task划分的粒度以及对每个sub task实现细节的了解。