2.8 统计
理解如何使用统计并且了解统计的局限性是很重要的。本章讨论的是用统计(指标)的方法量化性能问题,统计的类型包括平均值、标准方差,以及百分位数。
2.8.1 量化性能
要比较问题和对于问题排优先级,需要对问题和问题修复后所带来的性能的潜在提升做量化。这件事情一般用观测或者实验的方式做。
基于观测
用观测法量化性能问题:
1.选择可靠的指标
2.估计解决问题带来的性能收益
举个例子如下。
● 观测到:应用程序请求需要10ms 的时间。
● 观测到:其中,9ms 是磁盘I/O。
● 建议:配置应用程序将I/O 缓存到内存里,预期DRAM 的延时将在10μs 左右。
● 估计性能收益:10 ms → 1.01 ms (10 ms - 9 ms + 10 μs)大约为9 倍的收益。
在2.3 节里介绍过,延时就是一个很适合做量化的指标,可以在不同的组件之间做比较,也适合进行计算。
当要测量延时时,应确保是作为应用程序请求的一个同步组件来计时的。有些事件是异步发生的,如后台磁盘的I/O(数据写回磁盘),这些都不直接影响应用程序的性能。
基于实验
用实验来量化性能问题:
1.实施修复
2.用可靠的指标量化做前后对比
举个例子如下。
● 观测到:应用程序事务平均延时10ms。
● 实验:增加应用程序线程数,允许更多的并发,减少排队。
● 观测到:应用程序事务平均延时2ms。
● 性能增益:10 ms → 2 ms = 5 倍。
如果在生产环境做此类实验代价很高昂的话,这种方法就不适合了!
2.8.2 平均值
平均值就是用单个数据代表一组数据:数据集中趋势的指标。最常见的平均值类型是算术平均值(或者简称平均),就是数据的总值除以数据的个数。其他的均值类型还有几何平均值和调和平均值。
几何平均值
几何平均值是数值乘积的n 次方根(n 是数值的个数)。[Jain 91]有论述,还包含一个网络性能分析的例子:如果内核网络栈的每一层的性能提升都能分别测量出来,那么平均的性能提升是多少?由于网络的各层是共同作用于同一个包的,因此性能提升会有“相乘”的效果,那么用几何平均值来求解是最好的。
调和平均值
调和平均值是数值的个数除以所有数值的倒数之和。这种平均方法更适用于利用速率求均值,例如,计算传输800 MB 数据的平均速率,当第一个100 MB 以50 MB/s 传输,剩下的700MB按10 MB/s 的门限传输时,答案是采用调和平均值,800/(100/50 + 700/10) = 11.1 MB/s。
随着时间变化的平均值
在性能度量中,很多我们研究的指标都是随着时间变化的平均值。CPU 不会永远处在“50%的使用率”,而是在某些时间间隔内50%的时间CPU 处于使用,该时间间隔可以是一秒、一分钟,或者一小时。每当涉及平均值的时候,有必要确认一下时间间隔的长度。
举个例子,顾客有一个由CPU 饱和(调度器延时)造成的性能问题,但是他们的监测工具显示CPU 使用率从来没有超过80%。该监测工具显示的是5 分钟内的平均值,掩盖了CPU 在该周期内有持续几秒钟的100%的使用率的事实。
衰退均值
衰退均值偶尔会在系统性能中使用。例子有uptime(1)所汇报的系统“负载均值”,和基于Solaris 的系统的每个进程的CPU 使用率。
衰退均值也是用时间间隔测量,但是最近时间的权重要比之前时间的权重高。这样做减小(衰减)了短期波动给平均值带来的影响。
关于这一内容的更多信息可参考第6章的6.6 节中的负载均值部分。
2.8.3 标准方差、百分位数、中位数
标准方差和百分位数(例如,第99 百分位数)是提供分布数据信息的统计技术。标准方差度量的是数据的离散程度,更大的数值表示着数据偏离均值(算术平均值)的程度越大。第99百分位数显示的是该点在分布上包含了99%的数值。图2.21 显示的是正态分布,有最小值和最大值。
图2.21 统计数值
诸如第99、第90、第95 和第99.9 百分位数都会在请求延时的性能监测时使用,对请求分布的最慢部分做量化。这些也可以用在服务水平协议(SLA)中,作为大多用户所能接受性能的衡量方法。
第50 百分位数,叫做中位数,用以显示数据的大部分在哪里。
2.8.4 变异系数
标准方差是相对平均值而言的,当同时考虑方差和平均值时,变异就可以理解了。单独的标准方差50 能告诉我们的很少,加上一个平均值200 能告诉我们的就很多了。
还有一种方法是用一个指标表示变异的程度:标准方差相对于平均值的比例,称为变异系数(CoV 或CV)。对于上述例子,CV 是25%。更小的CV 意味着数据更小的变异。
2.8.5 多重模态分布
前一节中有一个问题很明显:平均值、标准方差,以及百分位数都是针对正常分布或者说是单模态分布而言的。系统性能常常出现双模态的情况,对快速的代码路径是低延时、缓慢的代码路径是高延时的,或者对于缓存命中的情况是低延时、缓存失效的情况是高延时,也会有多于两种模态的情况。
图2.22 显示的是读写混合(包含随机I/O 和顺序I/O)的工作负载下,磁盘I/O 延时的分布情况。
图2.22 延时分布
直方图显示了两个模态。最左侧的模态是小于1ms 的延时,这是磁盘缓存命中的情况。右侧的在7ms 处有一个峰值,是磁盘缓存失效的情况:随机读。I/O 延时的平均值(算术平均)是3.3ms,用垂直的线绘出。这个平均值并不是中心趋势的指向(像之前所述的那样),实际上,恰恰相反。对于这个分布,平均值这个指标有严重的误导性。
有人在渡平均深度6 英寸的河流时淹死。
W.I.E.盖茨
每当你看到性能指标中的平均值,尤其是平均延时的时候,要问一下:分布是什么样的?在2.10 节中有另一个例子,展示如何有效地用各种图和指标来显示分布。
2.8.6 异常值
统计的另一个问题是异常值的存在:有非常少量的极其高或低的数值,看起来并不符合所期望的分布(单一模态或多重模态)。
磁盘的I/O 延时的异常值就是一个例子——当大多数磁盘I/O 在0 和10ms 之间时,很偶然的情况磁盘I/O 会出现超过1000ms 的延时。像这样的异常延时会导致严重的性能问题,但是这些异常值的存在,除了最大值,很难用常用的指标类型识别出来。
对于正态分布,异常值的存在很可能会让平均值偏移一点,但是对中位数没什么影响(此点考虑可能有用)。用标准方差和第99 百分位数能更好地识别异常值,但这还要取决于异常值出现的频率。
要更好地了解多重模态分布、异常值,以及其他复杂但是常见的现象,要用诸如直方图这样的办法来审视分布的整体情况。关于做这件事情更多的方法,可参考2.10 节。